Цели и задачи проекта LibRaw

Содержание

  1. Кому может быть интересен этот проект, и что мы хотим получить
  2. Цели и задачи
  3. Принципы сопровождения LibRaw
  4. Произведенные улучшения dcraw
  5. Планируемые улучшения

Кому может быть интересен этот проект

Предлагаемый вашему вниманию проект и порождаемый им программный продукт предназначены для:

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

Среди существующих сегодня относительно немногочисленных реализаций распаковки RAW-данных, получаемых с цифровых фотокамер, наиболее распространены и наиболее широко используются реализации на основе утилиты dcraw, написанной Dave Coffin. Ее популярность связана с тем, что трудно найти сколько-нибудь распространённую камеру, которая не была бы поддержана данной утилитой, а сам уровень поддержки распаковки весьма хороший.

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

Для энтузиастов же «входная стоимость» возможности проверки собственных идей и реализации собственных алгоритмов оказывается, зачастую, непомерно высокой: нужно либо пользоваться командной строкой dcraw (что приводит к обязательному использованию неотключаемых ранних стадий обработки), либо разобраться в исходном коде dcraw и поддерживать собственную библиотеку на ее основе.

Таким образом, неудобства, присущие dcraw, значительно сужают сообщество разработчиков и тормозят процесс развития и совершенствования конверторов RAW-формата.

Цели и задачи

При создании LibRaw мы хотим "получить библиотеку на основе dcraw, только лучше":

  1. "обиблиотечить" dcraw, т.е. разработать стабильный и консистентный API, пригодный для использования в других приложениях (RAW-конверторах, анализаторах данных, склейщиках панорам и так далее).
  2. Разделить на независимые части (группы вызовов API):
    • чтение, раскодирование и распаковку RAW-данных - и это основная функциональность LibRaw;
    • преобразования данных: интерполяцию, баланс белого и т.п.;
    • вывод результатов обработки в файлы.
      (Две последние группы функций поддерживаются, в первую очередь, для целей тестирования совместимости с dcraw)
  3. Улучшить процедуры извлечения и раскодирования RAW-данных (подробнее - ниже)
  4. Дать другим разработчикам "рамку" (бесплатную и в открытых исходниках), в которой можно было бы, например, экспериментировать со своими способами обработки RAW-данных (интерполяция, шумопонижение, баланс белого и так далее, возможные варианты приложения своих усилий частично перечислены выше), и создавать свои графические оболочки и интерфейсы, не разрабатывая RAW-конвертор целиком.
  5. Обеспечить лёгкость внесения изменений для синхронизации кода с релизами самой dcraw.

Принципы сопровождения LibRaw

  1. Повторить функциональность dcraw, взяв ее исходные тексты за основу, добиться бинарной идентичности (при одинаковых настройках) результатов работы dcraw и утилит на основе LibRaw.
  2. Избавляться от недостатков dcraw (о некоторых из них см. ниже улучшения dcraw и план работ).
  3. По мере совершенствования dcraw (поддержка новых камер, исправление ошибок, улучшение алгоритмов) - импортировать улучшения из dcraw в LibRaw.
  4. Изменения API: запланированные улучшения потребуют расширения API. Такие изменения будут делаться большими change-set-ами, а режимы совместмости со старыми приложениями будут сохраняться, насколько это возможно.

Произведенные улучшения dcraw

На момент написания данного текста в LibRaw внесены следующие дополнительные улучшения относительно исходного кода dcraw:

  • Полностью убраны глобальные переменные (а при сборке thread-safe варианта - и статические переменные функций).
  • Thread-safety. Пример использования в многопоточном режиме включен в поставку библиотеки.
  • Извлекаемые из RAW-файла данные несколько структурированы: геометрия отдельно, цветовые данные отдельно. Эта работа еще не закончена и будет продолжена одновременно с работой над улучшением обработки EXIF.
  • Извлечение RAW-данных и thumbnail может быть сделано за 2-3 вызова API с очень простым программным интерфейсом.
  • Работа с цветовой информацией: для цветовых данных (коэффициенты баланса белого, тоновая кривая и т.д.) добавлены флаги, показывающие, откуда эта информация: извлечена из RAW-данных, вычислена по самому изображению, взяты константы из кода.
  • Извлекается ICC-профиль (для тех RAW-файлов, где он есть)
  • Само изображение и thumbnail можно извлечь последовательными вызовами, без переоткрытия файла и перезапуска библиотеки.
  • Несколько снижены требования к необходимому количеству оперативной памяти
  • Работа с маскированными пикселями и уровнем черного: возможно отключить обязательное вычитание уровня черного и фильтрацию нулевых пикселов

Планируемые улучшения

Код dcraw нуждается в существенных изменениях и дополнениях:

  • Выдача распакованных данных в различных memory layouts: в зависимости от потребностей вызывающей программы, результаты распаковки RAW будут выдаваться в одном из вариантов, выбираемом на runtime:
    • 4-компонентные пиксели (внутренний формат данных dcraw)
    • байеровский формат: двумерный массив, каждый элемент которого соответствует пикселю матрицы
    • 4 двумерных массива (по одному на каждый компонент)
  • Однопроходная распаковка RAW-файлов с несколькими вариантами изображения: для тех камер, где это применимо (камеры FUJI, камеры с режимами 4-shot/16-shot) будут извлекаться несколько планов одного изображения.
  • Работа с краями диапазона значений: минимальными значениями (часто называемыми точкой черного) и максимальными значениями (точкой насыщения).
    • Вычитание точки черного уже сделано необязательным. В следующие версии LibRaw будет включен код, выполняющий вычисление уровня черного специфическим для конкретной камеры способом.
    • Максимальные значения так же могут быть разными по каналам, соответственно и эти значения надлежит рассчитывать на этапе распаковки RAW-данных и выдавать в рамках API. Вычисление максимальных значений для конкретного экземпляра камеры при конкретной чувствительности (калибровка конвертора) - задача приложения, вызывающего LibRaw.
  • Работа с черной рамкой: данные, считанные с черной рамки (или двух черных рамок - для тех камерах, где их две) нужно делать доступными в вызывающем приложении (это может оказаться желательным, а порой, для некоторых типов камер - и необходимым для подавления определённых типов артефактов, в частности - banding'а).
  • Верификация распаковки данных для максимального набора форматов файлов. Существует мнение, что некоторые форматы данных dcraw распаковывает не вполне корректно.
  • Работа с EXIF/Makernote: извлечение данных в большем объеме, в частности:
    • Извлечение максимально возможного количества данных о цвете (настройки баланса белого, профиль, тоновая кривая, настройки контраста и т.п.)
    • Генерализация данных о цвете: приведение цветовых данных от различных камер к "общему знаменателю" с целью упростить обработку цвета (без потери качества обработки).
    • Извлечение данных о камере (версия firmware, серийный номер)
    • Извлечение данных о кадре (оптика, дистанция фокусировки, фокусировочные точки и их координаты и т.п.)
    • Извлечение полного массива EXIF-данных без анализа структуры с целью облегчения копирования EXIF-данных в выходные файлы.
  • Генерализация работы со сложными форматами, в частности:
    • RAW-файлы от камер Fuji (с двумя наборами сенсоров)
    • RAW-файлы от задников с режимами 4-shot и 16-shot
  • Технологические улучшения, в частности:
    • Извлечение ICC-профиля (для тех RAW-файлов, где он имеется).
    • Уменьшение объемов аллоцируемой памяти в тех случаях, когда постобработка не будет вестись в том же буфере, куда были прочитаны RAW-данные.

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