Летом 2018 года Sony представили сенсор IMX586 на 48 мегапикселей, в то время как нормой у смартфонов тогда было 12 или 16. В этом посте разбираемся, действительно ли технология светофильтров Quad Bayer, использующаяся в нём, работает, или это просто маркетинговая уловка.
Как камеры видят цвет
Большинство сенсоров изображения не получает информацию о цвете напрямую - записывается информация об интенсивности света, который поймал пиксель на сенсоре. Так как перед пикселями стоят цветные фильтры, мы можем сказать, что этот пиксель поймал свет определённого цвета.
Но у пикселей на сенсоре камеры нет субпикселей, как на мониторе - каждый пиксель ловит только свет одного цвета - или красного, или зелёного, или синего, а значения двух других цветов восстанавливаются за счёт соседних пикселей (этот процесс называется демозаиком (demosaicing)). Такое строение помогает, во-первых, избежать параллакса, который бы присутствовал при использовании субпикселей, а, во-вторых, получить достаточно высокую светочувствительность при приемлемом уровне детализации. Самым популярным расположением светофильтров является фильтр Байера (Bayer filter), предложенный ещё в 1974 году. Если в таком расположении взять группу из 4 пикселей (2x2), то два из них по диагонали будут зелёными, один красный и один синий. Копия такой группы много раз по всему сенсору изображения позволяет камере видеть цвет.
Что такое Quad Bayer
Фильтр Quad Bayer - модификация обычного фильтра Байера, запатентованная в 2014, где на месте одного пикселя каждого цвета стоит 4 (2x2) того же цвета, то есть вот так:
Это позволяет легко превратить сигналы с тех 4 пикселей и объединить их в один (это называется биннингом пикселей (pixel binning)), получив тем самым обычный фильтр Байера, который затем можно обработать привычным образом.
В то же время существует и режим полного разрешения, когда сенсор использует все пиксели по отдельности для получения изображения высокого разрешения - можно даже превратить изображение в обычный фильтр Байера высокого разрешения с помощью ремозаика (remosaicing):
Однако такой тип светофильтров подразумевает некоторый компромисс - в режиме биннинга светочувствительность несколько ниже, чем у эквивалентного обычного фильтра Байера низкого разрешения - вместо одного большого пикселя и одной большой микролинзы теперь 4 маленьких, а в режиме использования всех пикселей детализация цветных деталей ниже, чем у эквивалентного обычного фильтра Байера высокого разрешения. Но обычный фильтр Байера низкого разрешения никогда не сможет передать такой же уровень деталей, а если сделать его разрешение изначально высоким, придётся столкнуться с соответствующим уровнем шума. Отмечу, что биннинг можно проводить и с обычным фильтром Байера, однако из-за относительно далёкого расположения пикселей одного цвета могут возникнуть явные артефакты, что не случается с Quad Bayer сенсорами в биннинг режиме.
Тестирование и результаты
Когда Sony только показали первый массовый Quad Bayer сенсор (первая ссылка в этом посте), они использовали такое изображение для сравнения уровня детализации:
У читателя может возникнуть вопрос, действительно ли разница такая на самом деле. Для получения ответа мне пришлось "взломать" свой телефон с Quad Bayer сенсором IMX582 и провести серию тестов, а также сделать несколько сравнительных кадров для визуальной оценки. Все фотографии и данные ниже получены из одиночных изображений в сыром формате, без влияние обработки и алгоритмов от производителей смартфонов.
Как я ""взломал"" свой телефон
Бинарный файл с настройкой разрешения сенсора в моём случае находится по пути /system/vendor/lib64/camera/com.qti.sensormodule.alioth_sunny_imx582_wide.bin
По умолчанию разрешение 4000x3000, то есть 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 (настройки и физическое положение телефона одинаковое):
А вот и графики. Здесь я использую тот же алгоритм, что и в своём первом посте, только в качестве мишени использую равномерную и однородную поверхность - листик бумаги поверх объектива. Я отказался от розового шума в данном случае, так как обработка от ISP (ремозаик и шумодав) всё равно будет иметь большое значение, а объективные показатели получат сильно заниженный результат по сравнению с визуальной оценкой, что и показало ограниченное тестирование. В таком случае использование простого листика бумаги для оценки уровня шума кажется мне лучшим выбором.
Вот сами измерения:
Могу сказать, что высокое разрешение достигается в действительно широком диапазоне условий освещения. Сенсор показывает результат больше 12 мп даже в светах на ISO3200, что означает широкий спектр применения режима высокого разрешения. В то же время напомню, что эти результаты включают в себя обработку сигнала ISP сенсора, и реальные показатели могут быть несколько хуже. Если у Вас есть идеи более точного метода проведения измерений без занижения результатов относительно визуальной оценки, пожалуйста, напишите об этом в комментариях.
Для получения оптимального уровня шума, когда очень высокое разрешение не требуется (например, только 4K (а не 8K) видео или фото для социальных сетей), всегда можно использовать биннинг режим. Также в нём доступна более высокая скорость считывания, подходящая для замедленной съёмки (до 90 кадров в секунду в 4K режиме в случае с IMX586).
Выводы
После проведённых измерений и тестов могу сказать, что Quad Bayer фильтры не являются маркетинговой уловкой. Они показывают действительно хороший результат даже в режиме полного разрешения, а простой принцип биннинга помогает повысить светочувствительность почти до уровня сенсора с большими пикселями и позволяет использовать быстрое считывание, полезное для видео, делая сенсор действительно универсальным. Думаю, производителям стоит рассмотреть возможность установки сенсоров с такими фильтрами и на "большие" камеры, от которых требуется работа в широком диапазоне условий освещения.
На этом всё, спасибо, что прочитали!