Ян Владимирович (vladimirovich) wrote,
Ян Владимирович
vladimirovich

This journal has been placed in memorial status. New entries cannot be posted to it.

Калибровка цвета у фотокамеры

Цветовые фильтры в сенсоре камеры отличаются от тех, что в наших глазах, полученный с них цвет хорошо бы привести в нормальный.

Обычно этот вопрос решается так. Берётся цветовая мишень, цвета которой промерены спектрографом и приведены в цветовом пространстве XYZ с учётом освещения каким-нибудь стандартным источником света, например D65. Под таким же освещением можно сфотографировать и саму мишень. По полученным данным можно построить профиль для преобразования цветов камеры в цвета мишени.


Отметим сразу, что данную задачу можно решить лишь приближенно. Цвета, которые видит глаз как разные, камера может передавать как одинаковые.

На практике возможности вообще ограничены теми, которые заложены в стандарт цветовых профилей icc. Существует два типа профилей, матричные и табличные. Матричные позволяют настроить параметр gamma коррекции, и координат для черной, красной, синей, зелёной и белой точек в XYZ пространстве. Все остальные цвета получаются линейным натягиванием на этот скелет. Табличные устроены сложнее, и в конечном итоге позволяют построить любую зависимость, правда, с ограниченной точностью по цвету.

Простейшая мишень, например, Сolorchecker 24, вполне доступна, но есть и другой, более общий способ</a>. Если известны спектральные отклики трех RGB фильтров, то фотографирование мишени можно симулировать.

В настоящее время фирма Canon, к несчастью, не предоставляет данных по спектрам пропускания RGB фильтров их фотоаппаратов (а могла бы! Фирма Kodak, например, совершенно официально предоставляет эти данные).

Поэтому на помощь приходят астрономы. Им измерение спектра может рассказать о строении звёзд, а любительская астрономия делается теми же камерами и матрицами, что и любительская фотография.

Собственно, спектры пропускания фильтров для разных камер Canon были найдены на сайте Кристиана Бьюи (Christian Buil), вот, например, для камеры Canon 5d mark II:


На самой странице, правда, только графики. Если применить мозг, то можно выйти на числовые данные.

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

Итак, какой план? Во-первых, симулировать фотографию опорных красок мишени. Во вторых, предоставить это в формате ti3 для Argyll CMS, и на выходе получить профиль icm.

Для начала, берутся данные спектра какой-либо краски p. На практике рассматривался диапазон от 360 до 830 нм с шагом 5 нм:

p360
p365

p830


Эту краску мы будем пытаться точно передать, с учётом спектра света L. Спектр поэлементно умножается на спектр света, получаем новые значения.

l360·p360
l365·p365
...
l830·p830


Потом – на три спектра стандарта XYZ, и полученные значения суммируются:

Xp,l=x360·l360·p360+x365·l365·p365+...


Таким же образом считаем Yp,l и Zp,l. Всё, у нас есть цвет краски в пространстве XYZ! Аналогично, считаем для симуляции фотокамеры. Единственное, поскольку у нас в конвертере применяется гамма коррекция 2,2, то не забываем возвести всю сумму в степень 1/2,2:

Rp,l=(r360·l360·p360+r365·l365·p365+...)1/1,2


Проводим такой расчёт для некого набора опорных красок. Отдельно рассмотрим “идеально белую” краску – по ней можно будет откалибровать баланс белого для камеры и для наших XYZ значений. Баланс белого для камеры достигается просто умножением каждого канала на коэффициент, необходимый чтобы белый цвет имел максимальные значения RGB (в Argyll используется яркостная шкала от 0 до 100, а не от 0 до 255).

Для XYZ значений баланс белого калибруется немножко сложнее. Хороший способ описал Иоганн Крис: нужно преобразовать в цветовую систему LMS, провести домножение на коэффициенты в ней, и сделать обратное преобразование LMS -> XYZ. В результате получим цвета с учётом адаптивной способности нашего человеческого глаза.

Всё, получаем кучу значений. Их преобразуем в формат ti3, аккуратно масштабируя, чтобы никто не вылезал за значение 100, и скармливаем atgyll cms.

Данный алгоритм был реализован в excel. Использовалось 18 цветовых патчей от мишени colorchecker 24, то есть, все цветные, плюс “идеально белый” цвет. Далее, это количество умножалось на 255: для каждой цвета симулировался такой же с учётом падения яркости. (В первом приближении, считаем что цвет в камере линейный). Плюс ещё один “идеально черный” цвет, в итоге имеем 4846 опорных цветов. (собственно, вот сам файл с расчётами: Spectral_calculate.xls.rar, 106k, а вот полученный 4500.ti3, 514k, для света 4500K)

Для построения матричного профайла используем colproof, с командным .bat файлом.

@echo off

set manufacture=-A "Canon"
set model=-M "EOS 5D mark II"
set desc=-D "EOS 5D mkII, 4500K, matrix"
set common=-qu -v
set mode=-aG -U 24.2
set input=4500
set output=-O Canon_5Dmk2_4500K_matrix.icm

colprof -v %manufacture% %model% %desc% %mode% %output% %input%
Комментировать я тут почти ничего не буду, кроме параметра “-U 24.2”. Он отвечает за общую яркость профиля, был подобран эмпирическим путём, так, чтобы яркость белой точки не превышала единицы. Мне совершенно неясно, почему он такой, и почему Argyll не калибрует яркость точки белого, вполне возможно это программная ошибка.

Кроме этого, можно попробовать сделать табличный XYZ профиль. Считает очень долго, но результат тоже неплох:

@echo off

set manufacture=-A "Canon"
set model=-M "EOS 5D mark II"
set desc=-D "EOS 5D mkII, 4500K, XYZ cLUT"
set common=-bn -qu -v -ni -np -no
set mode=-aX
set input=4500
set output=-O Canon_5Dmk2_4500K_xyz_clut.icm

colprof -v %manufacture% %model% %desc% %mode% %output% %input%
А вот с Lab табличными профилями у меня не получилось, они почему-то выходят темнее, чем нужно. Собственно, вот профили с различной симулированной температурой цвета:

Canon_5Dmk2_2500K_matrix.icm, 515k
Canon_5Dmk2_3500K_matrix.icm, 515k
Canon_5Dmk2_4500K_matrix.icm, 515k
Canon_5Dmk2_4500K_xyz_clut.icm, 597k
Canon_5Dmk2_5500K_matrix.icm, 515k
Canon_5Dmk2_5500K_xyz_clut.icm, 597k
Для того, чтобы сделать оценку, насколько похожа эта модель на правду, можно сфотографировать настоящую мишень colorchecker, а потом померить относительную ошибку между замеренными цветами и симулированными цветами.

Для теста была использована фотография мишени colorchecker при зимнем солнце, днём. Цветовая температура – около 4500K. По этим цифрам рассчитываем коэффициенты баланса белого:



Кстати, нужно упомянуть, как, собственно, получать данные без применения профиля. Используем dcraw (исполняемый файл можно взять в составе утилит imagemagick, или использовать его более продвинутый аналог dcraw_emu из пакета libraw) с параметром –o 0:

@echo off

set common=-q 3 -6 -T
set outcolor=-o 0 -g 2.2 0.0

set whitebalance=-r 1.000 0.4758 0.8094 0.4758

dcraw %common% %whitebalance% %outcolor% %1


Получается такое изображение (оно кадрировано из исходного):



На это изображение можно напустить утилиту scanin (из того же пакета argyll CMS), и получить файл с измерениями в формате ti3. Его можно сравнить с симулированным, подобрав среднюю яркость. У меня получилось, что среднеквадратичная ошибка между данными с камеры и замеренными данными составила около 2,5 процентов. Это очень неплохой результат, с учётом того, что реальные спектры отражения мишени, условия освещения, многие другие факторы могли отличаться от тех, которые участвовали в симуляции. Также следовало бы учесть виньетирование объектива, но цель была получить хотя бы какую-то оценку сверху, а также подтверждение, что метод действительно похож на правду.

Итак, теперь можно пользоваться профилем. Копируем их в папку C:\WINDOWS\system32\spool\drivers\color\ и присваиваем изображению.



Изображение сразу цветнеет:



Теперь можно строить изображения профили под конкретные условия освещения (при желании, спектры разных источников освещения можно найти в интернете).
Tags: photonotes
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 34 comments