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

О Прогрессе

А сейчас, дети, мы возьмем обычный такой 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 и постараемся разобраться, что же камера с них выдает.

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

Для...

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

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

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

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

  • от малейшего чиха переполняется или превращается в тыкву обнуляется, нужно постоянно следить за диапазоном;
  • векторные (SSE,AVX) операции
  • ...

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

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

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

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

  • Демозаика DCB и шумопонижение FBDD (автор: Jacek Gozdz) добавлена в основную LibRaw, ибо лицензия позволяет.
  • LibRaw-demosaic-pack-GPL2 включает в себя:
  • ...

Ши-дэвыр 2

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

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

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

Я не собираюсь утверждать, что это что-то феноменальное, кривая по L, потом Lab Color...

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

Павел Косенко, заполучив непубличную бету 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)....

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

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

В самом деле, имеет место некий фенОмен (который виден, например, по 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 стопа.

При этом шум оценивался по стандартному отклонению на серой плашке (как оптимально экспонированной, так и недодержаной...

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

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

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

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

Canon EOS 5D Mark II, холст, масло ISO100, дневное освещение. При искусственном - красный ведет себя получше, синий - много хуже, отчего вариации цвета лица (в тени) тоже будут не очень.

Морали:

  • Спешу напомнить, что на данной камере -7EV от насыщения зеленого - это всего-то 3.3EV от среднесерого по ее экспонометру. Поверил экспонометру - испортил тени.
  • (Управляемое) понижение контраста сцены - есть благо.
  • Если вы используете HDR-софт, то спрашивайте у производителя, как именно он вынимает тени - смешением значений или выбором из вариантов. Смешанных - не берите.

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, примерно одинаковой мегапиксельности и формата кадра.
  • Пусть, для удобства дальнейших рассуждений, максимальный уровень снимаемого
  • ...

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

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

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

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

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

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

5d2-mask.png

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

Вообще, удивительное это дело - RAW-файлы. Вот, скажем, Sony. Если я правильно помню порядок выхода камер, то это A100, A700, A300, A350, A900. При этом, у A700 и A900 - один формат данных, а у остальных - другой. Более того, у "любительских" камер есть та самая черная рамка (с коей я тут бьюсь), а у более продвинутых - нету и формат данных не позволяет ее вставить.

Или вот Pentax - уверенно чередует методы паковки в PEF-файлах в разных своих камерах. Понятно, что когда меняется битность, а старый формат был рассчитан, скажем, на 12 бит - тогда его придется менять. Но откуда берется зоопарк?

Нет, я вот уже больше 20 лет коммерческим программированием занимаюсь и знаю откуда берется legacy code. Но видя этот зоопарк не приходится предполагать, что производители камер знают что они делают (как часто приходится читать).

As RAW as possible

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

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

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

Pages

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