Рассчитать цветовую температуру в К

Я написал 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%. (Нашел ошибку в моем коде, и теперь она почти идеальна)

  • Цвета слегка отходят от k -> rgb
  • Это не работает, делая k -> rgb -> k. Вы не возвращаетесь к тому же значению.

Код

Линия 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.