Установка цветовой температуры для данного изображения (как в Photoshop)

Мне было поручено установить цветовую температуру в диапазоне от 1000 до 10.000, как в Photoshop. Пока мне удалось найти только таблицу, которая показывает значения здесь I пытался найти ту же функцию в GIMP (так как это открытый исходный код, и я бы узнал, читая код), но прямого эквивалента ей нет. Мне нужно выбрать уровни цвета и согнуть несколько кривых. Мне сказали, что заказчик хочет установить значения так же, как в Photoshop. Может ли кто-нибудь указать правильное направление для создания шкалы?

Изменить: ссылка исправлена.


person Celal Ergün    schedule 09.08.2012    source источник


Ответы (1)


Вы уже нашли таблицу эквивалентов 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К.

Исходный2500K 9500K

person Mark Ransom    schedule 09.08.2012
comment
Спасибо за ответ. Думаю, я ошибся при встраивании html. Здесь должно быть одно высказывание :) - person Celal Ergün; 09.08.2012