Как программно настроить цветовую температуру изображения? - Фотопедия
7 голосов
/ 20 мая 2011

Мне интересно, как программно преобразовать (т. Е. С помощью языка программирования, а не редактора) из одной цветовой температуры в другую?

Если, например, я сделаю предположение (и это большое предположение), что алгоритм баланса белого может взять обработанное изображение (например, JPEG и т. Д.) И поместить общую температуру в сцене на 6500, как бы алгоритмически «охладить» или «прогреть» сцену до определенной температуры?

Очевидно, что это обычная операция в программе редактирования изображений, но обычно она работает с изображениями RAW, к которым не применяется обработка (манипулирование цветовым пространством или иное). В случае файлов RAW, возможно, отдельные файлы RAW содержат достаточную информацию (в заголовке файла) относительно калибровки цвета датчика камеры, чтобы сделать конкретное преобразование температуры более детерминированным?

Кстати, я задал этот вопрос на обычном переполнении стека , и было предложено получить лучший ответ здесь.

Ответы [ 3 ]

6 голосов
/ 20 мая 2011

Вам потребуется выполнить преобразование белой точки в цветовое пространство в пространстве L * a * b *. Большинство цветовых моделей, с которыми мы обычно работаем, в первую очередь RGB, но часто CMYK, разработаны с учетом ограничений и требований физического оборудования. Эти модели обычно не очень хорошо представляют «воспринимаемое» цветовое пространство, и белая точка определенно является перцептивным аспектом цвета.

Всякий раз, когда вам необходимо применить воспринимаемые корректировки к изображению, такие как цветовая температура или смещение оттенков, лучше всего это сделать путем преобразования из RGB в XYZ, и во время преобразования вы можете применить «опорные белые точки» для источника и целевое цветовое пространство. Преобразование из XYZ в Lab затем приводит вас в цветовое пространство, где вы можете перцептивно переназначить белую точку и все цвета так, чтобы они сохраняли непрерывность.

Преобразования цветового пространства, хроматическая адаптация, настройки точки белого и т. Д. Математически довольно сложны. Чем точнее вы воспринимаете точность, тем сложнее математика обычно заканчивается. Отличный источник информации для преобразования цветового пространства можно найти на сайте Брюса Линдблума . Некоторую дополнительную полезную информацию можно найти в Wikipedia . Вы также можете найти эту информацию полезной для CIE D-Series Illuminants , поскольку она содержит информацию, вычисленную и постоянную для белой точки.

3 голосов
/ 14 мая 2015

Баланс белого - это очень прямая манипуляция с изображениями. Это просто усиление на канал в линейном пространстве RGB. Файлы JPG неоптимальны для выполнения баланса белого, поскольку они обычно имеют как кривую тона, так и функцию электрооптического преобразования (EOTF) обратного монитора, применяемую для разрыва линейной зависимости со значениями яркости сцены. Вот почему это обычно делается, начиная с RAW-данных. Если вы можете получить линейные значения RGB либо с помощью данных RAW, либо с помощью инверсии нелинейности, описанной выше, вы можете выполнить баланс белого, применив следующее.

R_out = R_in * R_gain
G_out = G_in
B_out = B_in * B_gain

Обратите внимание, что условно не применять усиление к зеленому каналу, так как очень приблизительно относится к яркости, и изменение всех трех каналов также сместит общую экспозицию.

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

Как только усиление применено, должна применяться первичная матрица кодирования, кривая воспроизведения целевого тона и обратный EOTF.

2 голосов
/ 13 мая 2015

У меня была великолепная фотография женщины, которую я сфотографировал под странным, сложным освещением (натриевые и ртутные лампы). Отличная улыбка, отличная фокусировка, отличная картинка, за исключением пути, цвета.

Я в течение часа манипулировал с темпом / оттенком в Adobe Camera Raw, но безрезультатно. Я написал программу для взлома XMP-файла коляски, меняющего температуру и затем создающего символическую ссылку на исходный NEF с именем, параллельным файлу XMP.

Это НЕ так причудливо и технически неправильно, как приведенный выше ответ, но вместо этого бросает огромное количество ЦП на проблему и дает некоторые (возможно) интересные результаты.

Это создает кучу ссылок на файлы .NEF и настоящий файл .XMP для каждой из них. Просто скопируйте настоящий файл со списком nef / xmp, чтобы клонировать его в тестовый каталог, и установите min / max temp и dif_temp (Кельвины между клонами). Другой цикл может быть вставлен для изменения значения оттенка с постоянной Кельвина, но сгенерированные файлы будут умножены на количество оттенков.

Запустите файл Photoshop -> scripts -> image_processor, укажите его в этом каталоге, и он создаст настоящий tif / jpg / что угодно для каждой ссылки с заданной цветовой температурой.

Этот код является Грязным, Уродливым Хаком, и его запуск, вероятно, растопит ваш процессор, привлекая шариковую молнию и пчел-убийц в непосредственной близости. Нет гарантии, само собой разумеется.

Требуется Perl (обязательно используется ежедневно) и mklink (может присутствовать).

sub color_temp_experiment()  {
$nef = '6s-2014.1004-237695.acl.nef'; 
$xmp = '6s-2014.1004-237695.acl.xmp';  # crs:Temperature="6000"
$min_temp = 7800;
$max_temp = 9000;
$dif_temp = 200;   # Difference in temp per loop.
$xd = `cat $xmp`;  # Xmp Data;
($base = $nef) =~ s/\.nef//;  # Basename common to both nef and xmp.
$ii = -1;
for($temp = $min_temp; $temp <= $max_temp; $temp += $dif_temp)  {
    $ii++;
    $link = $base . ".$temp" . 'k.nef';  # Abuse Kelvins with lower case.
    $xfn  = $base . ".$temp" . 'k.xmp';  # Abuse Kelvins with lower case.
    if(-f $link)  {
        print("Found FILE (s/b sym link!) $link. Next!\n");  # This prints!
        next;
    }
    $cmd = "mklink $link $nef";
    printf("$ii) Cmd = $cmd\n");
    $sto = `$cmd`;
    unless(-f $link)  {
        print("ERROR! Sym link $link not found!\n StdOut=<<$sto>>\n\n");
        exit;
    }
    ($xt = $xd) =~ s/crs:Temperature="\d+/crs:Temperature="$temp/ms;
    open(O, ">$xfn");
    print(O "$xt");
    close O;
}

}

Добро пожаловать на сайт Фотопедия, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...