eddy_em: (Костерок)
eddy_em ([personal profile] eddy_em) wrote2017-02-01 08:32 am
Entry tags:

Дебайеризация

Что-то сильно расхваливаемый авторами алгоритм дебайеризации дает довольно-таки много артефактов:
BGGR
Работает, кстати, медленно. Код мало того, что не оптимизирован, так еще и авторы зачем-то почти чистый (ну, заменить new на malloc, а delete на free — и будет совсем чистый) сишный код в cpp файлы запихали.
Ищу дальше...

[identity profile] p2004r.livejournal.com 2017-02-01 10:11 am (UTC)(link)
Я бы не тестировал это на "комнатных" снимках, лучше сразу на небо направить.

[identity profile] eddy-em.livejournal.com 2017-02-01 11:35 am (UTC)(link)
В принципе, да: надо будет несколько ночных снимков сделать, чтобы было с чем сравнивать.
Может быть сойдет тупая билинейная интерполяция.
Вообще же, главное — не цветную картинку получить (толку от нее 0), а как можно лучше избавиться от влияния этой дурацкой маски Байера. Я вообще поражаюсь: какой мудак мог придумать наклеивать на all-sky камеру фильтр Байера?! Дело в том, что для упрощения вычисления координат звезд фон желательно сделать равномерным.
Хотя, может быть сойдет и такой вариант: тупо уменьшить разрешение в 2 раза, сложив значения пикселей в каждом квадрате, а по результирующему изображению уже звезды искать и определять процент облачности. Я даже на подобное именно для этой матрицы натыкался, но там было для питона, что совсем нехорошо.

[identity profile] dimas.livejournal.com 2017-02-01 11:40 am (UTC)(link)
А там какой-то специфический формат рава или что-то бол-менее стандартное?
Может попробовать Тутубалинский LibRaw, который на базе dcraw, если правильно помню ...

[identity profile] dimas.livejournal.com 2017-02-01 11:41 am (UTC)(link)
Кстати, трактовка некоторых вещей С-ным компилятором и С++-ным может отличаться ... так что может cpp там и неспроста :)

[identity profile] eddy-em.livejournal.com 2017-02-01 11:48 am (UTC)(link)
Там 16-битный АЦП и маска BGGR. Управлялку по RS-232 я уже почти закончил (остается еще доделать управление наклонами камеры, но это не сильно-то нужно). Сейчас пилю визуализатор (т.к. картинку надо в веб-морду выводить, я как-то приводил скриншот этой морды), который должен отображать красивости (тут наплевать на точность передачи данных, лишь бы облачность видно было) — привожу к 8-битному изображению, эквализируя гистограмму с обрезкой 2% снизу и сверху и пытаюсь как-нибудь дебайеризовать. Простейший способ — понижение разрешения в 2 раза — не прокатит в данном случае, т.к. картинка станет совсем уж мелкой.

[identity profile] dimas.livejournal.com 2017-02-01 12:03 pm (UTC)(link)
Как вариант - попробуй написать Тутубалину, он вроде на разнообразных форматах собаку съел, он же и эту либу поддерживает, и софтина у них есть для просмотра рав файлов, может что посоветует для разбора.

[identity profile] eddy-em.livejournal.com 2017-02-01 12:23 pm (UTC)(link)
Мне софтины не нужны, надо просто готовый набор байтиков — изображение с маской Байера — преобразовать в другой набор байтиков — цветное RGB изображение.

В принципе, учитывая то, что изображение неба — это практически один сплошной фон, можно попробовать элементарнейшим образом сделать: компоненты R, G и B по-отдельности (соответственно, уменьшенное в 4 раза изображение; компоненту G брать как среднее в каждом квадрате) усреднить медианой 3х3, таким образом получить значения дополнительных цветов в каждом квадрате. Оригинальные компоненты оставлять без изменения, а к ним добавлять полученные дополнительные. В итоге и звезды останутся на изображении, и цвет будет.

Попробую этот алгоритм завтра.

[identity profile] dimas.livejournal.com 2017-02-01 01:08 pm (UTC)(link)
Ты как будто читаешь через строчку :) У него кроме софтины есть либа, libraw. И с этим вот вычитанием фона и прочим он уже не одну собаку съел. Но если хочется изобретать велосипед ...

[identity profile] eddy-em.livejournal.com 2017-02-01 01:25 pm (UTC)(link)
Напрямую что-то не хочется писать, а сишных примеров я под эту libraw что-то не нахожу. Поищу, может и правда не нужно будет ничего велосипедить.

[identity profile] dimas.livejournal.com 2017-02-01 01:56 pm (UTC)(link)
посмотри сам dcraw, он кажется был чисто сишный ...

[identity profile] eddy-em.livejournal.com 2017-02-01 02:01 pm (UTC)(link)
Можно полистать исходники. Боюсь, правда, что там их очень много будет...
Он у меня, оказывается, установлен.
Полистал исходники. Испугался и закрыл: 10200 с хвостиком строк в одном файле! Автор — точно наркоман!
Edited 2017-02-01 14:08 (UTC)

[identity profile] dimas.livejournal.com 2017-02-01 03:08 pm (UTC)(link)
Писать - ты не хочешь, либу - не хочешь, dcraw - не хочешь :)
Да, у libraw автор нет то, что и у dcraw ;)

[identity profile] alextutubalin.livejournal.com 2017-02-01 03:27 pm (UTC)(link)
(если меня громко упомянуть в ЖЖ - я могу и появиться)

Тут прежде чем пробовать алгоритм - хорошо бы на сами данные посмотреть.

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

Если вы умеете выгнать эти данные в дамп (без заголовка, ну там 16 бит на пиксель) - RawDigger сумеет их прочитать (см. раздел Support of non-standard cameras в его мануале в разделе настроек).

Ну или дайте пару файликов для опытов, гляну.

[identity profile] alextutubalin.livejournal.com 2017-02-01 03:29 pm (UTC)(link)
Вдогонку.

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

Посмотрим что там за полосатость и нет ли ее в темновых кадрах тоже.

[identity profile] alextutubalin.livejournal.com 2017-02-01 03:31 pm (UTC)(link)
Сишный пример libraw лежит там в каталоге samples/

Их там аж три.

Но скорее всего с наскоку - вашу камеру не распознает, надо строчку добавить по типу тех, что описывают андроидные дампы сенсора.

[identity profile] eddy-em.livejournal.com 2017-02-01 03:39 pm (UTC)(link)
Исходную картинку я в предыдущей записи привел.
Ту (стороннюю) утилиту, вообще, на самом деле неплохо было бы на реальном снимке неба проверить. Вдруг и она сгодится? Учитывая то, что считывание данных с матрицы длится около минуты, те 5-10 секунд, что работает утилита — фигня.
Примеры:
https://drive.google.com/open?id=0B859YEB17d8vd2ktYUJMMHIyQlE
https://drive.google.com/open?id=0B859YEB17d8vbWVRZTk3cTNoa2c
https://drive.google.com/open?id=0B859YEB17d8vbWVRZTk3cTNoa2c

[identity profile] eddy-em.livejournal.com 2017-02-01 03:41 pm (UTC)(link)
Спасибо, посмотрю. Камеру мне не надо распознавать (да и не распознает ее эта штука: я, похоже, первый, кто сделал на С интрфейс к этой камере), мне надо с сырым набором байтов работать.

[identity profile] eddy-em.livejournal.com 2017-02-01 03:42 pm (UTC)(link)
Темновые завтра сниму: я уже с работы ушел, а камеру из розетки выключил. Надо было включенной оставить...

[identity profile] p2004r.livejournal.com 2017-02-01 04:10 pm (UTC)(link)
Лучше экспериментировать с картинками в чем то таком как https://imagej.nih.gov/ij/docs/guide/146-Part-II.html#toc-Part-II

было еще что то где совсем как электронная таблица изображение открывалось... но склероз мешает вспомнить :(

[identity profile] alextutubalin.livejournal.com 2017-02-01 04:22 pm (UTC)(link)
Такие камеры системы "дамп данных с сенсора" мы распознаем исключительно по размеру файла.

[identity profile] alextutubalin.livejournal.com 2017-02-01 04:24 pm (UTC)(link)
Tiff мне не пойдет - не буду возиться с ним, дамп сенсора нужен и знание размеров в пикселях.

Но судя по tiff - у вас там реально же вот сеточка в светах. То есть надо или баланс белого применять, или еще чего хорошее.

Де-байеризатор отработал как надо. Дали ему сеточку - он ее нарисовал почетче.

[identity profile] eddy-em.livejournal.com 2017-02-01 05:22 pm (UTC)(link)
Для экспериментов лучше всего годится октава. Я обычно все алгоритмы сначала в ней отлаживаю, а потом уже сишный код пишу.

[identity profile] eddy-em.livejournal.com 2017-02-01 05:24 pm (UTC)(link)
Попробую завтра потолок поснимать — эдакие флэты. Посмотрю, что будет.
> дамп сенсора
Просто бинарные данные? Так их из тифа чем угодно можно вытащить - хоть той же октавой. В каком формате нужны данные?

[identity profile] alextutubalin.livejournal.com 2017-02-01 05:40 pm (UTC)(link)
Их *можно* вытащить. Но я - не буду. Опять же - гадать что там с гаммой, наложена, не наложена.
То есть я больше 5 минут на это не собираюсь тратить (примерно столько нужно для поддержки новой камеры типа "дамп сенсора")

Дамп мне нужен
- раз у вас там 16-битный АЦП, то вот прямо 2 байта на пиксель.
- порядок байт в слове - без разницы, но (чуть) лучше интеловский.
- нужно знать сколько строк-столбцов в сенсоре
- нужно знать как сделан дамп, по строкам или столбцам (удобнее - по строкам).

Если с одного раза получится - будет вам libraw с поддержкой вашей камеры.

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

[identity profile] eddy-em.livejournal.com 2017-02-01 05:56 pm (UTC)(link)
Гаммы никакой нет; порядок - little endian; 640 столбцов на 480 строк; каков порядок считывания данных, сказать не могу: в даташите на камеру этого не нашел, по RS-232 они передаются построчно.

Про баланс белого — имеете в виду деление на флэт?

[identity profile] alextutubalin.livejournal.com 2017-02-01 06:14 pm (UTC)(link)
Ну можно и на флэт, если вы уверены что он флэт (а обеспечить равномерность освещения ну очень сложно).
Обычно просто на поканальные коэффициенты умножают.

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

Поканальные отклики (их отношение) будут же разные? А карта - как была серой, так и осталась.

[identity profile] koolru.livejournal.com 2017-02-01 07:47 pm (UTC)(link)
Слова то какие... дебайеризация :) думал что-то покупают :)

[identity profile] eddy-em.livejournal.com 2017-02-02 07:38 am (UTC)(link)
Судя по примерам и документации, использовать эту библиотеку с наскока не получится: только выдирать нужные функции и компоновать отдельно. А жаль...

[identity profile] alextutubalin.livejournal.com 2017-02-02 07:50 am (UTC)(link)
Добавить поддержку дампа пикселов для конкретной камеры
- или +1 строчка в коде
- или подать фактически эту же строчку в parse_custom_cameras() и подсунуть потом в параметры.

Но мне нужен этот дамп (не так чтобы очень нужен - можете трахаться сами если предпочитаете так)

[identity profile] eddy-em.livejournal.com 2017-02-02 07:59 am (UTC)(link)
В каком виде нужен дамп? Бинарный файл или текстовый с hex?

[identity profile] alextutubalin.livejournal.com 2017-02-02 08:08 am (UTC)(link)
Бинарный.

Прямо вот такой какой libraw будем подсовывать.

Я ж написал там выше (про порядок байт и тп)

[identity profile] eddy-em.livejournal.com 2017-02-02 08:36 am (UTC)(link)
Для этой картинки: https://drive.google.com/open?id=0B859YEB17d8vdzZZbk8zRmZ6S0E
дамп: https://drive.google.com/open?id=0B859YEB17d8veDVlUUpJNzJsXzg

Формат uint16_t, little endian, 640x480 пикселей, сохранено построчно. Экспозиция 0.5с. Получился эдакий псевдофлэт (морду я обмотал белой бумагой).
Edited 2017-02-02 08:38 (UTC)

[identity profile] alextutubalin.livejournal.com 2017-02-02 12:07 pm (UTC)(link)
Это не псевдофлет, это тотальный пересвет.

Вот патчик к LibRaw (к dcraw.c тоже подойдет, найдете там эту табличку в identify() и руками поставите), дамп совпадает по размеру с сенсором Kodak KAI-0340, поэтому кодак я закомментировал:

diff --git a/internal/dcraw_common.cpp b/internal/dcraw_common.cpp
index 4738c29..df78fde 100644
--- a/internal/dcraw_common.cpp
+++ b/internal/dcraw_common.cpp
@@ -15318,7 +15318,8 @@ void CLASS identify()
{12241200, 4040, 3030, 2, 0, 0, 13, 0, 0x49, 0, 0, "Kodak", "12MP"},
{12272756, 4040, 3030, 2, 0, 0, 13, 0, 0x49, 0, 0, "Kodak", "12MP", 31556},
{18000000, 4000, 3000, 0, 0, 0, 0, 0, 0x00, 0, 0, "Kodak", "12MP"},
- {614400, 640, 480, 0, 3, 0, 0, 64, 0x94, 0, 0, "Kodak", "KAI-0340"},
+// {614400, 640, 480, 0, 3, 0, 0, 64, 0x94, 0, 0, "Kodak", "KAI-0340"}, // Same size, so disable Kodak for it
+ {614400, 640, 480, 0, 0, 0, 0, 0, 0x94, 0, 0, "Some", "Shit"},
{15360000, 3200, 2400, 0, 0, 0, 0, 96, 0x16, 0, 0, "Lenovo", "A820"},
{3884928, 1608, 1207, 0, 0, 0, 0, 96, 0x16, 0, 0, "Micron", "2010", 3212},
{1138688, 1534, 986, 0, 0, 0, 0, 0, 0x61, 0, 0, "Minolta", "RD175", 513},


Но я не уверен в том что каналы угадал, мне бы чего цветное с известными цветами, а то вдруг я не тот паттерн подставил байеровский, по этой картинке не узнать, все белое.

Следующим сообщением - скриншоты из RawDigger (может упасть в спам - поэтому отдельным)

[identity profile] alextutubalin.livejournal.com 2017-02-02 12:09 pm (UTC)(link)
В диггере я это вижу так: https://www.dropbox.com/s/5j0otqfjqtx4dst/Screenshot%202017-02-02%2015.08.03.png?dl=0

А гистограмма, ну как и глазом видно, тотальная засветка, легли на максимум АЦП (или какой еще максимум) везде: https://www.dropbox.com/s/0hsxqrrnw34fq7n/Screenshot%202017-02-02%2015.08.58.png?dl=0

[identity profile] alextutubalin.livejournal.com 2017-02-02 12:12 pm (UTC)(link)
В-общем, в dcraw закомментируйте kodak, добавьте мою строчку, если я там не угадал (я и не угадывал, скопипастил) паттерн, то возможные значения 9-го поля:

0x94, 0x49, 0x16, 0x61 (в принципе, если два зеленых отличаются, то возможны еще варианты).

Ну или дайте что-нибудь цветное с известным цветом (только ярким, идеально чтобы было и красное и зеленое и синее яркие в кадре) - подберу сам.

[identity profile] alextutubalin.livejournal.com 2017-02-02 12:13 pm (UTC)(link)
Ну и темновые кадры нужны, кстати.

На нормальной выдержке и на минимально короткой. Оценить bias (уровень черного) и тоже в табличку добавить, иначе линейность уползет.

[identity profile] eddy-em.livejournal.com 2017-02-02 01:10 pm (UTC)(link)
Спасибо, попробую сделать.
Чуть позже выложу кадры.

[identity profile] eddy-em.livejournal.com 2017-02-02 01:32 pm (UTC)(link)
Сделал, скомпилировал, запускаю ./simple_dcraw dump.bin — получается черт-те что:
Edited 2017-02-02 13:32 (UTC)

[identity profile] alextutubalin.livejournal.com 2017-02-02 01:48 pm (UTC)(link)
Кодак не закомментировали?

Это егонный декодер срабатывает, я такую картинку уже видал сегодня

[identity profile] eddy-em.livejournal.com 2017-02-02 01:58 pm (UTC)(link)
А, черт! Я названия оставил — не думал, что повлияют. Поменял и их, получилось вот что:


Вполне прилично. Разве что цветовые профили надо пилить. Но скорость, конечно, намного выше, чем в алгоритме Buades & Co.
Edited 2017-02-02 14:02 (UTC)

[identity profile] alextutubalin.livejournal.com 2017-02-02 02:03 pm (UTC)(link)
Повлияют.

Там по make/model потом разруливается.

Очень это хрупкое место и черезжопное - разбор raw имени dcraw (а мы оттуда много наследуем)

[identity profile] alextutubalin.livejournal.com 2017-02-02 02:04 pm (UTC)(link)
Ну и снимите светофор о трех цветах (подписанных, где красный, где какой).

Потому что у меня вот нет уверенности, что там CFA pattern сейчас правильная.

[identity profile] eddy-em.livejournal.com 2017-02-02 02:10 pm (UTC)(link)
Могу в стандартных фильтрах b, v и r снять. Я как раз турельку с ними собрал — сегодня думали проницаемость тракта спектрографа замерить.

[identity profile] eddy-em.livejournal.com 2017-02-02 03:16 pm (UTC)(link)
Понаснимал:
https://drive.google.com/open?id=0B859YEB17d8vSjdoMUhYTDRtbzQ

В фильтрах B,V и R экспозиция по 2 секунды. Фильтры — стандартные джонсоновские.
Еще приложил дампы дарков: 2, 10, 100 и 300 секунд.
Судя по статистике, bias где-то на уровне 1400. Шум примерно на уровне 0.24 отсчета в секунду.

[identity profile] alextutubalin.livejournal.com 2017-02-02 03:37 pm (UTC)(link)
А чего у них размер внезапно не тот что был?

[identity profile] eddy-em.livejournal.com 2017-02-02 03:55 pm (UTC)(link)
Это обрезанный вариант. Там четыре варианта есть: полномасштабный, обрезанный, биннинг 2х2 и фрейм (до 127х127 пикселей). Камера умеет сама дарки вычитать для второго и третьего вариантов.
Edited 2017-02-02 15:56 (UTC)

[identity profile] alextutubalin.livejournal.com 2017-02-02 04:07 pm (UTC)(link)
Обрезанному варианту нужна другая строчка.

Надеюсь, вы сумеете ее сделать по образу и подобию