Вы уже нашли таблицу эквивалентов RGB для каждой цветовой температуры, но не сказали где, поэтому я нашел свою: http://www.vendian.org/mncharity/dir3/blackbody/
Естественная сцена отражает свет пропорционально цвету падающего на нее света. Это означает, что простой линейный перевод должен дать желаемый эффект. Если мы предположим, что существующее изображение уже сбалансировано по белому, так что чистый белый равен (255,255,255), то это просто вопрос умножения каждого из значений r, g, b в каждом пикселе на пропорции, соответствующие цветовой температуре.
Вот пример кода на Python. Умножение производится косвенно с помощью матрицы.
from PIL import Image
kelvin_table = {
1000: (255,56,0),
1500: (255,109,0),
2000: (255,137,18),
2500: (255,161,72),
3000: (255,180,107),
3500: (255,196,137),
4000: (255,209,163),
4500: (255,219,186),
5000: (255,228,206),
5500: (255,236,224),
6000: (255,243,239),
6500: (255,249,253),
7000: (245,243,255),
7500: (235,238,255),
8000: (227,233,255),
8500: (220,229,255),
9000: (214,225,255),
9500: (208,222,255),
10000: (204,219,255)}
def convert_temp(image, temp):
r, g, b = kelvin_table[temp]
matrix = ( r / 255.0, 0.0, 0.0, 0.0,
0.0, g / 255.0, 0.0, 0.0,
0.0, 0.0, b / 255.0, 0.0 )
return image.convert('RGB', matrix)
Вот пара образцов. Первый - оригинал, за ним следуют выходы на 2500К и 9500К.
person
Mark Ransom
schedule
09.08.2012