Привет, Хабр! Меня зовут Полина Лукичева, я инженер команды AI ML Kit в YADRO. Наша задача — улучшить ночной режим камеры в планшете KVADRA_T. В статье я расскажу об основных ограничениях камеры мобильного устройства при съемке в условиях низкой освещенности, а также поделюсь алгоритмами, с помощью которых можно получить качественный снимок даже в темноте.
Как работает камера цифрового устройства
В современных камерах изображение формируется с помощью сенсорной матрицы, состоящей из множества миниатюрных светочувствительных ячеек — пикселей. Для съемки камера открывает затвор, и фотоны света, пройдя через объектив, попадают на светочувствительные элементы матрицы, то есть пиксели. В фотодиодах каждого пикселя фотоны вызывают фотоэлектрический эффект, в результате которого формируются аналоговые электрические сигналы. После закрытия затвора сигналы преобразуются в цифровой вид.
Далее процессор камеры считывает значения заряда из каждой ячейки и на их основе формирует изображение. Однако каждый пиксель сам по себе не содержит цветовой информации — в таком виде можно получить только черно-белое изображение. Чтобы передать цвета, над каждым светочувствительным элементом размещается цветовой фильтр, пропускающий свет только определенной длины волны, которая соответствует одному из базовых цветов.

В дивизионе искусственного интеллекта YADRO мы развиваем архитектуру для построения серверной ИИ-инфраструктуры, разрабатываем ИИ-системы автоматизации и контроля качества, а еще внедряем интеллектуальные функции в продукты компании. Если тебе интересны эти задачи, присоединяйся к команде:
Матрицы в мобильных устройствах
В камерах мобильных устройств матрица заметно меньше по размеру, чем, например, в зеркальных камерах. Из-за этого на нее попадает меньше света, и изображение в итоге получается менее ярким — особенно в условиях слабого освещения.

Посмотрим на два изображения ниже — оба сделаны в одинаковых условиях, без использования вспышки:

Верхнее фото получено с зеркального фотоаппарата. Оно гораздо точнее передает сцену, а нижнее сделано на планшет. Разница заметна: снимок с планшета значительно темнее. Возникает логичный вопрос — как можно улучшить такую ситуацию? Какими способами вообще можно «поймать» больше света? Разберемся, какие подходы для этого существуют.
Как улучшить фото в условиях низкой освещенности
Первый способ — увеличить диафрагму, то есть фактически размер апертуры. Чем она шире, тем больше света попадет на матрицу, и тем больше информации о сцене мы сможем получить. Но здесь есть ограничение: в случае с планшетом мы не можем менять конструкцию уже установленного модуля камеры.
Второй способ — увеличить выдержку, то есть время, в течение которого матрица собирает свет. Это вполне логично: чем дольше открыт затвор, тем больше фотонов успеет попасть на матрицу. Но и у этого подхода есть свои ограничения. При съемке динамичных сцен могут появиться артефакты — например, движущиеся объекты будут размываться.

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

Атмосфера, которую создает мягкий свет свечей, почти полностью теряется, если использовать вспышку. Вместо уютной сцены мы получаем пересвеченное изображение с искаженными цветами.
На мобильных устройствах в подавляющем большинстве случаев увеличение выдержки и использование вспышки приводит к неудовлетворительным результатам. Увеличить диафрагму нельзя, так как это потребует замены самой камеры.
Поэтому перейдем к обзору программных методов, которые работают с серией снимков и позволяют заметно улучшить качество снимков в условиях низкой освещенности.
Можно взять несколько кадров с одинаковыми настройками и объединить их для снижения цифрового шума. Этот метод помогает усреднить случайные искажения, которые появляются при слабом освещении.

Другой способ основан на слиянии кадров, которые сделаны с разной экспозицией. В результате получается итоговое фото с расширенным динамическим диапазоном (HDR).

Обычно его применяют для улучшения изображений при дневной съемке, особенно в условиях яркого солнца. Но мы решили проверить: можно ли адаптировать этот способ для съемки в темноте? Он поможет осветлить изображение и заметно снизить уровень шумов.
Смешивание экспозиций Мертенса
Давайте разберемся, как можно смешивать изображения с разной экспозицией.
Первый метод — это HDR-слияние на основе алгоритма, предложенного Мертенсом. Суть техники в том, чтобы объединить лучшие фрагменты из каждого кадра с разной экспозицией в одно итоговое изображение. Алгоритм использует взвешенное смешивание кадров, которое позволяет сохранить максимальное качество, избегая пересветов и провалов в тенях.
Плоские, блеклые или просто невыразительные участки изображения получают меньший вес при объединении. А вот яркие и визуально информативные области, наоборот, сохраняются с приоритетом.

Слева показана последовательность входных кадров, которые сняты с разной экспозицией, а рядом — соответствующие им карты весов. Они определяют, насколько значим каждый пиксель для итогового изображения. Чем выше вес пикселя на карте, тем больше он влияет на финальный снимок.
Именно такая система позволяет алгоритму выбрать наилучшие участки из каждого изображения и аккуратно объединить их — так, чтобы сохранить детали как в хорошо освещенных областях, так и в тенях. На основе карт весов и строится итоговое изображение.

Разберемся, откуда вообще берутся эти карты. Для их построения используются три матрицы, каждая из которых оценивает один из важных параметров: контраст, насыщенность и качество экспозиции.
Контраст отвечает за выделение важных элементов сцены — таких как края, текстуры и резкие переходы. Чем выше локальный контраст, тем выше вес пикселя. Метрика контраста использует значение дискретного фильтра Лапласа, примененного к черно-белому варианту изображения. Фильтр применяется для каждого канала отдельно и затем суммируется.
Насыщенность — это мера «цветовой силы» в каждой точке изображения. Она вычисляется как стандартное отклонение между значениями цветовых каналов одного пикселя: чем больше различие между каналами, тем насыщеннее цвет и выше вес.
Качество экспозиции показывает, насколько хорошо освещен конкретный пиксель. Обычно это измеряется по тому, насколько близко значение его яркости к некоему идеальному уровню, например медиане яркостей. Слишком темные или слишком светлые участки получают меньший вес, а наиболее сбалансированные — больший.
Чтобы получить итоговую карту весов, нужно перемножить все характеристики: контраст, насыщенность и экспозицию. Каждый из этих факторов можно масштабировать с помощью коэффициента. В теории, можно усилить вклад одного из параметров, увеличив его вес, но на практике чаще всего все три матрицы используют с коэффициентом 1.
После перемножения карт их нужно нормировать — привести к такому виду, чтобы сумма весов для каждого пикселя равнялась единице. Другими словами, если посмотреть на один пиксель во всех входных кадрах, то его веса в совокупности должны дать единицу. Это позволяет правильно сбалансировать вклад каждого изображения при объединении.
Результирующее изображение затем формируется путем взвешенного смешивания входных кадров, с использованием рассчитанных весов.
Посмотрим на формулы, которые используются для смешивания экспозиций Мертенса.
Контраст:
Насыщенность:
Качество экспозиции:
Карта весов:
Результирующее изображение:
Однако практика показывает, что такой подход может дать неудовлетворительный результат:

Чтобы улучшить качество итогового изображения, авторы алгоритма предлагают использовать подход с несколькими уровнями разрешения. Для этого применяется пирамидальное разложение изображений:

Входная последовательность изображений сначала раскладывается в гауссову пирамиду. Фактически это набор изображений: каждый следующий кадр получается путем сглаживания и уменьшения предыдущего — обычно с помощью фильтра Гаусса. На самом верхнем уровне такой пирамиды версия исходного кадра остается сильно размытой и уменьшенной.
Затем на основе «стопки» изображений с разным разрешением строится пирамида Лапласа путем поуровневого вычитания: сначала интерполируется (увеличивается) изображение с нижнего уровня гауссовой пирамиды, чтобы привести его к размеру следующего уровня выше, а затем оно вычитается из этого более высокого уровня.
В результате каждый уровень пирамиды Лапласа хранит только ту часть изображения, которая добавляет детали к более размытым версиям. Фактически, это структура, в которой по уровням распределены «разности» или уточнения — от общих форм к мелким текстурам.

На фото видно, что такой подход действительно позволяет заметно улучшить результат. Изображение становится ярче и контрастнее, а детали — четче.
Однако у этого метода есть и свои недостатки. Одним из них является искажение цветовых тонов. При объединении кадров с разной экспозицией может возникнуть эффект смещения цвета — например, перенасыщение в отдельных участках изображения. В результате цвета начинают выглядеть неестественно, особенно если исходные кадры сильно различаются по яркости.

В целом, смешивание экспозиций Мертенса — это классический метод, поэтому ниже рассмотрим более современные подходы, использующие нейросети для улучшения снимков.
MEFNet
Это подход к слиянию изображений с разной экспозицией. Он создан для работы со статическими последовательностями кадров произвольного разрешения и в произвольном количестве. Название MEFNet происходит от термина Multi-Exposure Fusion, то есть «многоэкспозиционное смешивание». Отсюда и сокращение MEF.
Главная цель MEFNet — извлекать полезные детали как из темных, так и из пересвеченных областей, чтобы сформировать итоговое изображение с хорошим балансом яркости и контраста. При этом метод должен избегать артефактов, характерных для классических алгоритмов.

Алгоритм MEFNet работает следующим образом. На вход подается серия изображений с разной экспозицией — они сначала переводятся в YUV-формат. Далее основная обработка выполняется только по Y-каналу, который отвечает за яркость. Дело в том, что именно яркостный компонент в наибольшей степени определяет структуру и детализацию сцены.
Затем нужно уменьшить разрешение всех изображений — так сокращаются вычислительные затраты. Полученные кадры поступают в нейросеть, которая генерирует весовые карты для каждого изображения, также в пониженном разрешении. Она обрабатывает серии произвольного пространственного размера и числа экспозиций, а также генерирует карты соответствующего размера и количества. Сеть состоит из семи сверточных слоев с расширенными свертками, которые увеличивают поле восприятия (receptive field) без потери разрешения:
Слои 1–6 используют ядра размером 3×3 с разными коэффициентами расширения (dilation rates): 1, 2, 4, 8, 16, 1. Это позволяет захватывать контекст на разных масштабах.
Слой 7 — финальный слой с ядром 1×1, который преобразует фичи в весовые карты.
Нормализация — после каждого сверточного слоя (кроме последнего) применяется адаптивная нормализация (AN), сочетающая нормализацию по экземпляру (instance normalization) с обучаемыми параметрами.
Активация — используется Leaky ReLU (LReLU) для сохранения структурной информации.

Сгенерированные карты затем масштабируются до оригинального размера. Для увеличения используется метод Guided Filter Upsample. В отличие от стандартного билинейного подхода он позволяет лучше сохранять детали: границы объектов и мелкие текстуры. Это особенно важно при слиянии изображений, чтобы не терялась структура сцены.
После масштабирования полученные карты используются для взвешенного объединения входных изображений: каждое пиксельное значение учитывается с соответствующим весом из карты. Цветовые каналы U и V, которые не участвовали в обработке, смешиваются отдельно — равномерно и без весов.
В результате получается финальное изображение с улучшенной яркостью, контрастом и сохраненными деталями.

MEFLUT
Следующий подход называется MEFLUT. В его основе лежит использование lookup-таблиц (LUT) для эффективного и быстрого слияния изображений с разной экспозицией.
Основная идея метода заключается в создании компактной структуры данных, которая позволяет выбирать оптимальные значения пикселей из нескольких входных кадров. Такие lookup-таблицы помогают определить, какой именно пиксель из какого кадра должен попасть в итоговое изображение, чтобы сформировать результат с расширенным динамическим диапазоном.
По своей структуре MEFLUT во многом напоминает MEFNet, основные этапы обработки аналогичны — разница заключается в том, как формируются весовые карты для слияния изображений:

Процесс обучения MEFLUT состоит из двух ключевых этапов. Разберем первый из них — обучение нейросети H, которая на иллюстрации выделена красным пунктиром.
Нейросеть принимает изображения в цветовом пространстве YUV, но основная обработка ведется только по каналу Y, то есть по яркости. Цветовые каналы U и V, как и в случае с MEFNet, обрабатываются отдельно: они просто взвешенно суммируются между собой, причем все пиксели считаются равнозначными.
Перед тем как Y-канал поступит на вход нейросети, изображение уменьшается в разрешении с помощью билинейного даунсэмплинга. Так существенно снижается вычислительная нагрузка, но при этом сохраняются важные структурные особенности сцены.
Сама нейросеть состоит из двух ключевых модулей:
CFCA (Cross-Frame and Channel Attention) — этот блок объединяет информацию между кадрами и оценивает значимость каждого канала. Он помогает выявить зависимость между изображениями с разной экспозицией, учитывая как пространственные, так и канальные зависимости.
DISA (Deleted Inception with Spatial Attention) — этот модуль, выделенный на схеме бежевым, отвечает за определение важности отдельных областей внутри каждого изображения. Он позволяет точнее понять, какие фрагменты сцены заслуживают большего внимания при слиянии.
На выходе нейросеть предсказывает весовые карты для каждого кадра, которые показывают, насколько важен каждый пиксель в конкретном входном изображении. Как и ранее, карты формируются в пониженном разрешении, а затем масштабируются до оригинального размера с помощью Guided Filter Upsample — так сохраняются детали и границы.
Итоговое изображение получается методом взвешенного объединения по тем же картам. Первый этап завершен: нейросеть обучена и способна формировать качественные карты значимости для слияния изображений.
Для сокращения вычислительных затрат при использовании MEFLUT авторы предлагают заранее сгенерировать lookup-таблицу, чтобы при обработке кадров на этапе инференса избежать вычисления одних из самых требовательных к ресурсам блоков: CFCA и DISA. Для построения lookup-таблицы в обученную нейросеть подается 256 наборов однотонных изображений — от полностью черного (0) до полностью белого (255). Все пиксели внутри каждого изображения имеют одинаковое значение яркости.
Каждому из этих 256 наборов соответствует четыре кадра — по количеству экспозиций. Они подаются в модуль обученной нейросети, который генерирует весовые карты. Он обозначен красным пунктиром на схеме выше. На выходе мы получаем четыре весовые карты — по одной для каждой экспозиции.
Поскольку изображения полностью однородны, логично предположить, что и выходные карты должны быть одинаковыми по всем пикселям. Поэтому нужно взять средние значения внутри каждой карты, получая по одному весу на экспозицию. Если повторить эту процедуру для всех значений яркости от 0 до 255, то сформируется таблица размером 256×N, где 256 — количество возможных градаций яркости, а N — количество входных изображений с разной экспозицией.
Затем, при инференсе модели, не нужно прогонять изображения через сеть. Вместо этого:
Входные кадры разбиваются на YUV-компоненты.
Берется яркостной канал Y.
Для каждого пикселя по значению Y-яркости из lookup-таблицы извлекаются соответствующие веса.
Эти веса используются для взвешенного объединения изображений.
Формируется итоговая карта яркости.
Цветовые каналы U и V объединяются с помощью равномерного усреднения.
Такой подход значительно ускоряет вычисления, практически не влияя на качество итогового изображения:

Сравнение подходов
Для сравнения качества алгоритмов смешивания экспозиций используется несколько основных метрик.
PSNR (Peak Signal-to-Noise Ratio) — измеряет степень искажения изображения по сравнению с эталоном (оригиналом) на основе разницы значений пикселей. Чем выше PSNR, тем ближе изображение к оригиналу. Формула для расчета метрики:
MAXI - максимально возможное значение пикселя (для 8-битного изображения = 255),
MSE (Mean Squared Error) — средняя квадратичная ошибка:
I — эталонное изображение,
K — обработанное изображение,
m×n — размер изображения.
SSIM (Structural Similarity Index) — оценивает сохранение структуры, контраста и яркости между изображениями, учитывая особенности человеческого зрения.
μx, μy — средние значения яркости для изображений x и y,
σx2, σy2 — дисперсии,
σxy — ковариация между x и y,
C1, C2 — константы для стабилизации (зависят от динамического диапазона).
MEF-SSIM — это специализированная метрика для оценки качества слияния изображений с разной экспозицией (Multi-Exposure Image Fusion, MEF). Она адаптирует классический SSIM для задач MEF, учитывая особенности HDR-сцен и человеческого восприятия.
Метрика разбивает изображение на три независимых компонента:
яркость — средняя интенсивность патча, определяет общую освещенность сцены,
контраст — стандартное отклонение патча от среднего, отражает локальные изменения яркости,
структура — нормализованный патч (без учета яркости и контраста), описывает геометрию объектов (границы, текстуры).
Для каждого компонента определяется «идеальное» значение для результирующего изображения.
Желаемая яркость — учитывает глобальную и локальную освещенность:
Вес, зависящий от средней яркости μk всего изображения и локальной яркости lk:
Желаемый контраст — выбирается максимальный контраст из всех экспозиций:
Желаемая структура — вычисляется как взвешенное среднее структурных компонентов:
Формула ниже — вес, основанный на «важности» патча (через l∞ -норму):
На основе указанных выше желаемых характеристик формируется финальное «идеальное» изображение (x^):
Сравнение «идеального» изображения (x^) с изображением, которое получено путем смешивания экспозиций (y):
μ, σ — среднее значение и стандартное отклонение,
C1,C2 — константы для стабилизации.
Здесь M — количество патчей, на которые разбивается изображение для вычисления метрики MEF-SSIM.
В таблице представлены результаты метрик из статьи MEFLUT. Они были рассчитаны на датасете, собранном авторами материала. По всем трем параметрам лидером является подход MEFLUT:
Метрика |
Mertens |
MEFNet |
MEFLUT |
PSNR |
21,531 |
21,583 |
21,894 |
SSIM |
0,7833 |
0,7763 |
0,8067 |
MEF-SSIM |
0,9589 |
0,9743 |
0,9845 |
Что касается визуальной оценки — алгоритм Мертенса дает темное итоговое изображение, но сохраняет хорошую детализацию во всех областях кадра. В целом подходы MEFLUT и MEFNet демонстрируют схожие результаты по сохранению деталей.
Однако при увеличении разрешения весовых карт алгоритм MEFLUT уверенно выдает более качественный результат, при этом, в отличие от MEFNet, время работы остается почти неизменным. Несмотря на явное преимущество алгоритма Мертенса по скорости, наш анализ показал значительный потенциал для оптимизации MEFLUT.
Время работы алгоритмов без оптимизаций на одноплатном компьютере Radxa RK3588:
Алгоритм |
MEFNet (128x172) |
MEFNet (1024x1372) |
MEFLUT (128x172) |
MEFLUT (1024x1372) |
MEF Mertens |
Время исполнения, сек |
5,49 |
52,92 |
4,54 |
4,93 |
3,15 |


BiMEF
Для ночного режима съемки можно использовать алгоритм BiMEF (Bi-exposure Multi-Exposure Fusion) — это метод слияния нескольких экспозиций. Основная идея алгоритма основана на наблюдении, что фото одной и той же сцены, снятые с разной экспозицией, обладают высокой степенью корреляции. Авторы предлагают такой подход: взять один исходный снимок и сгенерировать на его основе серию мультиэкспозиционных изображений. Для этого используется функция преобразования яркости BTF (Brightness Transfer Function).
Сгенерированные изображения затем объединяются — точно так же, как и в других методах мультиэкспозиционного слияния. То есть идея остается похожей на те, что мы рассматривали ранее. Отличие в том, что вместо реальных кадров с разной экспозицией используется одна фотография и ее преобразованные копии.

Система BiMEF состоит из четырех основных компонентов. Разберемся, что это за компоненты и как они работают.
Multi-Exposure Sampler — первый блок в системе. Он определяет, сколько изображений нужно сгенерировать, и задает коэффициенты экспозиции для каждого из них. На схеме этот компонент показан первым.
Multi-Exposure Generator — следующий блок. Используя предсказанные параметры, он создает серию изображений с разной экспозицией — они обозначены на схеме как K₁, K₂, ..., Kₙ.
Multi-Exposure Evaluator — этот модуль анализирует полученные изображения и формирует карты весов. Они определяют вклад каждого пикселя из каждой экспозиции в итоговое изображение.
Multi-Exposure Combiner — последний блок, который объединяет изображения на основе карт весов и формирует финальный результат.
Заключение
На этом я завершаю теоретическую часть своего материала. Мы обсудили проблемы, которые необходимо решить для реализации качественного режима ночной съемки на мобильном устройстве, а также рассмотрели распространенные алгоритмы и подходы к улучшению снимков. Во второй статье вас ждет предметное сравнение алгоритмов: выберем самые подходящие и разберемся с их реализацией в приложении камеры для планшетов KVADRA_T. Подписывайтесь, чтобы не пропустить.
AGalilov
Нашёл сайт https://kvadra.tech/#, но цен или ссылок на ритейл не увидел :(