As RAW as possible

kaf50100.png Говоря о RAW-данных ("необработанные", "данные прямо с матрицы") большинство фотографов (да и не только фотографов) полагают, что сенсор - это очень простая штука: массив светочувствительных элементов, цветные фильтры, сбоку прикручен АЦП (или несколько). Появляется в рекламных буклетах производителей фраза "мы уменьшили зазор между микролинзами" - вспоминают еще и про микролинзы. Документации то разумной почти нет. Про острую нужду в кривых спектральной чувствительности мы уже писали в статье для Компьютерры, но есть острая нужда не только в этих данных.

Вот, например, "черная рамка" или маскированные пикселы. Они считываются с матрицы, но в финальное изображение - не попадают. Значения считанных оттуда пикселов - это источник данных для выставления уровня черного. Если читать исходные тексты dcraw, то видно, что для большого числа камер Dave Coffin (а за ним - и многие последователи) банально вычисляет среднее по некоему участку черной рамки (или же в последних версиях для некоторых камер делает чуть-чуть сложнее, считая отдельное среднее для четных и нечетных столбцов), затем это среднее вычитается из значений, считанных с активных пикселов и все.

Впрочем, некоторые производители завесу немножко приоткрывают. Вот, скажем, Kodak. В Кодаковских datasheets на сенсоры написано много всего интересного. И если почитать, например, документацию на KAF-50100 (картинка справа взята из нее), то становится понятно, что структура неактивных пикселов - сложная, тут и референс для выставления уровня черного и что-то тестовое и какие-то буферные пикселы.

Установка правильного уровня черного необычайно важно. Скажем, для камеры Canon 1D Mark III, примеры с которой мы будем рассматривать ниже, уровень черного при ISO100 - около 508-514 (реальные данные с моей камеры). Ошибка в усреднении в 4 единицы - это может быть либо потеря трех стопов в тенях (если ошибка в плюс), либо же, наоборот, очень сильная нелинейность в тенях, заметная уже на 4-5 стопов в тенях.

Давайте же посмотрим, как устроен верхний левый угол кадра у 1D3, если вычитание черного выключить, а маскированную рамку в выдачу - включить. Данные получены с помощью LibRaw 0.7-alpha0, которая пока публично не существует, но будет опубликована, как только выдача рамки будет поддержана для существенного количества камер, а не только для Canon-CR2:

1d3-border.png
Верхний левый угол сенсора Canon 1D-Mk3 (в новом окне)

Как видно на картинке, первые 3 строки рамки - это какой-то непонятный "мусор" с псевдо-случайными значениями. Следующие 17 строк - какие-то неясные, например там есть абсолютно черный (со строго нулевыми отсчетами) прямоугольник размером 64x8 пикселов. Зачем он - остается неизвестным.

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

Однако если увеличить контраст изображения, то видно, что структура левой стороны рамки - сложнее:

1d3-border-contrast.png
Тот же угол сенсора, увеличенный контраст

Вдоль всего края сенсора идет светлая полоса шириной 2 пикселя, величина сигнала на ней существенно (примерно на 15 единиц для изображения в исходном масштабе) выше, чем на окружающей рамке. С учетом усреднения на полную ширину рамки, эта светлая полоса даст примерно 0.5 единиц в среднее, после округления до целых это выльется в потерю стопа в тенях с вероятностью 50%.

Мораль из сего несложного упражнения такова: во-первых, доверять исходным текстам dcraw в деле получения изображения наивысшего возможного качества не следует. Во-вторых, похоже что для многих моделей камер процедура вычисления уровня черного должна быть индивидуальной. В плохом случае процедура такого вычисления будет зависеть еще и от версии firmware и/или версии камеры.

Comments

как вы относитесь к инициативе Sony обрабатывать данные ещё до записи в RAW? вроде как в Альфе шумодав (а может ещё что-то) применяется ещё до записи.

Вроде отвечал, а ответа не вижу. Кнопку забыл нажать???

В каком-то виде обработка и так есть, скажем вычитание темнового тока и оцифровка разницы.

Кроме того, вот это вот черное пятно 64х8 в данном примере - как мне подсказали, это попытка вычесть шумы аналоговой части ("мертвые" пикселы, принятые далее за нуль).

Вместе с тем, если та же рамка будет (умно - с учетом структуры сенсора и многоканальности АЦП) вычитаться прямо в камере, то в этом нет почти никакого вреда, ну кроме разве целочисленной арифметики с округлениями.
И тот же Кодак в SLR/c-n это и делает (а кроме того - еще и lossy-сжатие светов, тоже ничего плохого)

кстате из последних камер это вроде как относится как раз не к сони, а к никону в сравнении реализации одной и той же в основе матрице в А900 и Д3Х

И к Sony и к Никону и к Pentax.

Если брать относительно новые DSLR и задники, то по тому что я за последние дни пересмотрел (далеко не все, прямо скажем), "настоящий RAW" только у Phase One и у Кэнона.

У A900 и у D3X черный уже вычтен. И если у D3X есть какое-то подобие рамки (с коей, впрочем, пока неясно что делать, ну может быть поканальный шум оценивать, будем еще посмотреть), то у A900 в самом формате (который, я, правда, знаю из слов dcraw.c) нет под рамку места.

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

Правильно понимаю, что именно про это вычитание Вы говорили <a href="http://pavel-burov.livejournal.com/191443.html?thread=302803#t302803">здесь</a>?

Именно.

Но для анализа шума оно проще - ничего просто не надо вычитать. Для Canon наверное завтра будет готово (для CR2 уже работает, но надо для sRAW еще проверить, а CRW уже занимаюсь), там просто флажок в options появился.
Ну и сами данные рамки (в виде 8 прямоугольников в пределе) - тоже будут доступны.

Для остальных камер того же самого - чуть позже.

А вот для реального вычитания - не посмотрев на сампл с камеры (да еще для разных ISO) сделать нормальное вычитание я не понимаю как. Да и то, читая того же Kodak-а - не имея описания сенсора я конечно легко выделю те куски, где среднее отличается на глаз и потому не подходит. А вот если это от температуры зависит или от выдержки?

Счастья нет.

<em>> А вот для реального вычитания - не посмотрев на сампл с камеры (да еще для разных ISO) сделать нормальное вычитание я не понимаю как.</em>

Ага, мы пытались во время оно (в, ЕМНИП, 2005-м) этим заняться, в итоге пришли к выводу, что правильно&nbsp;&mdash; отбивать ряд &laquo;тёмных&raquo; (с закрытыми байонетом и видоискателем) снимков на разных ISO и выдержках, а потом для каждой камеры исследовать полученные данные отдельно (где-то можно обойтись простым вычитанием подставки в виде C+k&sdot;T, где C и k&nbsp;&mdash; константы, T&nbsp;&mdash; выдержка, где-то C может зависеть от столбца/строки и т.д.).

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

Однако жаль, что Canon, Sony и прочие не выкладывают datasheets, как Kodak.

Оно близко тематически, но не совсем одинаково.
Темновой кадр должен получаться одинаковым по шумовым характеристикам с темной рамкой (нужной ее частью).
Т.е. если про температурную неравномерность и разные каналы АЦП забыть, то вычитание (нужной части) рамки - то самое оно и есть.

вроде существуют достаточно стандартные процедуры отбрасывания слишком выбивающихся данных?

Да, но при этом полезно понимать про их структуру.

Скажем, если мы знаем что считывание двухканальное, четные столбцы в один АЦП, нечетные - в другой, то мы разделим все на две кучки и подавим banding.

Если мы этого не знаем или в своем знании ошибаемся, то получится сильно хуже, чем могло бы быть.

Тест 2

Насколько я знаю, 64х8 - "мёртвые" пикселы, предназначенные в качестве reference для аналогового тракта (шум считывания, усиления, конвертации в цифру). Так как эти шумы учтены в процессе конвертации в цифру, то этот блок в данных raw - всегда чёрный.

Неприятность ещё и в том, что часть данных рамки учитывается внутри камеры и не поступает на выход. То есть, описание рамки в спецификациях собственно сенсора - полнее и шире, чем рамка, доступная конвертору raw.

А какая там красота вылезла в верхней рамке у 5D2!

Похоже, мой тул "unprocessed_raw.exe" выиграет приз "мезурбаторский тул года"

Давно любуюсь.

С учетом усреднения на полную ширину рамки, эта светлая полоса даст примерно 0.5 единиц в среднее, после округления до целых это выльется в потерю стопа в тенях с вероятностью 50%.
А зачем нам уходить в целые числа раньше, чем при записи TIFF'а? Уже после всех WB, гамм и прочего-разного?

Низачем. Вместе с тем, очень мало программ, работающих с RAW в плавучке. Я знаю две.

Ну, мы же про библиотеку для будущего софта тут рассуждаем :)

Ну а в этом смысле задача LibRaw - выдать все как есть и ничего не трогать

стандартные процедуры изобретения велосипеда
Проблемами калибровки изображений астрономы занимаются давно. Странно что их наработки не используются, алгоритмы описаны, опубликованы и свободно доступны на arxiv.org. Сейчас в типовым методом является вычитанеие медианы строчки (или нескольких строчек), а вовсе не среднего. (гуглить по ключевым словам prescan+overscan+CCD)

Объяснение терминов "на пальцах" - http://astronomy.nmsu.edu/cwc/Software/CCD-calib.html

С инженерной точки зрения - это попытка убрать нестабильность ступеньки, смещающей сигнал в линейную область усилителя перед АЦП, т.е апроксимировать розовый шум по кусочкам (измеренным в области pre|overscan) в область где этот шум сложен с изображением. Медиана (возможно скользящим окном с захватом нескольких измеренных участков) справляется лучше, чем среднее. Выбор размера окна естественно зависит от схемы и характеристик чипа/усилителя/ацп.

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

Re: стандартные процедуры изобретения велосипеда
Я же пишу об археологии велосипеда, выкопанной из исходников dcraw (а из этих исходников оно кочует много куда).
В частности, пример с 1D-mk3 интересен тем, что усреднение делается не по той области, по которой следовало (ошибка не очень большая, но есть).

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

Что касается вычитания bias, то в разных камерах оно разным способом обстоит. Скажем, у свежих Nikon/Sony/Fuji - оно вычтено (при этом сенсоры очень близкие, но Nikon дает какие-то данные по pre/overscan, скорее всего усредненные, а Sony - нет).
У Canon - не вычтено (sRAW не рассматриваем). У PhaseOne есть два режима (и много всего другого интересного).

Вообще, я разнообразию форм жизни в этом месте не перестаю удивляться.

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

Извините, если совсем флуд и оффтоп. Меня сюда с фотоклуба.ру послали.
Вы не знаете, можно ли извлечь из raw-ки (например cr2, но не суть важно) изображение только из элементов за, например, красными светофильтрами?
Не могли бы вы сказать что-нибудь на тему того как это можно (если можно) сделать.
Не фотограф и не пытаюсь.
Но очень нужно.

Возьмите Libraw (готовый бинарный дистрибутив под Windows или Мак).
Программа 4channels сделает ровно то, что вы просите - 4 tiff-файла, разложенные по каналам.

Спасибо.