В этом примере показано, как улучшить малосветные изображения с помощью алгоритма, подходящего для FPGA.
Улучшение низкого освещения (LLE) является шагом предварительной обработки для приложений в автономном управлении автомобилем, научном сборе данных и общем улучшении зрения. Изображения, полученные в условиях низкой освещенности и неравномерности яркости, имеют низкую динамическую область значений с высокими уровнями шума. Эти качества могут привести к ухудшению общей эффективности алгоритмов компьютерного зрения, которые обрабатывают такие изображения. Этот алгоритм улучшает видимость базовых функций в изображении.
Модель примера включает в себя алгоритм, основанный на кадрах с плавающей точкой, в качестве ссылки, упрощенную реализацию, которая уменьшает операции деления, и потоковую реализацию упрощенного алгоритма с фиксированной точкой, которая подходит для оборудования.
Этот пример выполняет LLE, инвертируя вход изображение и затем применяя алгоритм устранения дымки к инвертированному изображению. После инвертирования изображения с низким светом пиксели, представляющие область без неба, имеют низкую интенсивность по меньшей мере в одном цветовом канале. Эта характеристика аналогична изображению, полученному в туманных погодных условиях [1]. Интенсивность этих темных пикселей в основном обусловлена рассеянием или воздушным светом, поэтому они обеспечивают точную оценку эффектов дымки. Чтобы улучшить темный канал в инвертированном световом изображении, алгоритм изменяет изображение воздушного света на основе условий окружающего света. Изображение воздушного света модифицируют с помощью оценки темного канала и затем уточняют с помощью сглаживающего фильтра. Чтобы избежать шума от чрезмерного улучшения, в примере применяется нелинейная коррекция, чтобы лучше оценить карту воздушного света. Несмотря на то, что этот пример отличается своим подходом, для краткого обзора улучшения малосветного изображения смотрите Low-Light Image Enhancement (Image Processing Toolbox) (Набор инструментов обработки изображений).
Алгоритм LLE принимает за вход 3-канальное изображение RGB с низким светом. Этот рисунок показывает блок алгоритма LLE.
Алгоритм состоит из шести этапов.
1. Масштабирование и инверсия: Входное изображение преобразуется в область значений [0,1] путем деления на 255 и последующего инвертирования пикселей.
2. Оценка темного канала: Темный канал оценивается путем нахождения пиксельного минимума по всем трем каналам инвертированного изображения [2]. Минимальное значение умножается на коэффициент дымки, который представляет количество дымки для удаления. Значение от 0 до 1. Более высокое значение означает, что из изображения будет удалено больше дымки.
3. Уточнение: Изображение воздушного света с предыдущего этапа уточняется итерационным сглаживанием. Это сглаживание усиливает детали изображения после улучшения. Этот этап состоит из пяти итераций фильтров с ядром 3 на 3 для каждого этапа. Уточненное изображение хранится в. Эти уравнения выводят коэффициенты фильтра,, используемые для сглаживания.
4. Нелинейная коррекция: Чтобы уменьшить избыточное улучшение, уточненное изображение корректируется с помощью нелинейного уравнения коррекции, показанного ниже. Константа,, представляет среднюю линию изменения темных областей карты воздушного света с темных на яркие значения. В примере используется эмпирически выведенное значение.
5. Восстановление: Восстановление выполняется пиксельно по трем каналам инвертированного и исправленного изображения, как показано:
6. Инверсия: Чтобы получить окончательное улучшенное изображение, этот этап инвертирует выход стадии восстановления и масштабируется до области значений [0,255].
Шаги масштабирования, нелинейной коррекции и восстановления включают операцию деления, которая неэффективна для реализации в оборудовании. Чтобы уменьшить расчет участия, уравнения в алгоритме упрощаются путем подстановки результата одного этапа в следующий этап. Эта подстановка приводит к одному постоянному коэффициенту умножения, а не к нескольким делениям.
Оценка темного канала без масштабирования и инверсии задается как
Результатом итерационной операции уточнения является
где
Подстановка в нелинейное уравнение коррекции дает
Подстановка в уравнение восстановления дает
Вычитание из 1 и умножение на 255 дает
С средней точкой интенсивности, установленной на 0,6 и коэффициентом дымки, установленной на 0,9, упрощенное уравнение является
В приведенном выше уравнении множитель, умноженный на, может называться Коэффициентом Расширения. Константа может быть реализована как постоянное умножение, а не как деление. Поэтому реализация HDL этого уравнения не требует блока деления.
Упрощенное уравнение реализовано для генерации HDL-кода путем преобразования в потоковый видеоинтерфейс и использования типов данных с фиксированной точкой. Последовательный интерфейс имитирует реальную видеосистему и эффективен для аппаратных проектов, потому что для хранения пиксельных данных для расчетов требуется меньше памяти. Последовательный интерфейс также позволяет проекту работать независимо от размера и формата изображения и делает его более устойчивым к ошибкам синхронизации видео. Типы данных с фиксированной точкой используют меньше ресурсов и обеспечивают лучшую эффективность в FPGA, чем типы с плавающей точкой.
open_system('LLEExample');
Расположение входного изображения задано в блоке LowLightImage. Подсистема LLEBehavioural вычисляет улучшенное изображение с помощью необработанных уравнений, как описано в разделе Алгоритм LLE. LLESimplified подсистема вычисляет улучшенное изображение, используя упрощенные уравнения. simpOutputViewer показывает выход подсистемы LLESimplified.
Подсистема LLEHDL реализует упрощенное уравнение с помощью формата пикселя с пропариванием и блоков с фиксированной точкой из Vision HDL Toolbox. Подсистема Входа преобразует входные кадры в пиксельный поток uint8
значения и pixelcontrol
шина, использующая блок Frame To Pixel. Подсистема Выхода преобразует поток пикселей выхода назад в системы координат изображений для каждого канала с помощью блока Pixel To Frame. Получившиеся системы координат сравниваются с результатом подсистемы LLESimplified. Подсистема hdlOutputViewer и подсистема inputViewer показывают улучшенное выходное изображение и малосветное входное изображение, соответственно.
open_system('LLEExample/LLEHDL');
Подсистема LLEHDL инвертирует вход uint8
поток пикселей путем вычитания каждого пикселя из 255. Затем подсистема DarkChannel вычисляет минимум интенсивности темного канала по всем трем каналам. Подсистема IterativeFilter сглаживает изображение воздушного света с помощью последовательных блоков Image Filter. Для сохранения точности поддерживается рост разрядности на каждой ступени фильтра. Коэффициент расширения вычисляется в области EnhancementFactor. Константа реализована с использованием блоков Constant и Retrical. Блок Pixel Stream Aligner выравнивает входной поток пикселей с конвейерным, измененным потоком. Выровненный входной поток затем умножается на модифицированный поток пикселей.
Вход в модель предусмотрен в блоке LowLightImage (Image From File). Этот пример использует входное изображение 720 на 576 пикселей с каналами RGB. И входные пиксели, и улучшенные выходные пиксели используют uint8
тип данных. Необходимые переменные для примера инициализируются в коллбэке InitFcn.
Подсистема LLEBehavioural использует блоки Simulink с плавающей точкой для прототипа уравнений, упомянутых в разделе Алгоритм LLE. LLESimplified подсистема реализует упрощенное уравнение в блоках с плавающей точкой, без операции деления. Подсистема LLEHDL реализует упрощенное уравнение с помощью блоков с фиксированной точкой и потокового видеоинтерфейса. Рисунок показывает входу изображение и улучшенные выходные изображения, полученные из подсистемы LLESimplified и подсистемы LLEHDL.
Точность результата может быть вычислена с помощью процента пикселей ошибки. Чтобы вычислить процент пикселей ошибки в выходном изображении, различие между пиксельным значением опорного выходного изображения и LLEHDL выходного изображения не должна быть больше единицы для каждого канала. Процент значений пикселей, которые отличаются более чем на 1, вычисляется для трех каналов. Подсистема simpError сравнивает результат подсистемы LLEBehavioural с результатом подсистемы LLESimplified. Подсистема hdlError сравнивает результат подсистемы LLEHDL с результатом подсистемы LLESimplified. Количество пикселей ошибок отображается для каждого канала. Таблица показывает процент пикселей ошибок, вычисленных обоими сравнениями.
[1] X. Dong, G. Wang, Y. Pang, W. Li, and J. Wen, «Быстрый эффективный алгоритм улучшения видео с низкой подсветкой» IEEE International Conference on Multimedia and Expo, 2011.