![image](https://habrastorage.org/getpro/habr/post_images/45c/24d/f97/45c24df97cfd6b9706498cc3233ba6f6.jpg)
Когда большинство людей делает фотографию, им просто нужно нажать кнопку спуска на фотокамере или телефоне, и готовое к просмотру изображение, обычно в известном формате JPEG, почти мгновенно появится на экране. Однако для некоторых случаев требуется больше контроля над получением этого самого JPEG. К примеру, вам может захотеться увеличить или уменьшить активность функции удаления шума, или вам может показаться, что цвета получились не совсем верно.
И тогда на помощь приходят файлы RAW. В данном контексте необработанное (raw) изображение – это прямая передача данных, полученных от пикселей фотоматрицы, и не прошедших дополнительную обработку. Обычно такие файлы имеют относительно стандартный формат байеровского изображения, названный в честь Брайса Байера, изобретшего эту технику в 1974 году во время работы на компанию Kodak. Идея в том, чтобы не дать имеющемуся на борту процессору обработки изображений (ISP) превратить необработанное байеровское изображение в пригодное для просмотра, а сделать это самостоятельно при помощи отдельной программы, которую обычно называют конвертером RAW.
![](https://habrastorage.org/getpro/habr/post_images/7dc/9b9/2a1/7dc9b92a1d5f59d95a4e623499533dfe.gif)
Байеровское изображение записывает только один цвет для каждого из пикселя по приведённой схеме
Иногда необработанное изображение сравнивают со старой технологий фотографического негатива, и хотя многие производители фотокамер используют собственный формат, наиболее распространённым видом файла RAW является формат Digital Negative [«цифровой негатив»] (или DNG), описанный Adobe в 2004. Остаётся вопрос – как получить DNG-файлы от Raspberry Pi так, чтобы обработать их при помощи любимого конвертера RAW.
Получение необработанного изображения от Raspberry Pi
Многим читателям будет знакомо приложение raspistill, получающее изображения формата JPEG с камеры. У raspistill есть команда –r, дописывающая в конец файла JPEG необработанные данные. Программы для просмотра JPEG всё равно покажут этот файл как обычно, проигнорировав многие мегабайты необработанных данных, прикреплённых сзади. Такой файл JPEG+RAW можно получить про помощи команды в терминале:
raspistill -r -o image.jpg
К сожалению, формат JPEG+RAW – это просто то, что выходит из камеры, и он не поддерживается конвертером RAW. Чтобы воспользоваться им, нам нужно преобразовать его в формат DNG.
PyDNG
Данная утилита преобразовывает собственный файл JPEG+RAW Raspberry Pi в DNG. PyDNG можно поставить с github.com/schoolpost/PyDNG, там же есть и более развёрнутая инструкция. Вкратце, нам надо выполнить следующие шаги:
git clone https://github.com/schoolpost/PyDNG
cd PyDNG
pip3 install src/. # для PyDNG требуется Python3
PyDNG можно использовать как часть более крупных скриптов на Python, или запускать самостоятельно. Продолжая пример с raspistill, мы можем ввести в строку ввода:
python3 examples/utility.py image.jpg
Полученный файл формата DNG можно обработать различными конвертерами RAW. Некоторые из них бесплатные (к примеру, RawTherapee или dcraw, хотя последний уже не разрабатывается и не поддерживается), а ещё есть много известных коммерческих вариантов (Adobe Camera Raw или Lightroom).
Баланс белого и цветовые матрицы
Одна из проблем с обработкой файлов RAW с Raspberry Pi на этом этапе связана с получением осмысленных цветов. До этого изображения рендерелись с уклоном в зелёный, поскольку не проводилось никакой балансировки цвета, а зелёный – обычно наиболее чувствительный цветовой канал. Что ещё хуже, поскольку значения RGB в необработанном изображении просто отражают чувствительность пикселей датчика к различным длинам волн, они априори не точно коррелируют с теми цветами, которые мы воспринимаем глазами. Именно тут нам и пригодятся баланс белого и цветовые матрицы.
Нам требуются правильные множители белого для того, чтобы нейтральные части сцены выглядели нейтральными. Мы можем использовать обоснованное предположение от raspistill на их счёт, содержащееся в файле JPEG+RAW (или вы можете измерить собственное значение на каком-либо участке снимка – например, на серой карточке). После этого для преобразования цветов, полученных с камеры, в цветовое пространство типа sRGB или Adobe RGB потребуются матрицы и справочные таблицы.
Результаты
Предыдущие попытки конвертации RAW и итоги, полученные после применения обновлённой версии PyDNG.
![](https://habrastorage.org/getpro/habr/post_images/2d2/f71/647/2d2f71647243a27eafd8b23d5352e484.jpg)
![](https://habrastorage.org/getpro/habr/post_images/234/113/44b/23411344b5c2ca2e1894840a6e43156a.jpg)
![](https://habrastorage.org/getpro/habr/post_images/a00/234/5ca/a002345cae69603dc1aad7cbb782ea89.jpg)
![](https://habrastorage.org/getpro/habr/post_images/b94/476/84a/b9447684a4211f90ad60d513855eb471.jpg)
![](https://habrastorage.org/getpro/habr/post_images/15d/10c/740/15d10c7403aa271680241919a18d576a.jpg)
![](https://habrastorage.org/getpro/habr/post_images/c15/d1d/99a/c15d1d99a541e4291644895c6d08be4d.jpg)
![](https://habrastorage.org/getpro/habr/post_images/005/3ba/7cc/0053ba7cc09cecd4aded9a6ef14e8bc4.jpg)
![](https://habrastorage.org/getpro/habr/post_images/a7b/91e/441/a7b91e4416b11713ec5b43f5df5f49c5.jpg)
![](https://habrastorage.org/getpro/habr/post_images/78c/b28/86f/78cb2886ff0a0a63a148562f7ac39e4a.jpg)
![](https://habrastorage.org/getpro/habr/post_images/45c/24d/f97/45c24df97cfd6b9706498cc3233ba6f6.jpg)
Файлы DCP
Для людей, знакомых с файлами DNG, мы приводим ссылки на файлы DCP (DNG Camera Profile) с профилем камеры (в двоичном формате). Попробуйте разные файлы, мы поощряем пользователей на эксперименты, на создание собственных файлов и на публикацию полученных результатов!
- Базовый цветовой профиль, встроенный в PyDNG, результаты его работы приведены выше. Он относительно мелкий, и его можно посмотреть в виде файла JSON.
- Улучшенный профиль большего размера со справочными таблицами для сбалансированного рендеринга цветов.
- Похожий на предыдущий, но с некоторыми исправлениями для улучшения цвета кожи и неба.
Однако у этих файлов есть несколько особенностей:
- Они откалиброваны для одной определённой Raspberry Pi High Quality Camera, а не для некоего среднего «типичного» модуля.
- Источники света были те, что оказались у нас под руками – в особенности, кажется, что лампа D65 передаётся немного неточно.
- Калибровка работает только если цветовая температура не сильно отличается от двух источников цвета, участвовавших в калибровке – в нашем случае это диапазон от 2900K до 6000K.
Поэтому тут ещё есть, что улучшать. Тем не менее, испытания на многих модулях показали, что эти параметры являются значительным шагом вперёд.
Благодарности
Джеку Хогану – за калибрацию цветовой матрицы при помощи DCamProf, Цсабе Наги – за добавление новых особенностей в PyDNG.
Дополнительные материалы
- Существует много ресурсов, описывающих преобразование необработанного байеровского изображения в пригодное для просмотра изображения формата RGB or YUV. Например, статья в блоге Джека.
- Чтобы понять роль цветовых матриц, которую они играют в файле DNG, обращайтесь к его спецификации. В частности, это описывается в главе 6.