Что такое Quad Bayer фильтр в камерах и работает ли он на самом деле?

Летом 2018 года Sony представили сенсор IMX586 на 48 мегапикселей, в то время как нормой у смартфонов тогда было 12 или 16. В этом посте разбираемся, действительно ли технология светофильтров Quad Bayer, использующаяся в нём, работает, или это просто маркетинговая уловка.

Как камеры видят цвет

Большинство сенсоров изображения не получает информацию о цвете напрямую — записывается информация об интенсивности света, который поймал пиксель на сенсоре. Так как перед пикселями стоят цветные фильтры, мы можем сказать, что этот пиксель поймал свет определённого цвета.

Но у пикселей на сенсоре камеры нет субпикселей, как на мониторе — каждый пиксель ловит только свет одного цвета — или красного, или зелёного, или синего, а значения двух других цветов восстанавливаются за счёт соседних пикселей (этот процесс называется демозаиком (demosaicing)). Такое строение помогает, во-первых, избежать параллакса, который бы присутствовал при использовании субпикселей, а, во-вторых, получить достаточно высокую светочувствительность при приемлемом уровне детализации. Самым популярным расположением светофильтров является фильтр Байера (Bayer filter), предложенный ещё в 1974 году. Если в таком расположении взять группу из 4 пикселей (2×2), то два из них по диагонали будут зелёными, один красный и один синий. Копия такой группы много раз по всему сенсору изображения позволяет камере видеть цвет.

Расположение светофильтров в фильтре Байера

Расположение светофильтров в фильтре Байера

Принцип работы фильтра Байера

Принцип работы фильтра Байера

Что такое Quad Bayer

Фильтр Quad Bayer — модификация обычного фильтра Байера, запатентованная в 2014, где на месте одного пикселя каждого цвета стоит 4 (2×2) того же цвета, то есть вот так:

b75e7535713c41767d0d40cf7cd6c80c.png

Это позволяет легко превратить сигналы с тех 4 пикселей и объединить их в один (это называется биннингом пикселей (pixel binning)), получив тем самым обычный фильтр Байера, который затем можно обработать привычным образом.

В то же время существует и режим полного разрешения, когда сенсор использует все пиксели по отдельности для получения изображения высокого разрешения — можно даже превратить изображение в обычный фильтр Байера высокого разрешения с помощью ремозаика (remosaicing):

278dd14a397499f61567afede9fbfde5.png

Однако такой тип светофильтров подразумевает некоторый компромисс — в режиме биннинга светочувствительность несколько ниже, чем у эквивалентного обычного фильтра Байера низкого разрешения — вместо одного большого пикселя и одной большой микролинзы теперь 4 маленьких, а в режиме использования всех пикселей детализация цветных деталей ниже, чем у эквивалентного обычного фильтра Байера высокого разрешения. Но обычный фильтр Байера низкого разрешения никогда не сможет передать такой же уровень деталей, а если сделать его разрешение изначально высоким, придётся столкнуться с соответствующим уровнем шума. Отмечу, что биннинг можно проводить и с обычным фильтром Байера, однако из-за относительно далёкого расположения пикселей одного цвета могут возникнуть явные артефакты, что не случается с Quad Bayer сенсорами в биннинг режиме.

Тестирование и результаты

Когда Sony только показали первый массовый Quad Bayer сенсор (первая ссылка в этом посте), они использовали такое изображение для сравнения уровня детализации:

a2564a88153318fe51a54c8bc39fde56.png

У читателя может возникнуть вопрос, действительно ли разница такая на самом деле. Для получения ответа мне пришлось «взломать» свой телефон с Quad Bayer сенсором IMX582 и провести серию тестов, а также сделать несколько сравнительных кадров для визуальной оценки. Все фотографии и данные ниже получены из одиночных изображений в сыром формате, без влияние обработки и алгоритмов от производителей смартфонов.

Как я «взломал» свой телефон

Бинарный файл с настройкой разрешения сенсора в моём случае находится по пути /system/vendor/lib64/camera/com.qti.sensormodule.alioth_sunny_imx582_wide.bin

По умолчанию разрешение 4000×3000, то есть 0xFA0 на 0xBB8. Поскольку это little-endian файл, нам надо будет искать A0 0F и B8 0B в hex редакторе. Я нашёл два случая, когда оба эти значения находились рядом друг с другом, и замена любой пары на 8000 — 0x1F40 (40 1F) и 6000 — 0x1770 (70 17) переводила сенсор в режим 48МП. Также я добавил вот это в/system/vendor/etc/camera/camxoverridesettings.txtпо аналогии с этим модулем:

overrideForceSensorMode=0

logInfoMask=0x10080

overrideLogLevels=0x1F

maxRAWSizes=2

(Вероятно, логирование можно убрать)

Оформление изменений в модуль Magisk позволяет относительно быстро переключаться между режимами. При этом RAW можно получить только в приложении FreeDCam с опцией Use FreeDcam DngConverter, причём на превью (но не на результирующих RAW фотографиях) появляется голубая полоска с краю кадра — всё-таки, это хак, а не полноценный перевод сенсора в правильный режим. Также отмечу, что в моём случае на ISO3200 появляются яркие полоски по всему кадру, а светочувствительность на высоких ISO заметно ниже заявленной — как минимум до 3 стопов (!). Графики ниже построены с откорректированной яркостью, но снижение этого параметра могло негативно повлиять на SNR. Также, не работал фазовый автофокус (остался только медленный контрастный), а значений ручного было недостаточно для наведения на бесконечность. В реальности все эти проблемы можно решить обновлением ПО, если производитель пожелает включать в своих смартфонах такой режим.

Сначала визуальная оценка, слева 12 МП, справа 48 (настройки и физическое положение телефона одинаковое):

Более чёткий текст, интересно, что несмотря на ремозаик, артефактов демозаика меньше

Более чёткий текст, интересно, что несмотря на ремозаик, артефактов демозаика меньше

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

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

То же, что и выше, но с добавленным повышением резкости, это более реалистичный сценарий использования

То же, что и выше, но с добавленным повышением резкости, это более реалистичный сценарий использования

А вот и графики. Здесь я использую тот же алгоритм, что и в своём первом посте, только в качестве мишени использую равномерную и однородную поверхность — листик бумаги поверх объектива. Я отказался от розового шума в данном случае, так как обработка от ISP (ремозаик и шумодав) всё равно будет иметь большое значение, а объективные показатели получат сильно заниженный результат по сравнению с визуальной оценкой, что и показало ограниченное тестирование. В таком случае использование простого листика бумаги для оценки уровня шума кажется мне лучшим выбором.

Вот сами измерения:

График соотношения сигнала к шуму относительно яркости изображения

График соотношения сигнала к шуму относительно яркости изображения

Здесь по оси y разрешение в мегапикселях, а по оси x экспозиция/яркость кадра в стопах ниже насыщения. Отдельно выделена линия 12 МП

Здесь по оси y разрешение в мегапикселях, а по оси x экспозиция/яркость кадра в стопах ниже насыщения. Отдельно выделена линия 12 МП

Могу сказать, что высокое разрешение достигается в действительно широком диапазоне условий освещения. Сенсор показывает результат больше 12 мп даже в светах на ISO3200, что означает широкий спектр применения режима высокого разрешения. В то же время напомню, что эти результаты включают в себя обработку сигнала ISP сенсора, и реальные показатели могут быть несколько хуже. Если у Вас есть идеи более точного метода проведения измерений без занижения результатов относительно визуальной оценки, пожалуйста, напишите об этом в комментариях.

Для получения оптимального уровня шума, когда очень высокое разрешение не требуется (например, только 4K (а не 8K) видео или фото для социальных сетей), всегда можно использовать биннинг режим. Также в нём доступна более высокая скорость считывания, подходящая для замедленной съёмки (до 90 кадров в секунду в 4K режиме в случае с IMX586).

Выводы

После проведённых измерений и тестов могу сказать, что Quad Bayer фильтры не являются маркетинговой уловкой. Они показывают действительно хороший результат даже в режиме полного разрешения, а простой принцип биннинга помогает повысить светочувствительность почти до уровня сенсора с большими пикселями и позволяет использовать быстрое считывание, полезное для видео, делая сенсор действительно универсальным. Думаю, производителям стоит рассмотреть возможность установки сенсоров с такими фильтрами и на «большие» камеры, от которых требуется работа в широком диапазоне условий освещения.

На этом всё, спасибо, что прочитали!

© Habrahabr.ru