Главная > Tools > Как имитировать цвет нагретого абсолютно черного тела в RGB

Как имитировать цвет нагретого абсолютно черного тела в RGB

С преобразованием HSV в RGB я, было дело, уже разобрался. Еще один вопрос, который давно меня волновал — имитация произвольной цветовой температуры источника средствами RGB-светодиодов. На эту тему я тоже гуглил, но результаты были еще скуднее, чем на тему преобразования цветовых пространств. Непонятно почему — то ли этот вопрос больше никого не интересует, то ли я был единственный, кто этого не знал (благо там все относительно просто), то ли еще что. Но, как бы то ни было, я решил заполнить этот вакуум.

Для достижения цели нам понадобится практически только формула Планка. Да, я неспроста привожу ссылку на английскую Википедию — в русскоязычной статье зачем-то приведен вывод этой формулы, который, будем смотреть правде в глаза, мало кому нужен, но опущено то, что интересует нас более всего — различные вариации этой формулы. Нас, разумеется, более всего интересует та, что дает зависимость спектральной плотности мощности от длины волны:

В первом приближении все, что надо сделать, — посчитать соответствующие значения СПМ для интересующей температуры на типичных длинах волн красного, зеленого и синего кристаллов RGB-светодиода и, если мы говорим о применении полученного, просто установить пропорциональную яркость каналов. Должно работать.

Я нагуглил первый попавшийся даташит и взял из него значения 625, 525 и 460 нм, после чего расчехлил Lua и GNUplot, чтобы посмотреть на вид зависимостей.

TRGB

Видно, что исходный динамический диапазон полученных значений, мягко говоря, не мал. Он просто огромен, так что напрямую нормализовывать к [0;255], скорее всего, не стоит. Для начала его стоило бы уменьшить. Я прологарифмировал значения и нормализовал к [0;1] (удобный диапазон, т.к. из него просто преобразовать в какой угодно):

TRGB

Бинго! Видно, кстати, что примерного равенства значения достигают в районе 5200 K — около того, что считается цветовой температурой солнечного света. Это косвенно говорит о том, что все преобразования были сделаны правильно.

Вообще, я пробовал и так, и так. Цвет, полученный из логарифмированных значений, на глаз выглядит более натурально.

Чтобы избавить читателя от поисков значений констант и набивания формул, ниже я привожу немудреный код на Lua, которым были сгенерированы данные для графика выше. При необходимости его можно модифицировать для своих нужд. Сам по себе он генерирует таблицу в формате CSV.

 

N = 36;		-- Normalization coefficients
S = 23;
 
M = 1;		-- Output will be normalized to [0;M]
 
h = 6.62606957E-34;     -- Planck constant
c = 299792458;		-- Speed of light
k = 1.3806488E-23;	-- Boltzmann constant
 
-- Typical RGB LED wavelengths
 
RW = 625E-9;
GW = 525E-9;
BW = 460E-9;
 
function ABB(wl,T)
	-- Planck's law
	return ((2*h*c)/(wl^5))*(1/(math.exp((h*c)/(wl*k*T))-1));
end;
 
-- Calculate radiation power densities
 
T = 800;
 
f = io.open("color_TRGB.csv","w");
 
while T<=8000 do
 
	RI = math.log(ABB(RW,T));
	GI = math.log(ABB(GW,T));
	BI = math.log(ABB(BW,T));
 
	RI=((RI+S)/N)*M;
	GI=((GI+S)/N)*M;
	BI=((BI+S)/N)*M;
 
	f:write(T .. ";" .. RI .. ";" .. GI .. ";" .. BI .. "\n");
 
	T=T+100;
end;
 
f:close();

 

Рубрики:Tools
  1. ACE
    22/11/2014 в 19:00

    Мне тут подумалось, а если сделать наоборот, два одинаковых датчика освещенности с красным и синим светофильтрами, к примеру, от красно-синих стерео очков. Насколько адекватно можно будет измерить цветовую температуру? Я так понимаю, всё зависит от фильтров, насколько их кривая светопропускания близка к глазу. Ну и на чём-то надо будет предварительно откалибровать. Надо попробовать. Датчик у меня есть, а вот очки пока нашёл только красно-зелёные.

    • YS
      22/11/2014 в 19:20

      Боюсь, в смысле точности все будет плохо. Для такого фокуса по идее нужно измерять спектр целиком — поставить призму, ПЗС-линейку, АЦП, ну и дальше математика.

  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s