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

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

Наша команда проанализировала алгоритмы, о которых я рассказала в первой части, и создала пайплайн для улучшения качества снимков при слабом освещении:

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

На этапе выбора кадров входные снимки делятся на две группы, и в каждой из них отбираются самые качественные кадры. Затем происходит выравнивание выбранных кадров для компенсации сдвигов камеры и обработка подгрупп изображений с помощью FastBurstDenoising. Следующий шаг — устранение локальных движений для минимизации «смазов». Наконец, пришло время объединить предобработанные кадры с помощью алгоритма MEFLUT и использовать гамма-коррекцию для тонкой настройки яркости и контраста. Ниже разберем каждый этап подробнее.

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

Присоединяйся к нашей AI/ML/CV-команде:

→ AI Tech Lead (LLM)

→ Data Scientist

Выбор кадров

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

На этом этапе мы решаем две основные задачи:

  • Разделяем кадры по яркости. Изображения делятся на две группы: 

    • светлые — яркость близка к максимальной в пределах заданного порога,

    • темные — все остальные. 

  • Выбираем наиболее четкие кадры. Качество итогового изображения напрямую зависит от резкости исходных снимков. Для оценки резкости мы используем оператор Лапласа для зеленого канала. В каждой группе выбираем заданное количество самых четких кадров, которые сортируются по убыванию резкости. Векторы изображений мы обрезаем до требуемого размера, что позволяет сократить вычислительные затраты без потери качества.

    Кадры, которые имеют максимальное значение резкости, служат референсными. На их основе объединяется информация из всех остальных кадров, поэтому важно, чтобы референсный кадр был самый четкий.

Выравнивание кадров

Мы отобрали кадры для обработки, теперь нужно компенсировать движение, вызванное «тряской» рук при съемке на мобильное устройство. Нам поможет модифицированный алгоритм FindTransformECC из библиотеки OpenCV. Он обеспечивает точное попиксельное выравнивание изображений, но у этого метода есть недостаток — высокая вычислительная сложность. Поэтому мы решили его оптимизировать, в итоге снизив время работы всего пайплайна на ~90%. Как именно — разберемся ниже.

Функция FindTransformECC вычисляет матрицу геометрического преобразования между двумя изображениями методом ECC (Enhanced Correlation Coefficient). В основе лежит итеративный подход. На каждом шаге:

  1. Входное изображение преобразуется текущей матрицей, изначально единичной. 

  2. Вычисляется якобиан, то есть влияние параметров преобразования на градиенты.

  3. Матрица обновляется через обратную матрицу Гессе для максимизации корреляции между изображениями. 

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

На первом этапе вычисление матрицы трансформации производится не на полном кадре, а на части этого изображения (кропе). Затем полученная матрица корректируется с учетом смещения кропа относительно исходного изображения. Такой подход позволил ускорить обработку в 9 раз без существенной потери точности.

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

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

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

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

Вверху — фото без использования алгоритма ECC, внизу — после его применения с выравниванием гистограмм на кропе
Вверху — фото без использования алгоритма ECC, внизу — после его применения с выравниванием гистограмм на кропе

FastBurstDenoising

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

Основные этапы:

  1. Построение многоуровневой пирамиды изображений из исходных кадров. Каждый уровень обрабатывается независимо, начиная с наименьшего разрешения для грубого устранения шума.

  2. Взвешенное усреднение пикселей. Для каждого пикселя мы анализируем его временную согласованность в серии кадров. То есть оцениваем равномерность их яркости и затем рассчитываем яркость пикселя на итоговом изображении.

Схема алгоритма FastBurstDenoising
Схема алгоритма FastBurstDenoising

Для оптимизации мы использовали ARM-интринсики и распараллелили код. Общее время исполнения для четырех кадров составило около 60 мс на планшете KVADRA_T при использовании четырех потоков.

Удаление локальных движений

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

Слева — пример локального движения без применения алгоритма, справа — после обработки
Слева — пример локального движения без применения алгоритма, справа — после обработки

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

Алгоритм маскирования локального движения
Алгоритм маскирования локального движения

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

Общее время исполнения алгоритма составляет около 80 мс на планшете KVADRA_T при использовании четырех потоков.

MEFLUT

Для расширения динамического диапазона мы оптимизировали метод MEFLUT, который основан на lookup-таблицах размером 256 значений для каждой экспозиции. Исходные кадры преобразуются в YUV-пространство, при этом основные вычисления выполняются только с каналом яркости (Y) для снижения вычислительной нагрузки. 

Алгоритм работает с уменьшенными копиями изображений, где генерируются весовые карты, которые определяют вклад каждого кадра. Эти карты масштабируются до исходного разрешения с помощью Guided Filter Upsample, который сохраняет детализацию лучше билинейной интерполяции. 

Финальное изображение формируется взвешенным суммированием входных кадров, при этом цветовые каналы U и V обрабатываются простым усреднением. Такой подход обеспечивает эффективное расширение динамического диапазона при минимальных вычислительных затратах за счет использования компактных lookup-таблиц вместо полной модели, оптимизированных алгоритмов масштабирования и работы с каналом яркости.

Алгоритм MEFLUT
Алгоритм MEFLUT

Мы ускорили алгоритм за счет использования параллелизации и векторных ARM NEON-инструкций, которые позволяют выполнять параллельную обработку нескольких элементов данных с помощью одной инструкции. 

Общее время выполнения этого этапа для двух кадров составляет 200 мс на планшете KVADRA_T при использовании четырех потоков.

Гамма-кривая

Для коррекции яркости итогового изображения, которое получено в условиях низкой освещенности, мы включили в пайплайн гамма-коррекцию. Лучшие визуальные результаты получились с помощью предварительного применения гамма-кривой к обесшумленным кадрам перед их слиянием алгоритмом MEFLUT. 

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

Так MEFLUT оптимально использует информацию о яркости из обеих экспозиций, чтобы обеспечить сбалансированный результат с сохранением деталей как в затемненных, так и в светлых областях.

1 — без применения гамма-кривой, 2 — гамма-кривая применена, 3 — гамма-кривая применена до смешивания экспозиций
1без применения гамма-кривой, 2 — гамма-кривая применена, 3 — гамма-кривая применена до смешивания экспозиций

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

Примеры работы пайплайна для режима ночной съемки

Заключение

Чтобы улучшить режим ночной съемки в планшетах KVADRA_T, мы рассмотрели разные подходы к смешиванию изображений с разной экспозицией и сравнили их по качеству результата и времени выполнения. Затем выбрали наиболее подходящие и реализовали в версии приложения камеры для разработчиков. 

Также мы оптимизировали скорость работы пайплайна: теперь обработка серии из 9 кадров занимает всего 825 миллисекунд. А еще улучшенный режим ночной съемки помогает экономить заряд батареи — это важно для наших заказчиков. Их сотрудникам, например менеджерам банков, иногда приходится делать несколько сотен фотографий в день.

Всегда рада ответить на ваши вопросы в комментариях.

Комментарии (2)


  1. Gumanoid
    09.07.2025 15:19

    Можно ли добавить Contrast-Limited Adaptive Histogram Equalization в пайплайн, или оно ничего не улучшит?


  1. apevzner
    09.07.2025 15:19

    А ноутбуки KVADRA NEO - это тоже ваших рук дело?