dcraw

Про Sony ARW2 Hack

Да, в процессе разборок с битностью у Sony осознал про Sony ARW2 Hack (была такая опция в LibRaw и RawDigger):

Так как до A99 все cRAW-камеры были, по факту, 12-битными и менее, то использованный в dcraw способ распаковки, когда cRAW-данные после применения кривой делились на 4, не приводил к фатальной излишней и немотивированной потере уровней в полутонах-тенях.

Зато уровень черного для cRAW и 12-битных RAW оказывался согласованным и одинаковым (как я уже писал, у A900 в EXIF уровень черного записан для cRAW, хотя в 12-битном режиме он вчетверо ниже), диапазоны данных - почти одинаковыми (для cRAW практический диапазон после деления на 4 будет 4150, Коффин резал по уровню 4095, невелика беда).

Короче, сплошная польза. Была.

С появлением A99/A7/RX1 такое обрезание стало вредным, теряется крайне желательный бит в тенях.

Если кто пользуется RawTherapee/UFRaw и прочими конверторами на базе dcraw - вы передайте их авторам.

Сайд-эффектом было то, что при рассматривании всяких гистограмм Соневские камеры выглядели 12-битными (по диапазону), что немножко путало.

P.S. Я там в начале не оговорился, этот самый Hack из LibRaw/RawDigger в следующих версиях пропадет, дабы убрать путаницу.

О процессинге RAW: плавучка или целое

Обработка RAW в плавучке позволяет избавиться от артефактов вылета за диапазон, да и вообще получить более качественную картинку.

Тем интереснее обратные случаи.

Возьмем вот такой вот кадр:

Это D800 с его приколами в светах, вот на света и посмотрим.

Если обработать картинку dcraw (или LibRaw, которая дает побитово такой же процессинг, если автоматическое определение максимума отключить), то в светах в "середине верха кадра" мы увидим такое вот:

свежие версии LibRaw

Для читающих анонсы тут, а не на libraw.su/org

Вышли новые версии LibRaw. Все изменения довольно существенные:

  • Поддержан Pentax K2000/K-m
  • Поддержана правильная распаковка sRAW от Canon 5D Mark II с последней версией firmware
  • При использовании встроенного постпроцессинга можно задать свою gamma-curve (с опциональным линейным участком в начале)

DNG, уровень черного и dcraw

В стандарте DNG 1.2 правильной поддержке уровня черного уделена масса внимания: можно задать базовый паттерн произвольного размера с разными уровнями (скажем, поканальными) и коррекцию этого паттерна для каждой конкретной строки и столбца. Для большинства практических применений этого достаточно, нормально описать таким способом нельзя, пожалуй, только неповернутый паттерн Fuji SuperCCD.

Надо сказать, что Adobe DNG Converter креативно пользуется этими возможностями. Скажем, для новых камер Canon (смотрел 50D и 5DmkII) считается только базовое значение, тогда как для старых (смотрел 400D) считается уровень черного для каждой строки. И это правильно, товарищи!

Но вот dcraw, а за ней и все приложения, использующие её код, начиная с LightZone и ACDSee, а заканчивая LibRaw, поступают с этими данными тупо и глупо: все что есть в DNG-файле усредняется и это среднее вычитается из всех значений.

Естественно, это все касается только тех форматов данных, где вычитание базового черного не делает сама камера. Из распространенных - это камеры Canon (все), ряд моделей Sony и многие P&S камеры.

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

Пользователи LibRaw будут со временем осчастливлены кодом получше, а вот пользователям других производных от dcraw я бы посоветовал форматом DNG без нужды не увлекаться.

RAW еще сырее: LibRaw 0.7.0-A4

Отрываю ненужные куски от LibRaw (попавшие туда из dcraw) и никак не могу остановиться. В очередной версии сделал отключаемым пропускание RAW-данных через тоновую кривую.

Естественно, этот режим работы может быть интересен только тем, кто сам пишет RAW-конверторы или анализаторы RAW или подобные вещи. Ну и любопытствующим, ибо поставляемый в составе библиотеки пример unprocessed_raw (в версиях под Win32/Mac/Linux он лежит скомпилированным и готовым к использованию) способен эту опцию включить и показать ваши данные прямо как они из файла раскодированы.

Тоновая кривая есть не во всех камерах и форматах данных, среди распространенных это Nikon (compresssed NEF) и Sony A700/A900 (8-битный cRAW)

Достаточно очевидно, что от тоновой кривой нет вреда (или практически нет вреда) если выходное пространство шире чем входное, скажем из 8 бит делаем 12 (как оно у Sony). А вот если входное и выходное пространство имеют одинаковую битность, а кривая отлична от линейной, то мы обязательно потеряем градации. Такое должно случаться, насколько я понимаю, с 12-битными NEF-ами, было бы прикольно, если бы кто-то проверил.

Аналогично предыдущему анонсу просьба: если unprocessed_raw -N падает на каком-то файле, то я хочу этот файл пощупать.

LibRaw 0.7.0 Alpha-3: еще более RAW

Я точно знаю, что есть люди, читающие анонсы LibRaw именно здесь, остальным придется потерпеть.

В третьей альфе LibRaw 0.7.0 случились две группы существенных идеологических изменений и одна группа несущественных:

  1. Данные для камер FujiFilm распаковываются без поворота на 45 градусов. Это открывает путь к легкому получению 12-мегапиксельных картинок с Fuji S5Pro и прочим подобным радостям. При этом, горизонтальное разрешение должно быть заметно лучше, чем у 6-мегапиксельных, выдаваемых dcraw и всеми использующими этот код.
    Посмотреть на реальные RAW-данные Fuji можно с помощью примера unprocessed_raw, очень поучительно (чтобы извлечь второй кадр, используйте ключ -s 1).
  2. Не менее сильно поработали над PhaseOne:
    • Придуман и для PhaseOne реализован режим (не)фильтрации данных, отключающий тоновую кривую для RAW (более raw-данных вы еще не видели!). Идея мне настолько понравилась, что в следующих версиях тоновую кривую можно будет отключить для всех случаев, когда она есть (Nikon NEF, Adobe DNG, далее везде).
    • Рассчитанные камерой уровни черного доступны в метаданных
    • Исправлена ошибка расчета уровня черного, имеющаяся в dcraw (впрочем, на результат она влияет не очень сильно).
  3. Ну и по мелочи: баги, ключ -s у unprocessed_raw, импортирована свежа версия dcraw.

Более подробно и более формально в changelog, скачивать с той же страницы

Я очень заинтересован в фидбеке, прежде всего в примерах файлов, с которыми вышеописанное чудо не смогло справиться (упало, выдало не то и так далее).

Применение психотропных препаратов к обработке RAW

psychotropic_drugs.jpg В процессе подбора правильных психотропных препаратов для целей программирования правильного чтения черных рамок у RAW-файлов с камер Fuji (SuperCCD) я на эти данные внимательно посмотрел и... фалломорфировал удивился.

Если мы посмотрим в исходники dcraw (или результат работы dcraw -j), то увидим, что при распаковке файлов от Fuji SuperCCD делаются такие вот шаги:

  • Сначала при распаковке пересчитываются координаты, таким образом в выходной битмэп пишется изображение, повернутое на 45 градусов (для разных камер - вращения в разные стороны).
  • Потом это изображение вращается еще раз, уже с интерполяцией данных (в dcraw - билинейная интерполяция, про другие конверторы - не знаю).

Увидев один раз повернутое, я до сегодняшнего дня был убежден (не вчитываясь в код), что это отражает организацию сенсора: строки идут под 45 градусов по диагонали (длина строк, соответственно, разная), а дальше надо просто повернуть.

Сегодня же, выспавшись, полез разбираться в деталях. Детали, прямо скажем, удивительные относительно того знания, которое было в голове.

Универсальный (нецензурно) архивный (нецензурно) формат

О сколько нам открытий чудных....

DNG мы уже пинали с примерами, но пинали мягко, оставаясь в рамках Adobe workflow. Там проблемы, которые создает DNG заметны, только в довольно экстремальных ситуациях.

Но вот если мы живем не Адобом единым, то жизнь становится куда веселее. Вот к примеру LighZone. Отличная по своим идеям программа, все такое, но вот распаковку RAW там делают запуском внешней dcraw.exe.

LibRaw 0.6.0 Beta1

По требованиям французских и немецких трудящихся, была добавлена разнообразная функциональность:

  • Обработанное изображение можно получить в виде RGB-битмэпа (ранее только в виде квадрупляев R-G-B-unused)
  • Добавлены вызовы для индикации стадий обработки (рисования прогресс-баров) и досрочного прекращения обработки.
  • Добавлена работа с профилем камеры/выходным профилем через LCMS
  • Вспомогательные вызовы: получение списка поддерживаемых камер, получение информации о версии.
  • поддержка работы с картой плохих пикселей и вычитанием темнового кадра.
  • поддержка OpenMP для AHD-интерполяции и шумопонижения.
  • исправлена одна ошибка в adjust_sizes_info_only

Скачать эту версию можно c сайта LibRaw со страницы downloads в разделе бета-версий.

LibRaw имеет шансы появиться в digiKam, куда оно проникает через libkdegraphics.

О счете с нуля

На сайте dcraw читаем:

Supports 306 cameras at last count

Потом идем к списку камер и считаем. Получается 307.

Программисты......

LibRaw 0.5.4

Вышла LibRaw 0.5.4. Краткий список изменений:

  • Импортирована последняя версия dcraw (8.87), добавлена поддержка шести новых камер: Canon 1000D, A720, SD300; Nikon D700, Olympus E-520,Kodak C603.
  • Ввод-вывод через mmap() заменен на (старый) ввод-вывод через FILE. Скорость не пострадала, памяти нужно меньше.
  • Лицензирование изменено с GNU GPL v3 (или новее) на GNU GPL v2 (или новее).

Пользуюсь случаем, чтобы напомнить:

LibRaw - это библиотека для чтения RAW-файлов, получаемых с цифровых фотокамер (CRW/CR2,NEF,RAF,DNG и других).
LibRaw основана на исходных текстах утилиты dcraw, часть недостатков которой исправлена, а часть будет исправлена в дальнейшем. Пользователям библиотеки предлагается API для встраивания в свои программы.
Если вы не программист, а фотограф, то вам может быть полезна входящая в поставку утилита half_mt, которая функционально эквивалентна dcraw -h, но на многопроцессорных/многоядерных машинах работает в разы быстрее.

Поканальные шумы и RAW-конверторы

Продолжаем серию анонсов

О шумах в каналах и о RAW-конверторах
и английский перевод: Channel Noise and Raw Converters

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

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

Экспериментальная проверка оказалась элементарной - один кадр, три конвертора, пять результатов конверсии..

Искусство программирования

Потихоньку ковыряю исходники dcraw

Жесть: после отпиливания (по живому, расстановкой #if 0 в почти произвольных местах) примерно 3/4 программы (из 8500 строчек осталось 2500), остаток продолжает довольно осмысленно работать. Не удивлюсь, если он регенерирует к утру.

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

Subscribe to dcraw