Рассчитать цветовую температуру в К
Я написал lib для работы с цветами и застрял в попытке вычислить Tc(k)
. Из того, что я прочитал, работает в CIE 1931 XYZ
Цветовое пространство - это путь, и его можно получить, используя xyY
.
До сих пор я получил все правильно, чтобы понять правильные x
и y
из:
X Y
x = ____________ y = ____________
( X + Y + Z) ( X + Y + Z)
Цифры значительно до графика, но не могут найти ничего подробного о том, как вы переходите от x
и y
до Tc(k)
![enter image description here]()
например: для # FF0000 я получаю следующее.
x: 0.64007449945677
y: 0.32997051063169
Я прочитал ряд статей по этой теме и перечислил все статьи в Википедии. Все вопросы, которые я встречал на SO, просто ссылаются на статью wiki о цветах, а не на ту, у которой есть фактическая формула для вычисления Tc(k)
Ответы
Ответ 1
Я сделал некоторые копания в некоторых приложениях с открытым исходным кодом и нашел что-то в UFRaw. Я не совсем понял, что происходит точно.
Также найден paper, который, похоже, хорошо освещает эту тему.
Преобразован в 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);
}
![Reference]()
Мой вывод:
![output]()
Довольно близко, но не на 100%. (В моем коде найдена ошибка, и теперь она почти идеальна)
- Цвета слегка отходят от k → rgb
- Это не работает, делая k → rgb → k. Вы не возвращаетесь к тому же значению.
Код
строка UFRaw ~ 234
мое преобразование php
Ответ 2
Если я правильно вас понимаю, см. этот 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). Обе таблицы дали идентичные значения.
Не знаю, действительно ли это помогает вам.
Ответ 3
На основании статьи в Википедии я ввел приближенную формулу для вычисления 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
Прекрасно работает!
Ответ 4
В Википедии указывается, что цветовая температура рассчитывается с учетом цветности u-v, а не x-y, поэтому вам нужно выполнить перевод. Тем не менее, я рекомендую использовать приближение (также объясненное в Википедии), как было предложено @sixlettervariables.
Реальный вопрос: что вы пытаетесь найти в цветовой температуре?. Я вижу ссылку (# FF0000) на цвета RGB, которые бессмысленны без указания цветового пространства. Предположим, что вы находитесь в sRGB (поэтому я могу указать вам в Википедии снова), вы должны сначала получить линейные координаты RGB, прежде чем перейти к XYZ.
Ответ 5
Я понимаю, что это старый вопрос, но я тоже пытался найти ответ. Я, наконец, наткнулся на этот отличный калькулятор, который также публикует формулу следующим образом:
n = (x-0,3320)/(0,1885-y)
CCT = 437 * n ^ 3 + 3601 * n ^ 2 + 6861 * n + 5517
Надеюсь, это поможет любому, кто все еще смотрит.