Я написал lib для работы с цветами и застрял, пытаясь вычислить Tc(k)
. Из того, что я читал, работая в цветовом пространстве CIE 1931 XYZ
можете найти его, и его можно получить с помощью xyY
.
До сих пор я получил все правильно, чтобы понять правильные x
и y
:
XY x = ____________ y = ____________ ( X + Y + Z) ( X + Y + Z)
Цифры значительно до графика, но не могут найти что-либо подробное, как вы переходите от x
и y
к Tc(K)
например: для # FF0000 я получаю следующее.
x: 0.64007449945677 y: 0.32997051063169
Я прочитал ряд статей по этой теме и перечислил все статьи в Википедии. Все вопросы, которые я встречал на SO, просто ссылаются на статью wiki о цветах, а не на той, которая имеет фактическую формулу для вычисления Tc(k)
Если я правильно вас понимаю, см. Этот pdf-документ, где описано несколько методов (кратко :(). Из этого PDF:
[CCT1] Расчеты выполняются с использованием однородных цветовых пространств CIE 1960 u и v. Координаты u и v получены из x и y, используя формулы: u = 4x / (12y-2x + 3) и v = 6y / (12y- 2x + 3) Корреляционная цветовая температура определяется как температура черного тела, которая находится ближе всего к координатам u, v тестового источника. Два отдельных метода дают результаты: один – это итеративный метод, основанный на определении, а другой – широко используемый метод Робертсона, включающий интерполяцию на основе таблицы из 30 предварительно рассчитанных параметров u, v и обратного склона. Итерация Если uS и vS являются значениями для тестового источника, а uT и vT – значения черного тела при температуре T, коррелированная цветовая температура представляет собой значение T, где:
sqrt( (uS - uT)^2 + (vS - vT)^2 )
минимизируется. Регулировка температуры T для получения минимума этой функции проводилась с использованием электронных таблиц (Quattro Pro 8 и Excel 97). Обе таблицы дали одинаковые значения.
Не знаю, действительно ли это помогает вам.
Я сделал некоторые копания в некоторых приложениях с открытым исходным кодом и нашел что-то в UFRaw. Я не совсем понял, что происходит.
Также найден документ, который, похоже, хорошо освещает эту тему.
Преобразован в php, и это то, что у меня есть до сих пор:
$temp = array(9500, 7000, 5500, 3750, 3000, 2700, 2250, 1800, 1500); $hex = array('9DBEFF', 'E4EEFF', 'FFE4BE', 'FFA04C', 'FF7A26', 'FF6A19', 'FF500B', 'FF3403', 'FF2300'); echo '<h3>K -> RGB</h3>'; foreach ($temp as $k) { $rgb = ColourConverter::temperature2rgb($k); echo sprintf('<div style="background-color:rgb(%s); text-align: center; width: 100px; height: 25px; clear: both;">%s</div>', implode(', ', $rgb), $k); } echo '<h3>RGB -> K</h3>'; foreach ($hex as $v) { $rgb = array_values(ColourConverter::hex2rgb($v)); $k = round(ColourConverter::rgb2temperature($rgb[0], $rgb[1], $rgb[2])); echo sprintf('<div style="background-color:rgb(%s); text-align: center; width: 100px; height: 25px; clear: both;">%s</div>', implode(', ', $rgb), $k); }
Мой выход:
Довольно близко, но не на 100%. (Нашел ошибку в моем коде, и теперь она почти идеальна)
Линия UFRaw ~ 234
мое преобразование php
Основываясь на статье в Википедии, я ввел приблизительную формулу для расчета Color Temperature
в Excel как
=(-449*((R1-0,332)/(S1-0,1858))^3)+(3525*((R1-0,332)/(S1-0,1858))^2)-(6823,3*((R1-0,332)/(S1-0,1858)))+(5520,33)
R1 is color space x coordinate from 0 to 1 S1 is color space y coordinate from 0 to 1
Работает отлично!
В Википедии указано, что цветовая температура рассчитывается с учетом цветности uv, а не xy, поэтому вам нужно выполнить перевод. Тем не менее, я рекомендую использовать приближение (также объясненное в Википедии), как это было предложено @sixlettervariables.
Реальный вопрос в том, что вы пытаетесь найти цветовую температуру ?. Я вижу ссылку (# FF0000) на цвета RGB, которые бессмысленны без указания цветового пространства. Предположим, что вы находитесь в sRGB (так что я могу снова указать вам на Wikipedia ), вам нужно сначала получить линейные координаты RGB, прежде чем перейти к XYZ.