Дано: набор координат цветности xy для базовых стимулов RGB и точки белого; например, такой набор хранится в блоке аппаратных данных монитора (EDID). Надо: получить набор полных координат Yxy/XYZ.
Сначала мне показалось, что задача имеет единственное решение — благодаря ограничению на то, что исходные данные являются не просто абстрактными величинами, а представляют набор базовых стимулов, где R+G+B=W (по всем трём координатам XYZ), причём абсолютная яркость нам не важна (Yw:=1 или Yw:=100). Итого имеем 3 неизвестных и 3 уравнения, так что исключаются все степени свободы в смешении базовых стимулов для получения белого. Но в том-то и дело, что несмотря на кажущую однозначность формул и удовлетворение всем требованиям, результаты не совпадают с известными данными, например, для Adobe RGB или sRGB. Может, кто сообразит, где у меня ошибка в логике?
Итак, суть алгоритма.
Для удобства, можно воспользоваться приложенной экселевской табличкой. Вбейте туда какие-нибудь известные данные (например, отсюда), и убедитесь, что расчётная яркость не соответствует стандартному значению, хотя и проходит все логические проверки.
Сначала мне показалось, что задача имеет единственное решение — благодаря ограничению на то, что исходные данные являются не просто абстрактными величинами, а представляют набор базовых стимулов, где R+G+B=W (по всем трём координатам XYZ), причём абсолютная яркость нам не важна (Yw:=1 или Yw:=100). Итого имеем 3 неизвестных и 3 уравнения, так что исключаются все степени свободы в смешении базовых стимулов для получения белого. Но в том-то и дело, что несмотря на кажущую однозначность формул и удовлетворение всем требованиям, результаты не совпадают с известными данными, например, для Adobe RGB или sRGB. Может, кто сообразит, где у меня ошибка в логике?
Итак, суть алгоритма.
- Исходные данные обозначаем (xW,yW), (xR,yR), (xG,yG), (xB,yB).
- Фиксируем Yw на любом значении; ну, кроме нуля.
- Промежуточные величины:
- X'w = xW/yW, ……………, X'b = xB/yB
- Z'w = (1 – xW – yW)/yW, ……………, Z'b = (1 – xB – yB)/yB
- Вспомогательные величины:
- a = (X'w – X'b) / (X'r – X'b)
- b = (X'g – X'b) / (X'r – X'b)
- Длинные выкладки, как я дошёл до жизни такой, опущены.
- Конечный результат:
- Yg = Yw * (Z'w – a*Z'r – (1–a)*Z'b) / (Z'g – b*Z'r – (1–b)*Z'b)
- Yr = a*Yw – b*Yg
- Yb = Yw – Yr – Yg
- Всё, телемаркет.
Для удобства, можно воспользоваться приложенной экселевской табличкой. Вбейте туда какие-нибудь известные данные (например, отсюда), и убедитесь, что расчётная яркость не соответствует стандартному значению, хотя и проходит все логические проверки.