Известно, что система восприятия человека нелинейна. Незначительное увеличение силы света в тёмных областях вызывает значительное увеличение воспринимаемой яркости. И наоборот, существенное увеличение силы света в ярких областях глаз воспринимает несущественно.
Похожим образом устроены все чувства восприятия человека. Именно благодаря этому мы слышим мельчайшие шорохи в тишине (в области низких сигналов) и не глохнем, взбираясь по трапу самолёта с работающими двигателями. Именно поэтому мы способны ощущать лёгкое прикасание пёрышка к коже и одновременно не кривиться от боли при крепком дружеском рукопожатии (оставим пока в стороне рукопожатие Николая Валуева). За счёт нелинейного восприятия наши органы чувств способны воспринимать огромные диапазоны воздействия. С точки зрения яркости наш глаз способен читать текст на листе, освещённый лунным и солнечным светом, хотя их физическая яркость при этом отличается примерно в 1 миллион раз!
Важно понимать, что для адекватного восприятия сцены человеком она должна быть воспроизведена линейно - точно также, как она «воспроизводится» в реальной жизни. В то время как любая среда воспроизведения, будь то монитор, принтер или проекция слайда, также является нелинейной.
Для того, чтобы линеаризовать выдаваемое на выходе изображение (то есть привести его к линейному, нормальному для восприятия человека, виду), необходимо внести в картинку некоторые предыскажения. В случае монитора, эти предыскажения называются гамма-коррекцией.
А теперь давайте посмотрим на цепочку гамма-преобразований, которые возникают на пути визуализации Raw-файла:
Соответственно, если мы хотим посмотреть на то, как выглядит Raw-файл, мы должны присвоить ему гамму 1.0 (линейную) на этапе Raw-конвертации и не делать никакого баланса белого (не вводить коэффициенты масштабирования каналов). Сделать такую конвертацию можно, например, с помощью входящей в состав библиотеки
LibRaw команды dcraw_emu со следующими параметрами (для файлов Canon):
> dcraw_emu -r 1 1 1 1 -o 0 -h -6 -g 1 1 -T
Эти ключи означают:
-r 1 1 1 1 = отключить баланс белого (установить все четыре поканальных коэффициента умножения равными 1)
-o 0 (минус маленькое «о», пробел и ноль) = без выходного цветового профиля
-h = выводить изображение в половинном размере (для того, чтобы не задействовать в эксперименте алгоритмы дебайеризации)
-6 = выдавать результат в 16-битном виде
-g 1 1 = гамма 1.0 (начальная линейная часть и инвертированная степень равны 1)
-T = выводить TIFF
Так как мы намерено ещё не назначали цветовой профиль, при открытии файла в фотошопе (в случае грамотно настроенной Color Policy) получим на экран сообщение, на которое мы пока ответим «Live as is (don't color manage)», что означает «оставить как есть (не управлять цветом)»:
Для изначально нормально экспонированного файла на экране мы получим примерно такую картинку:
На самом деле эта картинка ни о чём пока не говорит, т.к. мы не можем интерпретировать значения её RGB-координат. Теперь картинке необходимо присвоить некий цветовой профиль, который должен быть обязательно с гаммой 1.0, так как мы хотим увидеть то, что изначально заложено в Raw-файле, а нам достоверно известно, что камера регистрирует свет практически линейно (с точностью до физических эффектов существенно меньшего порядка). К тому же мы и проявляли этот Raw-файл линейно. В идеале это должен быть специально построенный профиль для конкретной камеры, но для простоты эксперимента можно присвоить профиль sRGB с гаммой 1.0. В этом случае мы увидим не совсем то, что зарегистрировала камера, но достаточно близко к тому. А с точки зрения яркостного распределения, именно то, что заложено в Raw-файле.
Чтобы присвоить профиль, выполним в Фотошопе команду Assign Profile и выберем заранее подготовленный профиль sRGB с гаммой 1.0.
Вот что в итоге получится. Это изображение с некоторой погрешностью по цветопередаче (не особо важной в данном случае) можно считать именно тем, которое зарегистрировала наша камера в виде Raw-файла:
Как видите, по яркости картинка вполне соответствует нашему восприятию. Только зелёная, что в общем-то понятно, ибо зелёный канал в Raw-файле всегда самый сильный, а другие каналы относительно него не масштабированы. Можно попробовать чисто ради интереса их масштабировать, то есть сделать все вышеописанные операции, но при конвертации использовать команду с установкой баланса белого:
> dcraw_emu -w -o 0 -h -6 -g 1 1 -T
В отличие от предыдущей конвертации в этом случае мы используем баланс белого, замеренный автоматикой камеры. Тогда картинка будет такой:
Вполне человеческая картинка, согласитесь. Даже при том, что мы практически от потолка присвоили цветовой профиль sRGB, а не профиль камеры. Если бы у нас был под рукой профиль камеры, цвета получились бы более точными в соответствии с цветопередачей камеры.
Самое интересное, что похожую картинку (с точностью до цветового пробразования) мы получим, если выставим все параметры в ноль (включая тональную кривую) при конвертации в Adobe Camera Raw или Lightroom. Хотя при этом происходит присвоение изображению гаммы, отличной от 1.0. Казалось бы, парадокс? На самом деле совсем нет. Просто CMS (система управления цветом операционной системы) при выводе картинки на экран согласовывает значения присваиваемой гаммы и гамма-коррекции, необходимой для компенсации нелинейности монитора. Таким образом, Raw-файл, конвертированный с любой гаммой, будет выглядеть одинаково в пределах ошибок CMS операционной системы.