Подтвердить что ты не робот

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

Я написал 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)

4b9b3361

Ответ 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

Надеюсь, это поможет любому, кто все еще смотрит.