обработка изображений

О Прогрессе

А сейчас, дети, мы возьмем обычный такой JPEG-файл. Не который JFIF, а который EXIF.

И попытаемся спроектировать код, который достанет оттуда цветовую информацию.

Возьмем в одну руку стандарты (EXIF 2.3, DCF2.0), а в другую - ПРАВДУ в виде описания тегов автором Exiftool, потому что Phil Harvey видел реальную жизнь, а авторы стандарта - нет.

Цветовая информация в EXIF может быть задана такими тегами.

  1. Тег InteropIndex: DCF Basic (sRGB), DCF Optional (формально это расширенное описание
  2. ...

О синем цвете и зеленых каналах: Panasonic G3

Я уже про это писал, но во-первых чисто умозрительно (на пальцах), а во-вторых не полностью верно, пришло время вернуться.

Чтобы не троллить больше владельцев Sony A77, возьмем для примера Panasonic G3. А именно, возьмем с imaging resource снимки мишени CoolorChecker и постараемся разобраться, что же камера с них выдает.

Вот прямо наложим на фото масочку-сеточку и посмотрим, что для каждого из патчей мы увидим в гистограмме.

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

Для начала, сформулируем тезисы, которые ниже я пытаюсь проиллюстрировать.

Суть проблемы (профилирования)

Проблему я формулирую так:

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

О legacy и форматах данных

Есть устоявшееся мнение, дескать обработка (изображений) в целых (16-битных) числах - это быстро, а делать то же самое в плавучке - медленно.

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

Имею сказать, что распространенный в настоящее время формат "16-битное целое на компонент" - это максимально неудачный способ с точки зрения эффективности обработки:

  • от малейшего чиха переполняется или превращается в тыкву обнуляется, нужно постоянно следить за диапазоном;
  • векторные (SSE,AVX) операции с этим типом - очень ограничены, да и не векторные - тоже.
В результате, сплошные мучения компилятору, а результат - медленно работает. Скажем, вот такой вот код (из dcraw), который делает преобразование по матричному профилю для 3-4 входных каналов (цветов) и трех выходных:
out[0] = out[1] = out[2] = 0;
for (сc=0;сc<colors;сc++) {
  out[0] += out_cam[0][сc] * img[сc];
  out[1] += out_cam[1][сc] * img[сc];
  out[2] += out_cam[2][сc] * img[сc];
}
for(=0;сc<3;сc++) img[сc] = CLIP((int) out[]);
img[] - unsigned short, out[] - int, out_cam[] - float.

Смотрю на код, который порождает интеловский компилятор. Ну код, да. (три-)четыре load по 2 байта (количество loads зависит от colors /количества цветов/), дальше "вручную" выписанный dot product (нормальный, насколько это возможно), ну и обрезание до диапазона 0-65к и store.

Скорость работы этого кода - 100 мегапикселей в секунду на Sandy Bridge 4.5Ghz (в один поток, понятно что параллелится это на ура). Как-то не очень....

Да, считаем в мегапикселях т.к. в unsigned short у нас 8 байт на (4-компонентный) пиксель, а для float/int - 16 байт.

Обилие демозаик

Тем временем, вышла LibRaw 0.12 (beta).

Усилиями контрибьюторов (как их писать на нашем, "вкладчики"?) была добавлена большая пачка разнообразных методов демозаики.

К несчастью, лицензионные ограничения не позволяют распространять все это богатство на тех же условиях, что и LibRaw (LGPL/CDDL), поэтому часть этих методов раздается отдельно, под соответствующими лицензиями:

  • Демозаика DCB и шумопонижение FBDD (автор: Jacek Gozdz) добавлена в основную LibRaw, ибо лицензия позволяет.
  • LibRaw-demosaic-pack-GPL2 включает в себя:
    • Алгоритмы, реализованные в Modified DCRAW by Paul Lee: VCD, modified AHD, AHD+VCD и модифицированные медианные фильтры.
    • Алгоритмы из Perfect Raw by Manuel Llorens (удивительно, но не нашел куда нормально дать ссылку): AFD и LMMSE
  • LibRaw-demosaic-pack-GPL3: AMaZE из RawTherapee 3 и подавление хроматических аберраций оттуда же.

Удивительное дело, но на тех снимках, на которых я тестировался (попались детские портреты) разница между алгоритмами - минимальна. Да, она есть, она видна на мелких деталях (а где же еще), но стоит ли овчинка того или нет - мне сложно сказать.

Ши-дэвыр 2

На меня тут наезжают, дескать на моих примерах разницу видно плохо. Не вполне чистая по методике исполнения, зато быстрая иллюстрация:

Исходник (кликабельно):

Результат наложения профиля Velvia 50 (тоже кликабельно):

Я не собираюсь утверждать, что это что-то феноменальное, кривая по L, потом Lab Color Boost от Маргулиса сделают что-то довольно похожее. Но вышепоказанное преобразование накладывается одной кнопкой и выглядит вполне "в меру". Ну и тени посинели, чистая вельвия :).

Это конверсия RAW со стандартными параметрами плюс профиль, больше вообще ничего.

Кнопка Шыдевыр

Павел Косенко, заполучив непубличную бету Raw Photo Processor с профилями пленки, дразнит своих читателей результатами финальной обработки.

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

Кроме того, я терпеливо дождался появления этой функциональности в публично доступной версии, вчера вышел RPP 4.1.3 в котором профили пленок есть.

На картинке слева - фрагмент изображения (жмякните, чтобы увеличить), к левой половине применен профиль V50 (Velvia 50) и снижен до -6 контраст (для изображения с богатыми тенями профиль Вельвии излишне контрастен), правая половина - рендеринг по-умолчанию. Впечатление, как вы можете видеть, что левую половину просто протерли тряпкой от пыли.

Естественно, подобный эффект легко достижим через, например, HIRALOAM (Unsharp Mask с HIgh-RAdius-LOw-AMount), но важно что профильное преобразование - локальное, с каждым пикселем отдельно, никаких нелокальных побочных эффектов вроде гало - не возникает.

Тайна розовых облаков

Если вы пользователь RAW-конверторов Adobe последних версий, то с проблемой, показанной на картинке слева, вы скорее всего никогда не сталкивались (или сталкивались, но не в таком масштабе). Большинство остальных конверторов, особенно основанных на dcraw (и LibRaw) имели ее в полный рост на многих камерах, в том числ на кэноновских (и для них - особенно заметно на дробных ISO, для последних моделей камер самые неудачные в этом смысле чувствительности находятся в ряду 160-320-640-1280).

Причина проста, тривиальна, но заслуживает рассказа о ней.

Вот берем, к примеру, Canon 50D.

14-битная камера, значит максимальное значение (насыщение) мы вправе ожидать равным 16383. Ну, после вычитания уровня черного - на ~1000 поменьше.

В реальности же это значение порядка 15750 (до вычитания черного) для ISO 200-250-400-500, 13400 - для ISO 100 и 125, 12800 для ISO 160-320-итд. И только для 6400 и 12800 имеем честные 16383, соответствующие общей теории всего.

Для разных экземпляров камер значение максимума немножко плавает, но сути дела это не меняет.

Про профили камер и про линейность

Вот этот вот комментарий, как мне кажется, заслужил отдельного обсуждения.

В самом деле, имеет место некий фенОмен (который виден, например, по dE т.е. инструментально):

  • C одной стороны, цифровые камеры в светах (но до начала блюминга) - высоколинейны. Т.е. отпрофилировав их в среднем тоне мы вправе ожидать приличных цветов и в светах.
  • C другой стороны, практика это опровергает, если снять цветовую шкалу +2 (без всяких вылетов) и наложить профиль камеры, то цвет уползет достаточно сильно (по меньшей мере, dE вырастет в разы)

Я тут вижу несколько соображений:

  • Во-первых, блюминг. И, наоборот, всякие антиблюминговые решения, которые должны характеристическую кривую загибать.
  • Во-вторых, всякие игры RAW-конвертеров (которые тоже характеристическую кривую загибают).
  • В-третьих, следующий интересный эффект:
    1. Давайте представим себе профилировочную таблицу, вроде ColorChecker SG. Вот на ней есть зеленый патч E9, который на 1.5-2 стопа (на глазок) ниже среднесерого.
    2. Уровень красного в этом зеленом будет еще на пару стопов ниже (красного в нем мало), потом у красного канала чувствительность на стоп-полтора хуже т.е. красным мы попадем куда-то в -5 от среднего тона (или -8 от самых светов).
      Это, на минуточку, вообще на пределе какого-то сигнала в красном.
    3. Но красный канал нужен, чтобы отличить сине-зеленый от зелено-синего т.е. в этом месте профиля красный будет с очень большим весом (т.к. сам сигнал - маленький).
    4. Но красный - зашумлен, в рассматриваемом месте он уже сильно нелинеен (по причине шума)
  • Собственно, вот: профиль для таких "предельных" цветов будет как-то компенсировать нелинейность слабых каналов, а если мы переедем на 3 стопа вверх - то перекомпенсировать (ибо на три стопа вверх в красном канале уже все отлично).

Такие дела.

Власти скрывают!

5D-green-vs-ACR.jpg
Покрупнее

На картинке

  • слева - зеленый канал из фотографии мишени для оценки динамического диапазона, остальные каналы экспонированы меньше и жизни там больше.
    Получено программой 4channels из LibRaw, никаких преобразований кроме растягивания на полный диапазон.
    Кадр проэкспонирован так, чтобы основной фон был на грани переполнения, еще треть стопа и переполнение наступает.
  • справа - тот же кадр, проявленный Adobe Camera Raw 5.3 с настройками default: стандартная яркость, экспокоррекция 0, остальное неважно.

Мы видим, что в зеленом канале жизнь есть. Да, детали на полстопа ярче фона видны плохо (чтобы их увидеть - нужно контраст поднять, но они там есть). А вот в проявленном RAW детали в светах пожрал хомяк ACR. Нет, если покрутить Exposure или Recovery, то все появится, но хочется обратить внимание на совершенно другое:

5D Mark II: рабочее ISO

canon-eos-5d-mark-II-top.jpg Как-то нет сил и времени писать на эту тему полноценных текст, поэтому пока в телеграфном режиме.

В моих экспериментах получается, что наибольший динамический диапазон (далее ДД) и наименьший шум у Canon 5D Mark II получается при ISO200. Выигрыш относительно ISO100 и 400 - порядка 0.3-0.5 стопа.

При этом шум оценивался по стандартному отклонению на серой плашке (как оптимально экспонированной, так и недодержаной на 1-4 стопа). При ISO100 шум визуально чуть менее крупный, но чуть более цветной. При ISO400 шум чуть побольше чем на 100 (и, естественно, 200), но все еще очень маленький

То же самое, кстати, касается и 450D: тот же характер изменения шума (с визуальным минимумом "крупности" на ISO100 и инструментальным минимумом на ISO200) и та же рекомендация: оптимальной чувствительностью является ISO200. Я про это уже писал и грешил на шумодав, но следов шумодава я не вижу (а следовательно, малошумящий усилитель есть добро).

О ДД и о цвете одной строкой

Рассматривал поканально тестовые шкалы (серое по серому с известным контрастом), усреднял, рисовал таблицы линейности, родил утверждение:

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

LibRaw Lite

почти копия анонса с сайта

По многочисленным заявкам нелюбителей GPL выпущена LibRaw-Lite

Как следует из названия, это облегченная версия LibRaw, основные отличия которой от полной версии таковы:

  • Лицензия LGPL, что позволяет использовать (немодифицированную) библиотеку в не-опенсорсных приложениях.
  • (увы) нет поддержки Foveon в силу лицензионных ограничений на этот кусок dcraw (откуда растут ноги у LibRaw). Мы работаем над этим и возможно предложим какую-то замену.
  • Нет целого ряда улучшений (сделанных нами относительно функциональности dcraw):
    • черная рамка (маскированные пикселы) не извлекается, эти пикселы приложению не доступны;
    • вычитание точки черного и прочая пред-интерполяционная обработка RAW-данных не отключается;
    • способ, которым получены цветовые данные (матрицы RGB-XYZ и т.п.) не запоминается;
    • нет поддержки OpenMP.

Другими словами, все то хорошее что мы сделали в расчете на разработчиков RAW-конверторов, анализаторов RAW и прочие программы, которым нужен доступ к исходным RAW-данным - в Lite-версии отсутствует.

Шумодав?

canon-450d.jpg Смотрю я, значит, на серый фон от своей любимой картинки снятый EOS 450D на двух чувствительностях, 100 и 200.

И видится мне, что на ISO100 оно заметно более шумное, стандартное отклонение в 1.5 раза отличается при одном уровне сигнала. И ладно бы, это было в обработанных кадрах, мало ли какой интеллект в конверторе, но ведь и в исходных данных разница в StdDev в те же полтора раза (смотрел в зеленом канале) при одном уровне сигнала. Разница устойчива и для кадров с недодержкой -1..-3EV, дальше не стал смотреть.

Никакого материалистического объяснения кроме шумодава перед записью RAW у меня нет, а у вас? Как детектировать шумодав, по мелким малоконтрастным деталям, которые должны съедаться? Какой бы объект поснимать.....

Динамический диапазон: вторая попытка

DR-image-8bit-small.jpgЭксперименты с газеткой дали мне вполне приличный объем данных о динамическом диапазоне камеры, однако продолжать упражняться с газеткой дальше (а ведь надо прощелкать полный диапазон чувствительностей, как минимум) мне не захотелось: критерии краев динамического диапазона все-таки были недостаточно четкими. Родилась идея сделать собственную мишень, для начала черно-белую.

Требований к такой мишени немного:

  • Известный контраст.
  • Несколько размеров деталей.
  • Отсутствие бликов.

Этим требованиям удовлетворяет мишень, напечатанная на струйном принтере "серым по серому" на матовой бумаге.

Динамический диапазон: первый подход к снаряду

Я уже столько раз ругался на измерения пресловутого ДД, что даже сбился со счета. Существующие в сети измерения меня не устраивают по куче причин:

  • Обычно методика описана очень приблизительно (при этом опубликованные результаты - странные).
  • Из (приблизительного) описания методики удается понять, что снималась контрастная мишень одним кадром, а такая съемка сама по себе проблемная по многим причинам:
  • Как правило, изучается различимость больших плашек, что не имеет большого смысла с точки зрения фотографической задачи: получения детализации в тенях и светах.

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

Еще раз о "динамическом диапазоне оптики"

5d-flare.jpg Эта тема уже обсуждалась, но на качественном уровне. Однако наделанный в последнее время инструментарий позволяет померять эффекты засветки количественно.

Сначала сформулируем вопросы:

  • Есть ли в системе оптика-камера значимое светорассеяние?
  • Каково же оно?

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

  • Берем монитор, заливаем его темно-серым (я брал R-G-B=6). Если ничем не заливать, то видна неравномерность подсветки.
  • Снимаем, чтобы это темно-серое гарантированно было выше уровня шумов камеры, но в глубокой тени. Я снимал с экспопоправкой (от спотметра) -5 EV, зная что общий динамический диапазон камеры (для больших плашек) никак не меньше 10 стопов, а вверх от спотметра есть запас чуть менее 4EV.
  • Выводим в углу монитора белый прямоугольник (см. картинку). На моем мониторе он на 8 стопов ярче "темно-серого", снимаем с той же экспозицией, что и в прошлый раз. Да, при этом контрасте белый прямоугольник еще не насыщен, даже в зеленом канале остается где-то треть стопа в светах. Т.е. можно говорить о довольно контрастной (8 стопов) сцене.
  • Усредняем серединки кадров необработанных данных (для извлечения необработанных данных использовалась программа 4channels из LibRaw, анализировался только зеленый канал) и сравниваем средние значения.

Шумел камыш

noise.jpg В комментариях к технике мезурбации в очередной раз всплыла тема оценки уровня шума.

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

Сначала о проблеме:

  • Вот, допустим, имеются камеры A и B, примерно одинаковой мегапиксельности и формата кадра.
  • Пусть, для удобства дальнейших рассуждений, максимальный уровень снимаемого сигнала (он же - приблизительно - разрядность АЦП) у этих камер одинаков, скажем 16000.
  • При формально одинаковой установленной чувствительности и одинаковой сцене - экспонометры на камерах покажут одинаковую экспозицию, совпадающую с показаниями внешнего экспонометра (разницей в методиках матричного замера пренебрежем, допустим мы замеряем серую карту спотметром).
  • Дальше мы экспонируем по экспонометру и получаем уровень сигнала в RAW для вышеупомянутой серой карты: для одной камеры - 1100, для другой - 2400 т.е. более чем вдвое (реальный headroom намеряный для современных 20+-мегапиксельных dSLR так и отличается, от 2.7 до 3.8 стопа).
  • В предположении, что уровень шума одинаков, получаем вдвое отличающееся отношение сигнал/шум.
  • Как следствие, при несколько разных методологиях мы можем получить заметно разные результаты (о чем я уже писал): одни напишут, что более шумная камера А, а другие - что камера B.

Другими словами, очень важное соображение о том, что "формальная" и "реальная" чувствительности - это две большие разницы не может игнорироваться методологией.

Еще о гистограммах

camera-histogram-2.jpg Почему-то никто из комментирующих вчерашний текст о чувствительности не захотел пойти дальше на один шаг. Все приходится делать самому:

Если точка серого занижена и конвертор (втч. внутрикамерный) делает пуш на 0.8-1.5 стопа, то ровно та же операция делается и для камерной гистограммы.

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

Уже где-то полгода мы вынашиваем планы по выпуску гаджета, который позволит кардинально улучшить качество съемки: это черная непрозрачная наклейка на экранчик камеры. Pro-версия должна быть не черной, а с характеристическими кривыми конкретной камеры при разных настройках и окошком для номера кадра.

Ручная работа!

5d2-mask.png

Если рассматривать черную рамку у 5D Mark II, взяв кадры с разных камер, то становится очевидно, что матрицы делаются вручную (китайские крестьяне в своих фанзах?). Вот, собственно, пример: два кадра (сложены слоями в фотошопе со смещением), оба ISO 100, камеры разные. У одного по верхнему краю просто насечки от шестеренки, а у другого - еще и темная полоса.

As RAW as possible

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

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

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

Pages

Subscribe to обработка изображений