English
|
Nikon Coolpix 2500
Обработка данных в RAW формате
| |
Конвертер RAW в DNG: raw2dng.exe
Формат DNG появился в сентябре 2004 года и постепенно, хотя и очень медленно, набирает популярность.
Какие плюсы можно извлечь из этого формата?
Это открытый формат, который поддерживается
наиболее популярной программой Photoshop версий CS и более поздними. Наверное, (я не слежу) существует
какие-то еще программы для обрабоки DNG, скорей всего их будет становиться больше, хотя главное здесь не количество.
Появляется возможность записать и описать полученные неофициальными путями raw данные "честно", не маскируя их под известные модели камер.
Формат поддерживает сжатие и это очень хорошо, так как объем raw файлов - это их недостаток.
Имеет ли DNG минусы? Формат новый, развивающийся и имеющий пока мало практических реализаций.
К сожалению, даже сам конвертер Adobe написан не без ошибок, которые слегка
осложняют работу с DNG.
В версии 1.0.0.0 программисты Adobe забыли об одной особенности
формата lossless JPEG (шестнадцатибитные приращения кодируются только длиной). Не знаю на каких данных
эта ошибка может проявиться, с 12 битными данными она не проявляется. (В raw2dng файлы записываются
в формате DNG 1.0.0.0 с этой же ошибкой, а читаются с оглядкой на DNGVersion.)
Поле CFAPlanes отсутствует в LinearRaw, хотя присутствует в CFA. Это делает LinearRaw практически
бесполезным, при числе цветов более трёх (т.е. на не RGB матрицах)
сам формат сжатия не очень годится для сжатия CFA данных. Т.е. он неплох, но не оптимален.
Конкретно, достаточно трудно сделать предсказание значений по соседним отсчетам зеленого в пределах
одного блока из четырех отсчетов. Для этого нужно перемешать отсчеты, поставив два зеленых отсчета рядом.
Любое усложнение формата, даже в формальных рамках стандарта lossless JPEG, но не поддерживаемое Adobe DNG Converter
не может считаться стандартным. Именно поэтому raw2dng имеет опцию -c (compatible = true) по умолчанию, и
позволяет любой, записанный им файл преобразовать в стандартный для Adobe DNG Converter формат.
Кратко о формате, используемом в Adobe DNG Converter.
Это стандартный TIFF. Изображение разбивается на прямоугольные блоки (tile), каждый сжимается независимо от других.
Размер для RGB матриц 256x256, для CMYG 240x256. Поля справа и снизу дополняются нулями.
Данные внутри блока представлены в формате 2x1, т.е. каждая пара отсчетов в строке образует один пиксель.
Эти пиксели и подвергаются сжатию. Предсказатель используется только №1, то есть для предсказания используется
одноименная компонента предыдущего в строке пикселя. С формальной точки зрения это работает нормально, но если разбираться,
то получается в четных строках, к примеру, пиксели состоят из компонент RG (или CM), а в нечетных из GB (YG). В начале
каждой строки, кроме нулевой, предсказанием является значение из предыдущей строки (как и в стандарте JPEG), но
фактически получается "каша" - из G вычитается R, из B-G. Но поскольку это происходит только для первого пикселя
(пары отсчетов), то сильно это коэффициент сжатия не уменьшает.
В raw2dng я попробовал усложнить представление картинки - вместо двух я объединяю четыре отсчета в один пиксель
(два отсчета текущей строки и два следующей). Строки обрабатываются парами. Таким образом становится возможным использование любых предсказателей
из стандарта lossless JPEG. Программа перебирает все возможные и оставляет тот, с которым данный блок сжимается лучше.
Размер блока также оптимизируется чтобы минимизировать пустые поля справа и снизу. Поле справа заполняется копиями
последнего реального пикселя в строке, в поле снизу дублируется последняя пара строк. Все это улучшает сжатие. Не очень сильно, но заметно.
Для моей E2500 исходный трехмегабайтный файл сжимается в режиме совместимости на треть, а в оптимальном режиме в два раза.
Есть еще вариант, когда выполняется перебор по количеству блоков (тайлов). Это очень долго, но полезно чтобы раз и навсегда решить, что этого делать не надо.
Размер файла с оптимальным размером блоков отличается от выбранного по умолчанию на 16 Кбайт, при 7 мегабайтном выходном файле.
К тому же, оптимум полностью зависит от самого снимка и каждый раз нужно повторять полный перебор.
Коррекция битых пикселей
Стандарт DNG требует, чтобы битые пиксели уже были скорректированны перед записью DNG файла. Большинство камер делает это
перед записью raw (даже те, где raw неофициальный). Но камеры Panasonic (FZ-30, LX-1) записывают RAW без маскирования
черных пикселей, сигнал с которых всегда равен 0.
Поэтому я добавил возможность коррекции таких файлов, а за одно и коррекцию постоянно светящихся пикселей.
Программа получает файл dead_pix.txt (опция -d dead_pix.txt) со списком битых пикселей и маскирует их, то есть замещает другим пикселем.
Маскирование работает следующим образом.
Программа считывает восемь пикселей того же цвета вокруг маскируемого пикселя. Сортирует их и усредняет два значения из середины
списка. Для краёв ближайших пикселей будет пять, для углов три: в этом случае берётся значение из середины списка. Полученное
значение и записывается вместо битого пикселя.
Для подготовки файла dead_pix.txt можно использовать программу dead_pix.
dead_pix.exe
Для работы dead_pix.exe необходимо подготовить тестовые файлы. Для обнаружения постоянно светящихся пикселей необходимо сделать
снимок с закрытой крышкой объектива (а ещё лучше в полной темноте). Выдержка должна быть достаточно длинной, но при этом Noise Reduction
(вычитание темнового кадра) должно быть выключено. (Для автоматических камер годится режим FIREWORK, "Фейерверк".)
Дальше надо запустить dead_pix со следующими параметрами:
dead_pix -b -d dead_pix.txt black_raw_shot.raw
Здесь -b говорит программе, что это снимок черный, и надо искать яркие пиксели. Можно задать порог поиска -t100 -
чем он больше, тем меньше пикселей будет найдено. -d dead_pix.txt задает имя файла с таблицей битых пикселей.
Имя файла дано только для примера, оно может быть любым, и умолчания нет.
В принципе, я испытывал программу и на реальной фотографии с большим ISO и длинной выдержкой,
на камере с большим числом немаскированных битых пикселей. Программа находит тысячи пикселей, но результат получается
очень приличный в сравнении с исходником.
В любом случае, если снимок уже сделан, а камеры нет, то это хороший способ подправить фотографию.
Алгоритм поиска подобен алгоритму коррекции. Считываем восемь пикселей вокруг проверяемого и находим самый яркий из них.
Если разность значений проверяемого пикселя и самого яркого соседа больше порога - считаем пиксель битым.
Хочу обратить внимание: программа обнаруживает только одиночные светящиеся пиксели.
Пары пикселей с одинаковой светимостью обнаружены не будут. Но и вероятность этого крайне мала. (При большом желании можно добавить пиксели в список руками - файл текстовый.)
Для обнаружения несветящихся пикселей необходим снимок белого листа бумаги, сильно расфокусированный, с короткой выдержкой, не переэкспонированный (серый).
(В автоматических камерах можно использовать режим LANDSCAPE (Пейзаж), камера выставит фокус на бесконечность.)
Дальше надо запустить dead_pix со следующими параметрами:
dead_pix -w -d+ dead_pix.txt white_raw_shot.raw
Здесь -w говорит программе, что это снимок белый, и надо искать черные пиксели. -d+ dead_pix.txt заставляет дописать результат в указанный файл.
Программа находит только совершенно черные пиксели, с нулевым значением.
При испытаниях на реальном снимке, черные пиксели на светлом фоне, естественно, находятся хорошо. Но в темных областях так же много совершенно черных пикселей.
Тем не менее замена пикселей с нулевым уровнем на их соседей с уровнем в несколько единиц на глаз незаметно, а хорошо заметные пиксели на светлом фоне удаляются.
raw2dng.exe
Собственно программа raw2dng.exe написана на базе raw2nef.exe, изменился только формат выходного файла. Как и raw2nef.exe программа умеет читать raw данные полученные из камер Nikon Coolpix и некоторых других, близких по устройству, или имеющих технологические режимы сохранения raw. Формат этих данных задается в файле raw2nef.ini. Кроме этого, программа умеет читать свои собственные DNG файлы, DNG созданные в Adobe DNG Converter (2.x и 3.x), NEF файлы фотоаппаратов Nikon Coolpix 8700, 5700, 5400 (примеров 5000, 8400 у меня нет и их я не проверял), NEF файлы созданные raw2nef.exe, ORF файлы Olympus C8080WZ, C5050Z, SP500UZ (другие не проверял), RAW файлы Panasonic FZ30, LX1.
Для запуска программы достаточно запустить её, передав список исходных файлов. Подробности можно посмотреть в сообщении, если запустить её без параметров. У каждого файла программа заменяет расширение на DNG и записывает файл с получившимся именем. (Для DNG файлов она работает точно также, но раз расширение совпадает с исходным, файл будет перезаписан новым.)