Перейти к основному содержимому
Background Image

Передача цвета

·3685 слов
Оглавление

Кремниевые фотоэлементы, используемые в светочувствительных ячейках матрицы, восприимчивы к широкому диапазону длин волн. Их можно “заряжать” светом во всём видимом спектре и даже ультрафиолете, причём электроны будут одинаковы. Более простым языком, ячейка сама по себе не может различать цвета.

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

Чередование светофильтров
#

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

До этого одним из ранних изобретений была смена светофильтров. Человек — не спектрометр, и почти любой воспринимаемый им цвет можно воспроизвести с помощью комбинирования трёх базовых цветов. Например, красного, зелёного и синего, ведь в наших глазах имеются колбочки именно этих цветов. Можно по очереди снять фотографии неподвижной сцены с разными светофильтрами, затем результаты просветить через те же светофильтры, и их комбинация даст приближение к исходному изображению. Первое такое изображение было получено в конце XIX века.

Одна из сложностей и по сей день состоит в том, что нужно получить три снимка без “смаза”. Если сцена неподвижна, то метод вполне годится. Если снимается хоть немного подвижный объект, то дело плохо. Кроме того, нужно как-то менять светофильтры, это лишняя механика, вес, габариты, большая вероятность поломки. Либо их придётся менять вручную.

Как Вы, наверное, догадываетесь, в большинстве цифровых фотоаппаратов регистрация цветов производится другим способом. Тем не менее, этот метод до сих пор применяется в специфичных областях. Например в астрофотографии иногда используют монохромную камеру и снимают звёздный объект в три захода с разными светофильтрами. Фильтры накручиваются на объектив или телескоп вручную. При этом получаются следующие преимущества.

  1. Нет падения разрешения как в демозаике, которую обсудим позже.
  2. Не обязательно использовать фильтры R, G, B. Сейчас в фотографии глубокого космоса часто применяют узкополосные фильтры трёх типов, так как считается, что большинство объектов космоса излучает в одной из этих полос. Всё остальное даёт больше шума, чем пользы, и значительно скрывает детали. Затем полученные каналы раскидывают по каналам RGB в изображении в некоторых пропорциях. Получаются не совсем настоящие цвета, зато их контрасты позволяют нам увидеть больше.
  3. Можно фокусироваться с каждым светофильтром отдельно, благодаря чему уменьшается влияние хроматических аберраций.

За это приходится платить временем смены фильтров и обработки результатов, необходимостью покупать и носить с собой больше оборудования. Сюда хочется приписать и время выдержки, ведь в астрофотографии могут быть многочасовые сессии с открытым затвором, а снимать приходится три раза. Но тут всё не так плохо: света Вы соберёте столько же, сколько с Байеровской маской за такое же время. Даже лучше, Вы вольны выбирать, какую длину волны нужно собирать подольше, от какой света и так много, и можно сократить время, а какой в снимаемом объекте всё равно нет, и её можно пропустить.

3CCD
#

Раз мы не можем сверхбыстро менять светофильтры, чтобы гарантировать одновременный снимок в трёх спектрах, то почему бы не разделить весь свет призмой на красный, зелёный и синий и не раздать трём сенсорам? Такая идея была предложена и воплощена в технологии 3CCD.

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

Маска Байера
#

В наш век технологии настолько развиты, что можно не только создать матрицу из миллионов кремниевых ячеек диаметром в пару микрон, но и накрыть их индивидуальной оптикой, пусть и не очень качественной. В 1976 году сотрудник Kodak, Брайс Байер, предложил добавить к каждой ячейке индивидуальный светофильтр одного из 3 цветов. Да не случайным образом, а чтобы они формировали паттерн, с которым можно легко работать и получать неплохое приближение любого цвета в пикселе, полагаясь на цвета соседей. Такой массив цветных фильтров называют фильтром Байера, или маской Байера, иногда мозаикой.

Маска Байера накладывает свой цвет на каждый пиксель

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

Счастливым пользователям OpenCV на заметку: в функции cvtColor OpenCV поддерживаются все “стандартные” методы демозаики. У них есть двухбуквенные и четырёхбуквенные обозначения. Если Вы думаете, что первые — это сокращения вторых, полученные из первых букв, то ошибаетесь. Логика их наименования, скажем так, досягаема не для всех. Если Вы заботитесь о психическом здоровье коллег, пожалуйста, используйте стандартные четырёхбуквенные обозначения.

Есть и другие паттерны, в том числе составленные из цветов CMY (бирюзовый, фиолетовый, жёлтый), комбинации CMY + RGB, белого (без фильтра). И, конечно, других форм.

Дебайеризация
#

Допустим, у нас есть фотоаппарат с маской Байера, мы сделали снимок. Сенсор выдаёт нам монохромное изображение, он даже не знает, над каким пикселем какой светофильтр стоит. Что происходит дальше? Рассмотрим на примере “стандартного” паттерна 2×2.

Мы могли бы считать, что получили 4 фотографии разных цветов: 2 зелёные, 1 красную, 1 синюю. Каждая имеет разрешение в 2×2 раза меньше, чем весь сенсор. Затем просто сложить их с разными весами, как это делается с накладываемыми светофильтрами. Но так как все 4 типа фильтров имеют разный сдвиг, то это немного испортит качество итогового изображения, ведь на всех пикселях мы видим разные точки сцены.

Поэтому делают немного по-другому. Вместо уменьшения разрешения всей фотографии добавляют недостающие цвета, с помощью интерполяции. Например в “синий” пиксель мы хотим добавить зелёный канал; для этого можно взять среднее ближайших “зелёных” пикселей. Аналогично добавляется и красный. Оценив все каналы во всех точках, мы получим цветное изображение исходного разрешения; но часть информации в ней “не настоящая”, для неё приходится вычислять приближение. Такой процесс называют “дебайеризацией” или “демозаикой”.

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

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

Однородный отклик сенсора
#

Для корректной работы с цветами требуется привести отклик сенсора к однородному. То есть увеличение потока света в \(N\) раз должно давать в \(N\) раз большие значения.

Для очень многих современных сенсоров это означает вычитание уровня чёрного с опциональным масштабированием. Для каких-то может потребоваться более сложная линеаризация.

Если однородности нет, то с изменением яркости соотношения каналов будут меняться, цвета будут “плыть”. В качестве примера допустим, что уровень чёрного \(K > 0\) для матрицы с линейным откликом не компенсирован, и мы получили значения пикселя \(R + K, G + K, B + K.\) Как нетрудно видеть, $$ \dfrac{R + K}{G + K} \neq \dfrac{R}{G}. $$ Соотношения каналов поменялись, цвета будут искажаться. Причём относительное влияние \(K\) будет разным в зависимости от яркости, в тёмных пикселях сдвиг больше, чем в светлых.

Приведение к однородному отклику — одна из первых вещей, которые нужно сделать при работе с изображением. Если у матрицы есть маска Байера, то её следует производить до демозаики.

Калибровка цвета
#

Если Вы когда-нибудь занимались обработкой сырых изображений самостоятельно или просто выключали модули по калибровке/балансу цветов в программах для обработки фотографий, то наверняка заметили, что цвета выглядят откровенно плохо.

После демозаики цвета по умолчанию выглядят совершенно неестественно

Причины здесь две.

  1. Разная восприимчивость камеры к разным длинам волн. Это и передача оптикой, и искажения фильтрами, и, самое главное, маска Байера. У каждого сенсора светофильтры настроены по-своему.
  2. Разные источники света. Человек не замечает, как его мозг пытается привести увиденное к схожему виду. Однако если не балансировать цвета в камере, то будет несложно видеть, что на полуденном солнце одна и та же сцена имеет одни оттенки, на закате совершенно другие, а под уличными фонарями после захода — третьи.

Если Вы работаете с одной и той же камерой и одним и тем же источником света, то Вам повезло: можно посчитать способ компенсации обоих эффектов один раз и однообразно применять его ко всем снимкам. При этом, правда, могут появляться скрытые источники света в виде просочившегося через окно солнца, включившегося фонарика на телефоне или просто отражений от цветных объектов.

Если же что-то из этого меняется, то, вообще говоря, приходится подбирать цвета на каждый снимок. Но не всё так плохо, давайте рассмотрим некоторые методики.

Процесс приведения изображения к “хорошим” цветам назовём калибровкой цвета. Как правило она сводится к пересчёту каждого канала, исходя из всех каналов картинки, по какому-нибудь правилу.

Здесь мы в качестве примера будем предполагать, что работаем с RGB. Если используются другие светофильтры для получения цвета, то всё остаётся аналогичным. Кстати, здесь нет зависимости от самого способа: что с маской Байера, что со сменным фильтрами проблемы и решения будут схожими.

Баланс белого
#

Если в сцене есть предмет нейтрального цвета (серый, белый), то это большая удача. Можно посчитать такие веса \(w_R, w_G, w_B\), что $$ w_R R = w_G G = w_B B, $$ где \(R, G, B\) — значения каналов (red, green, blue, то есть красный, зелёный, синий) на этом предмете в исходном изображении. Здесь два уравнения и три неизвестные, поэтому можно принять один из весов равным единице. Например \(w_G\), если зелёный — самый интенсивный.

Иногда в качестве “нейтрального предмета” используют специальную серую карту. Её цвет более-менее нейтральный (в идеале это как-то калибруется, но на практике не всегда), она фотографируется отдельно в тех же условиях, в каких снимается сама сцена, затем убирается.

Калибровка цвета произведена с помощью баланса белого по серой карте

Однако при сравнении фотографии и снятого объекта часто оказывается, что цвета всё равно переданы неточно. Например на моём фотоаппарате обычно зелёный оказывается жёлто-зелёным. Одна из проблем состоит в том, что пиксели всё равно передают не те же цвета, что наша сетчатка. Гораздо большая проблема заключается в природе цвета, который мы воспринимаем, но об этом позже.

Смеситель каналов
#

Итак, мы хотим передать красивые цвета, но наши “красный”, “зелёный” и “синий” каналы оказались не совсем красным, зелёным и синим. Что можно сделать?

Можно нивелировать расхождение цветов с помощью их линейных комбинаций. Мы ведь помним, что условно любой цвет, воспринимаемый человеком, можно разложить в комбинацию базовых. Допустим, у нас есть пиксель со значениями \(R, G, B\). Посчитаем из него значения \(R_o, G_o, B_o\) по формулам $$ \begin{array}{ll} R_o = c_{11} R + c_{12} G + c_{13} B, \\ G_o = c_{21} R + c_{22} G + c_{23} B, \\ B_o = c_{31} R + c_{32} G + c_{33} B, \end{array} $$ где \(c_{ij}\), \(i, j = 1, 2, 3\) — некоторые веса. Удобно представлять эту систему в матричном виде: $$ [R_o, G_o, B_o]^T = C [R, G, B]^T, $$ \(C\) — матрица, составленная из коэффициентов \(c_{ij}\), \(\cdot^T\) — операция транспонирования.

Такое преобразование называют смесителем каналов (channel mixer), он присутствует во многих программах для обработки фотографий, иногда под немного другими именами. Мы сами задаём матрицу \(C\), тем самым управляя цветами. Однако это требует понимания, как это работает, и опыта.

В рамках этой статьи не будем приводить методики работы с этим инструментом, иначе она излишне затянется. Есть очень хорошие видео с объяснениями от моего любимого Boris Hajdukovic, но они на английском. Сейчас приведём только несколько базовых свойств.

Во-первых, если \(C\) — единичная матрица, то смеситель ничего не меняет. Если это единичная, умноженная на число, то будет лишь умножение всех каналов на это число, то есть цифровое усиление.

Во-вторых, если мы хотим оставить нейтральные цвета нейтральными и не менять им яркость, то сумма коэффициентов в каждой строке должна быть равна единице. Это нетрудно видеть, если представить нейтральный цвет как \(b [1, 1, 1]^T\), где \(b\) — его яркость.

В-третьих, давайте поймём физический смысл смешивания. Например коэффициенты \(c_{1j}\) регулируют красный канал. Увеличивая \(c_{11}\), мы лишь усиливаем влияние исходного “красного”. Увеличивая \(c_{12}\), мы добавляем к красному ещё часть, зависящую от “зелёного”. Если он содержит более-менее зелёный цвет, то это значит, что, например, зелёные оттенки на изображении получат добавку к красному каналу, и они станут более жёлтыми. Если же \(c_{12}\) меньше нуля, то мы подавляем красный цвет там, где присутствует “зелёный” канал. Тогда, например, жёлтый станет более зелёным.

На этих трёх принципах можно довольно неплохо поиграть с цветами. Конечно же, само регулирование опирается на вкус и опыт, что не очень радует. Слово “опыт” здесь означает, что Вам нужно учиться пользоваться этим инструментом. В целом оно того стоит.

Colorchecker
#

А что, если придумать способ посчитать матрицу \(C\) автоматически? Он давно придуман. Продаются стандартные специальные карточки с хорошо калиброванными цветами в ячейках, они называются colorchecker (дословно “проверщик цветов”, хотя тут прослеживается игра слов с “checker”, “шашечки”). Помещаете такую в кадр, фотографируете, убираете, фотографируете сцену. Потом по изображению карточки считаете \(C\), применяете её к финальной фотографии.

Пример colorchecker’а

Матрицу \(C\), посчитанную таким образом, называют матрицей цветокоррекции (color correction matrix, CCM). Она рассчитывается так, чтобы её применение давало наиболее точный цвет, в некотором смысле.

Получается, найдена серебряная пуля, которая полностью решает все проблемы цветов и делает их абсолютно точными? Конечно нет. У подхода есть масса недостатков.

  1. Невозможность точно воспроизвести цвета. Светофильтры на нашем RGB сенсоре имеют три спектральные полосы, которые они пропускают. Они широкие, так как ими нужно покрыть весь спектр видимого света. Они пересекаются. Они не сплошные, например часто можно видеть дополнительный “холмик” ближе к инфракрасному. Другими словами, камера не запоминает спектрально точно свет, который в неё попал. Поэтому по colorchecker’у не получается подстроить коэффициенты, чтобы все патчи совпали по цвету (у нас 9 неизвестных и, в наиболее популярных карточках, 24 уравнения). Есть разные алгоритмы, например дающие наилучший результат в среднем, наилучший результат на оттенках кожи, наилучший по какому-либо восприятию и т.д. Есть куча разного ПО для вычисления CCM, от бесплатных до очень дорогих (обычно это лишь часть их функционала, например ImaTest), и результаты действительно сильно отличаются.
  2. Сильная зависимость от условий. Colorchecker получается успешно применять только в студийных условиях, когда Вы полностью контролируете свет. Или хотя бы при только искусственном свете. На улице карточка почти бесполезна, так как условия непрерывно меняются. Солнышко поднялось повыше — оранжеватый свет стал блекло-жёлтым; зашло за облачко — добавилась синева. Даже в студии бывает сложно не поймать отражения от цветных объектов вокруг, которые изменят результат до неузнаваемости.
  3. В художественной фотографии далеко не всегда цвета нужно воспроизводить точно. Зачастую можно лучше передать настроение, выделить объект, добавить или убрать контрасты с помощью манипуляций цветом.

Тем не менее, CCM используется и в студийной съёмке, и для более точного представления цветов в технических целях. Она не совсем бесполезна, но и не является лекарством от всех болезней.

Стандартные источники света
#

В технических целях для референса часто используют “стандартные” источники света. Самый известный — D65, который оценивается как свет при летнем полуденном солнце с цветовой температурой 6504 К. Можно найти лабораторные лампы, которые его испускают, но они редкие и дорогие. В быту вместо этого используют буквально свет от солнца в зените в безоблачную погоду.

Почему нужен референс? Можно посчитать CCM для перехода от никудышных цветов камеры в более-менее точные цвета в референсном освещении. Как раз с помощью colorchecker’а. После этого достаточно будет использовать переходы от референса к другим источникам света, если такой переход известен.

Почему D65? Потому что это источник, обладающий примерно одинаковыми свойствами летом во всей умеренной широте планеты. Его не нужно воспроизводить и зависеть от сложного лабораторного оборудования.

Пресеты
#

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

Вычисляют их как раз по стандартному источнику. Для Вашей камеры должна быть известна CCM перехода в некий стандартный источник, ПО знает, как из этого источника перейти в пресет. Доверять этому стоит, если Вы уверены в CCM. Если стороннее ПО даёт не очень хорошие результаты, то всё равно это хорошая отправная точка, можно немного поправить проблемные места.

Цветовая температура
#

Ещё один способ удобно работать с цветом — цветовая температура. Не вдаваясь в детали, это теоретическая величина, задающая цвет источника света. Вы меняете температуру, и картинка становится более красной или более синей.

Это тоже не абсолютный подход. Например сцена снята при лампочке, стоящей за оранжевым абажуром. В этом случае свет прошёл через светофильтр, и его спектральный состав сильно изменился. Для нивелирования таких эффектов можно тоньше подстраивать баланс белого смещением оттенка (tint), оно двигает ближе к зелёному или фиолетовому. Управление двумя параметрами уже не всегда просто и интуитивно.

Также бывают адаптации температуры под разные условия. Например теоретическое планковское чёрное тело, дневной свет (учитывается прохождение через атмосферу).

Невозможно пройти мимо и не упомянуть небольшой курьёз. Большинство людей, в том числе и фотографов, думают, что большая температура значит более “тёплый” красный цвет, а меньшая — более “холодный” синий. Для простоты запоминания удобно так и думать, но это не совсем корректно.

Чем выше эффективная температура излучающего тела, тем более синий цвет оно даёт. Например наше Солнце является красным карликом, оно сравнительно холодное, потому и красное. Синие же звёзды, например Сириус, самые горячие. Но калибровка цвета заключается в компенсации источника. Поэтому “горячий” источник мы подавляем красным оттенком, и наоборот. Физический смысл противоположный, мнемоника правильная.

Авто-баланс белого
#

Внимательный читатель может спросить: почему человек не видит разницы в источниках света, в разумных пределах? В течение большей части дня мы видим примерно одинаковые цвета, причём что в безоблачную погоду, что в пасмурную. Мы замечаем разницу между лампой накаливания и “синюшной” светодиодной, но только когда обращаем внимание.

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

У любого уважающего себя фотоаппарата с цветной фотоматрицей есть режим автобаланса белого, по-английски auto white balance, AWB. В простейшем случае он считает “средний цвет” по кадру и нейтрализует его. Также может детектироваться нейтральная часть сцены, калибровка проводиться по ней. При этом может быть полезно знать CCM для перехода к референсному источнику, например D65.

Некоторые камеры предлагают не только авто-баланс для нейтрализации цветов, но также с последующим “утеплением”, чтобы получить более приятные оттенки. Например у Canon это называется ambience priority AWB.

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

  • Не во всех условиях авто-баланс отрабатывает хорошо.
  • Не всегда нужно передать цвета нейтрально. В художественной съёмке вместо этого можно “утеплить” или “охладить” тона, разделить цвета для большего контраста, свести всё в монохром для “спокойного” вида и т.д.
  • Когда снимаете серию снимков для совместной обработки, например склейки в панораму, focus stacking и т.д., можете получить ощутимо разные цвета, так как каждый кадр балансировался по-своему. В ряде случаев это можно будет исправить на постобработке, как минимум если снимаете в Raw. Многие камеры умеют рассчитывать баланс по одному кадру и применять к новым при съёмке.

Другие проблемы передачи цвета
#

Сложность передачи цветов
#

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

Во-первых, из-за того, что просматривать изображение мы будем на экране или принтерной печати. В большинстве случаев устройства не калиброваны, и все передают по-разному. Сильно по-разному. Даже если откалибровать все экраны в мире, остаётся та проблема, что они не отображают снятую сцену в исходной яркости. А она может ощутимо влиять на восприятие цветов. Тем более, что все мы ставим разную яркость экрана и смотрим на него при разном освещении.

Во-вторых, цвет — вообще сложная штука и связана с тем, как наш мозг интерпретирует увиденное. Его можно обмануть, у него есть неоднозначности (например мы видим фиолетовым и чисто фиолетовый свет, и смесь красного с синим, хотя спектр в этих двух случаях разный), каждый человек видит его по-своему. По сути мы пытаемся фотографией вызвать в мозге ощущения, похожие на те, которые чувствовали в момент съёмки. Это не безразмерно сложно, потому что мы используем не случайный шум, а неплохое приближение к изображению. Однако в этом процессе есть масса сложностей, которые человечество активно изучает с прошлого века, может и раньше.

Несколько источников света
#

Калибровка — это компенсация цвета, полученного от источника света. Если доминирующих источников несколько, то дело усложняется. Даже если комбинировать компенсации, чтобы нейтрализовать “средний арифметический”, то можно столкнуться с их локальностью. Когда часть сцены больше подсвечена одним, а часть — другим.

Довольно противным источником света может быть отражение от цветных предметов. Во-первых, его бывает сложно заметить при съёмке. Во-вторых, оно даёт нестандартный цвет, и без нейтрального объекта в сцене может быть сложно его компенсировать.

Как наш мозг справляется с ситуацией, когда разные части сцены подсвечены разным цветом? Мы можем поводить глазами, при этом нейтрально будет выглядеть то, что в центре взгляда. С фотографией так плохо получается: нейтрализуем мы глобально всю сцену, а из-за малого масштаба мозг не всегда адаптируется к различиям в разных частях кадра. Однако иногда можно делать локальные калибровки: часть отбалансировать одним образом, часть — другим.

Итоги
#

  1. На текущий момент наиболее популярные две технологии для передачи цвета фотоматрицей — маска Байера и ручная смена светофильтров. Первая применяется в потребительских камерах, вторая — в сравнительно узких случаях.
  2. Для корректной работы с цветами требуется привести отклик сенсора к однородному.
  3. Получить хорошие цвета не всегда просто, но есть множество техник, помогающих в этом.
  4. Получить идеальные цвета в общем случае невозможно.