Цели и задачи

[вернуться к оглавлению]

# Цели и задачи проекта 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).

[вернуться к оглавлению]

Last modified: Mon May 4 22:11:50 MSD 2009