Путь изображения от матрицы до файла

Новиков М.Г.
10.11.2010

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

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

I. Получение RAW-файла.

  1. На протяжении времени выдержки (т.е. во время экспозиции) в сенсорах матрицы под воздействием фотонов накапливаются электроны, формирующие заряд.
  2. С матрицы считывается массив аналоговых значений яркости каждого пикселя в виде фототоков сенсоров, которые усиливаются аналоговыми усилителями (как правило, линейными) в зависимости от установленной в камере чувствительности (ISO). Затем сигналы оцифровываются АЦП (глубина оцифровки сигнала 12-14 бит для современных зеркальных камер).
  3. Из массива сигналов осуществляется вычитание «тёмного кадра» (кадра, сделанного матрицей без открытия затвора) для снижения шумов и исключения «горячих пикселей». Происходит некоторая подстройка уровней сигналов в каналах, известная только разработчикам, отрабатывается усиление по цифровому ISO, если аналогового усилителя оказывается недостаточно.
  4. Полученная информация записывается в RAW-файл. В область его метаданных записывается карта цветовых линз, а также другая информация, относящаяся к установкам камеры на момент произведения фотоснимка.

II. Преобразование RAW-файла.

RAW-файл может преобразовываться по разным алгоритмам. В камере это более простые и менее качественные, но более быстрые алгоритмы, во внешних RAW-конверторах это более сложные и более точные способы, алгоритм которых, в свою очередь, зависит от производителя программы. RAW-файл глубиной 12-14 бит программно обрабатывается, как правило, уже в 16 битах. Но работа даже с такими точными целочисленными данными тоже приводит к ошибкам округления. Особо грубое (в процентном отношении к участвующим в расчёте числам) округление происходит при расчётах с малыми числами (оно и понятно), в области теней. Числа с плавающей запятой могли бы исключить эту неоднородность погрешности, но такие расчёты производятся компьютерами недостаточно быстро.

Однако в последнее время начинают появляться и такие конвертеры. На сегодняшний день мне известно уже несколько RAW-конвертеров, работающих с плавающей запятой. Это бесплатные RPP, XDepth Raw Converter и RawTherapee 4.0, и платный Oloneo PhotoEngine. К сожалению, RPP работает только на платформе Macintosh, хотя некоторые умельцы ставят его на PC в виртуальную машину. Кстати, не так давно (в 2013-м году) появился аналог RPP, у которого есть версия и для Windows — Digital Photo Interpreter (DPI).

Замечу, что особенностью RPP и DPI является то, что все регулировки изображения (экспозиция, яркость, контрастность, гамма и т.п.) осуществляются эмулирующими особенности плёнок кривыми (http://community.livejournal.com/raw_rpp/1765.html), которые накладываются на истинные данные каналов ещё до демозаика (дебайеризации), сразу после баланса белого. Это даёт довольно приятный визуальный результат, не требующий доработки фотографии в фотошопе (встречается мнение, что преимущества RPP частично теряются, если требуется подготовить файл для пост-обработки фотографии в фотошопе, поэтому его ниша — конвертирование изображений начисто).

Итак, в RAW-конвертерах (и во внешних, и во внутрикамерных) изображение проходит следующие этапы:

  1. Разделение каналов и предварительные регулировки. На основе имеющейся в RAW-файле информации о том, фильтр какого цвета стоял над тем или иным пикселем при съёмке, происходит разделение пикселей по каналам цветности RGBG (на один пиксель красного и один синего приходится 2 пикселя зелёного). После этого здесь уже могут осуществляться такие регулировки, как баланс белого а после него и различные другие преобразования (регулировка экспозиции, точки чёрного, яркости, контраста и гаммы), хотя конкретная последовательность определяется изготовителем ПО и может быть различной. Замечу, что упомянутая тут гамма — всего лишь инструмент корректировки, не имеющий отношение к т.н. гамма-компенсации (см. далее).
  2. Демозаик (дебайеризация, распознавание цветов путём интерполяции шаблона Байера, на основе которого построено большинство матриц). Этот метод позволяет отказаться от субпикселей, к которым мы привыкли в мониторах, и использовать в их качестве сами пиксели. Пиксели перемешаны таким образом, что любая взятая квадратная четвёрка (2х2 — зелёный-красный-зелёный-синий) однозначно определяет цвет, а половина одной четвёрки входит в состав соседней (четвёрки перекрываются). Таким образом, используя информацию из метаданных RAW-файла о расположении цветных линз над пикселями, специальный алгоритм рассчитывает цвет каждого пикселя. Количество зелёных пикселей удвоено по сравнению с другими, чтобы дать на вход алгоритма больше информации о расположении зелёных элементов изображения. Глаз человека наиболее чувствителен именно к зелёному цвету, поэтому более правильное определение зелёной составляющей делает изображение более чётким для восприятия. На выходе из демозаика мы получаем линейное цветное изображение во внутреннем цветовом пространстве конкретной фотокамеры, известном только разработчику. Замечу, что конвертер при редактировании этого изображения показывает на мониторе уже преобразованное согласно профилю фотокамеры и профилю нашего монитора нелинейное гамма-компенсированное изображение, поэтому мы видим его нормально, хотя на самом деле оно на этом этапе ещё линейно и гамма-неадаптировано.
  3. Различные регулировки. Если предварительные регулировки баланса белого, экспозиции, точки чёрного, яркости, контрастности и гаммы не были произведены до демозаика, они производятся тут. Дополнительно здесь регулируется насыщенность, резкость и шумоподавление, а также все оставшиеся параметры и фильтры.
  4. Перевод в нужное цветовое пространство. При подготовке к записи в файл происходит пересчёт цветов из собственного цветового пространства фотокамеры, описанного профилем этой фотокамеры, в целевое цветовое пространство (например, sRGB или AdobeRGB), тоже описанное соответствующим профилем. В профилях содержится информация о цветах, однозначно определённых в цифрах специального эталонного цветового пространства (CIE XYZ). Профиль фотокамеры, как правило, уже зашит в RAW-конвертер, но может подгружается в него и из отдельного файла. Профиль целевого цветового пространства находится в виде файла в операционной системе. Как правило, целевое цветовое пространство (такое как sRGB, AdobeRGB и т.п.) является гамма-компенсированным, то есть при пересчёте цветов учитывается также и гамма этого пространства. Происходит т.н. линеаризация яркости, позволяющая более рационально использовать битовую глубину файла изображения (см. далее), а также подготовить файл к выводу на монитор.

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

Кроме более эффективного использования битовой глубины, гамма-компенсация оказывается необходимой при отображении информации на мониторе. Электронно-лучевая трубка монитора имеет одну физическую особенность — она отображает яркости нелинейно поданному на неё управляющему напряжению. И эта нелинейность как раз описывается гамма-функцией, обратной по отношению к уже применённой нами к файлу! Таким образом, нам остаётся просто подать этот гамма-компенсированный файл прямо на монитор без каких-либо дополнительных гамма-компенсирующих преобразований, и он отобразится правильно. То есть, введённая в файл гамма компенсирует гамму монитора. Кстати, именно поэтому целевое цветовое пространство называется гамма-компенсированным. Замечу, что ЖК-мониторы эмулируют поведение ЭЛТ-мониторов, тоже отображая яркость нелинейно, поэтому всё вышеописанное справедливо и для них.

III. Сохранение данных в файл графического формата.

  1. Округление чисел до значений конкретного формата файла (8 или 16 бит на канал).
  2. Внедрение в файл информации о целевом профиле, чтобы программы просмотра знали, как наиболее правильно интерпретировать цветовые данные, содержащиеся в файле.
  3. Сохранение данных в файл выбранного формата.

Конец.