Цветовая компрессия

Dec 23, 2011 02:40



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



Теория

Метафорическая прелюдия (читать необязательно)
Представьте, что вы - звукорежиссер и вам принесли на мастеринг аудиозапись некоей песни. Запись вышла не очень удачной и громкость инструментов на ней заметно ниже громкости голоса вокалистки. Для того, чтобы подровнять громкость, вы скорее всего воспользуетесь компрессией звука. В чем она заключается?
Компрессор смотрит несколько (зависит от настроек) последних звуковых колебаний и вычисляет их среднюю силу, которая есть ни что иное, как громкость на данном участке записи. Делается это непрерывно, поэтому по заданным настройкам он может отследить скачкообразное увеличение громкости. Как только скорость увеличения громкости превосходит некий порог, компрессор начинает на выходе нормировать сигнал с понижающим коэффициентом. Принцип очень похож на то, как домохозяйка хватается за пульт от телевизора и делает потише, как только Дом2 прерывается громкой рекламой. Компрессор делает это же, но в сотни раз оперативнее, и вы не успеваете услышать, что сигнал пытался "скакнуть". Правильно подобрав настройки под характер громких всплесков в сигнале, вы можете "разгладить" громкость, избавив ее от "складок", образуемых громкими звуками. Конец прелюдии.

Общий принцип компрессии состоит в том, чтобы разделить сигнал на всем поле его действия на сильный и слабый и либо усилить слабую часть, не трогая сильную, либо ослабить сильную, не трогая слабую. В нашем случае мы будем работать со слабым сигналом, не трогая сильный.

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

S ~ MAX{abs(R-G), abs(R-B), abs(G-B)} (можно еще сделать нормировку по яркости, но на логике рассуждения это никак не скажется)

Что же получается? Если мы крутим ручку насыщенности в плюс, то из формулы получается, что наименьшее значение из тройки R,G,B становится еще меньше, а наибольшее - еще больше. Из этого следует, что еще задолго (в среднем по больничке) до момента достижения ручкой ее максимального положения мы получим черный или белый клиппинг в одном из каналов, а следом довольно быстро еще один (обратный к первому) клиппинг на другом канале. А поскольку уникальный оттенок цвета - это строго определенная пропорция между значениями яркостей каналов, то любой клиппинг одну из пропорций нарушит (одна из величин в пропорции перестанет меняться), что вызовет дрейф оттенка (hue) в сторону ближайшего из шестерки чистых цветов (пытливым предлагаю осознать этот факт самостоятельно без разжевывания), а также появление описанных выше артефактов.

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

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

Практика

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

Сестра, скальпель!

Итак, у нас есть исходное изображение, в котором наблюдается богатство различных цветовых оттенков, как насыщеных так и достаточно нейтральных:



Будем делать так, как написано в формуле. Для начала сделаем 3 пары слоев из отдельных каналов - R,G; R,B; G,B:



Из каждой пары делаем разность с помощью режима наложения difference примененного к верхнему слою пары. Далее мержим каждую пару в отдельный слой:



Теперь важный момент - в полученных слоях чем светлее область - тем больше разность между каналами, а соотвественно и насыщенность. Чтобы получить один слой, в который будут выбраны самые яркие пиксели из трех изображений, применим к двум верхним режим наложения lighter color (за справкой по режимам наложения обращайтесь к zhur74). Если все три полученных слоя черезчур темные, можно использовать режим linear dodge вместо lighter color.



Мержим слои. Маска получена. Теперь нужно ее отнормировать (она всегда получается темная и очень шумная, поскольку насыщенность - это канал в котором шум по сравнению с полезным сигналом в несколько раз сильнее, чем в любом отдельно взятом цветовом канале)...



...и инвертировать (белое - насыщенное, а его надо наоборот закрыть, то есть сделать черным). Результат:



Дублируем оригинал, вешаем на дубль маску. Собственно все, теперь идем в HSL и выкрычиваем Saturation до +50:



Как видите, никаких артефактов и выбитых цветов, особенно четко проявился цвет на передней вещи - появился глубокий темно-синий оттенок (который в реальности глазом был виден, но почти не проявился на оригинале), а вещь из замши в середине стала отчетливо коричневой. Если цвета слишком много, то теперь можно приглушать общий уровень насыщенности, доведя цвет до желаемого уровня.
Для тех, кому результат кажется не слишком наглядным, я выкладываю то, что получается от лобового применения Saturation +50 к оригиналу:



Замечание 1
Описанная цветовая операция является исключительно требовательной к пластичности исходного изображения (то есть шум должен быть в сотни раз слабее сигнала и не иметь обширных областей с клиппингом). Использованный исходник был получен из среднего арифметического десяти(!) iso100 равов Canon 500D c нейтральными настройками конвертера (линейный контраст, отключенный шумодав, отключенный шарпенинг, очень точно скорректированная хроматика). Не думайте, что сможете прочувствовать всю мощь приема, не подготовив с особой тщательностью исходник. Даже счастливым обладателям Nikon D3S и Sigma SD1 я рекомендую делать по 4 кадра, остальным - от 10 до 16 на минимально возможных исо. Если у вас нет возможности использовать более одного рава - применяйте к маске шумодав и небольшое размытие по Гауссу. Использование алгоритма с джипегами исключено.

Замечание 2
Если вы хотите получить честный цвет у нейтральных областей, вы должны очень точно выставить в конвертере баланс белого - малейшее неверное смещение тут же испортит вам все оттенки. Для точности можно выставлять ББ с выкрученной до +50 ручкой saturation и после выставления вернуть ее на ноль.

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

Замечание 4
Как следствие из замечаний 1 и 3, подобная обработка наиболее хорошо применима в пейзаже, архитектурной, интерьерной и предметной съемках.

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

Всем осилившим гран мерси.

UPD: уважаемый yuretz73 не поленился в 3 часа ночи написать по мотивам экшен.
От автора: писалось для собственного иллюстративного использования в 3 часа ночи, так что качество, оптимальность и даже просто соответствие методике, описанной в статье, не гарантируется. Качайте и используйте на свой страх и риск :) У меня CS5, так что, боюсь, на младших версиях может не работать.
Previous post Next post
Up