В этом примере показано, как улучшить изображения с низким освещением с помощью алгоритма, подходящего для FPGA.
LLE (low-light enhancement) - это этап предварительной обработки для приложений в области автономного вождения, сбора научных данных и общего визуального улучшения. Изображения, полученные в условиях низкой освещенности и неравномерной яркости, имеют низкий динамический диапазон с высокими уровнями шума. Эти качества могут привести к ухудшению общей производительности алгоритмов компьютерного зрения, которые обрабатывают такие изображения. Этот алгоритм улучшает видимость основных элементов изображения.
Примерная модель включает в себя основанный на кадрах алгоритм с плавающей запятой в качестве опорного, упрощенную реализацию, которая уменьшает операции разделения, и потоковую реализацию с фиксированной точкой упрощенного алгоритма, который подходит для аппаратных средств.
Этот пример выполняет LLE, инвертируя входное изображение и применяя алгоритм устранения помутнения к инвертированному изображению. После инвертирования изображения с низким светом пиксели, представляющие небыречную область, имеют низкую интенсивность, по меньшей мере, в одном цветовом канале. Эта характеристика похожа на изображение, запечатленное в туманных погодных условиях [1]. Интенсивность этих темных пикселей в основном обусловлена рассеянием, или воздушным светом, поэтому они обеспечивают точную оценку эффектов помутнения. Чтобы улучшить темный канал в перевернутом изображении с низким освещением, алгоритм изменяет изображение с воздушным освещением на основе условий окружающего освещения. Изображение воздушного света модифицируется с использованием оценки темного канала и затем уточняется сглаживающим фильтром. Чтобы избежать шума от чрезмерного усиления, в примере применяется нелинейная коррекция для лучшей оценки карты воздушного освещения. Хотя этот пример отличается своим подходом, краткий обзор улучшения изображения с низким освещением см. в разделе Улучшение изображения с низким освещением (панель инструментов обработки изображений) (панель инструментов обработки изображений).
Алгоритм LLE принимает трехканальное изображение RGB с низким уровнем света в качестве входного сигнала. На этом рисунке показана блок-схема алгоритма LLE.

Алгоритм состоит из шести этапов.
1. Масштабирование и инверсия: входное изображение
преобразуется в диапазон [0,1] делением на 255, а затем инвертированием в пикселях.


2. Оценка темного канала: Темный канал оценивается путем нахождения пиксельного минимума по всем трем каналам инвертированного изображения [2]. Минимальное значение умножается на коэффициент помутнения,
который представляет количество помутнения для удаления. Значение
находится в диапазоне от 0 до 1. Более высокое значение означает, что из изображения будет удалено больше помутнения.
![$$ I_{air}(x,y) = z \times \min_{c\ \epsilon\ [r,g,b]} I^c_{inv}(x,y)$$](../../examples/visionhdl/win64/LLEHDLExample_eq10161138380677030066.png)
3. Уточнение: Изображение воздушного света с предыдущей стадии уточняется итеративным сглаживанием. Это сглаживание усиливает детали изображения после улучшения. Эта стадия состоит из пяти итераций фильтра с ядром 3 на 3 для каждой стадии. Уточненное изображение хранится в.
Эти уравнения получают коэффициенты фильтра,,
используемые для сглаживания.
![$$I_{refined(n+1)}(x,y) = I_{refined(n)}(x,y) * h,\ n = [0,1,2,3,4]\ \&
\ I_{refined(0)} = I_{air}$$](../../examples/visionhdl/win64/LLEHDLExample_eq03126241577109032201.png)
![$$ where \ h = \frac{1}{16}
 \left[ {\begin{array}{ccc}
 1 & 2 & 1\\ 2 & 4 & 2\\ 1 & 2 & 1\\
 \end{array} } \right] $$](../../examples/visionhdl/win64/LLEHDLExample_eq01986529172588185173.png)

4. Нелинейная коррекция: Чтобы уменьшить чрезмерное увеличение, очищенное изображение корректируется с помощью уравнения нелинейной коррекции, показанного ниже. Константа,,
представляет среднюю линию изменения темных областей карты освещения с темных на яркие значения. В примере используется эмпирически полученное значение.
![$$ I_{nlc}(x,y) = \frac{[I_{refined}(x,y)]^4}{[I_{refined}(x,y)]^4+m^4} $$](../../examples/visionhdl/win64/LLEHDLExample_eq04193056707373069973.png)
5. Восстановление: Восстановление выполняется пиксельно по трем каналам инвертированного и скорректированного изображения,
как показано:

6. Инверсия: Для получения окончательного улучшенного изображения этот этап инвертирует выходные данные этапа восстановления и масштабируется до диапазона [0,255].

Этапы масштабирования, нелинейной коррекции и восстановления включают операцию разделения, которая неэффективна для реализации в аппаратных средствах. Для уменьшения задействованных вычислений уравнения в алгоритме упрощаются путём подстановки результата одного этапа в следующий этап. Эта подстановка приводит к единому постоянному коэффициенту умножения, а не к нескольким делениям.
Оценка темного канала без масштабирования и инверсии задается
![$$I_{air}(x,y) = \frac{z}{255}I'_{air}(x,y)$$ where $$I'_{air}(x,y) = 255
- \min_{c\ \epsilon\ [r,g,b]}I^c(x,y)$$](../../examples/visionhdl/win64/LLEHDLExample_eq18147092833887243057.png)
Результатом итеративной операции уточнения на
является

где
![$$I'_{refined(n+1)}(x,y) = I'_{refined(n)}(x,y) * h,\ n = [0,1,2,3,4]\
\& \ I'_{refined(0)}(x,y) = I'_{air}(x,y)$$](../../examples/visionhdl/win64/LLEHDLExample_eq05051671728412630792.png)
Подстановка
в уравнение нелинейной коррекции дает
![$$I_{nlc}(x,y) = \frac{z^4[I'_{refined}(x,y)]^4}{z^4[I'_{refined}(x,y)]^4
+ (255 \times m)^4}$$](../../examples/visionhdl/win64/LLEHDLExample_eq11098809684204044236.png)
Подстановка
в уравнение восстановления дает
![$$I^c_{restore}(x,y) = 1 - \frac{I^c(x,y)}{255} -
\frac{I^c(x,y)}{255}\frac{z^4}{(255 \times m)^4}[I'_{refined}(x,y)]^4$$](../../examples/visionhdl/win64/LLEHDLExample_eq00152702196517787377.png)
Вычитание
из 1 и умножение на 255 дает
![$$I^c_{enhanced}(x,y) = I^c(x,y)\times \left(1 +
\Big[\frac{z}{255 \times m}I'_{refined}(x,y)\Big]^4\right)$$](../../examples/visionhdl/win64/LLEHDLExample_eq00838936861673537305.png)
Если средняя точка интенсивности равна
0,6, а коэффициент помутнения
равен 0,9, упрощенное уравнение
![$$ I^c_{enhanced}(x,y) = I^c(x,y) \times \left( 1 +
\Big[\frac{1}{170}I'_{refined}(x,y)\Big]^4 \right)$$](../../examples/visionhdl/win64/LLEHDLExample_eq02464686153219006662.png)
В приведенном выше уравнении коэффициент, умноженный
на, можно назвать коэффициентом расширения. Константа
может быть реализована как постоянное умножение, а не как деление. Следовательно, реализация этого уравнения в ЛПВП не требует блока деления.
Упрощенное уравнение реализовано для генерации кода ЛПВП путем преобразования в потоковый видеоинтерфейс и использования типов данных с фиксированной точкой. Последовательный интерфейс имитирует реальную видеосистему и эффективен для аппаратных конструкций, поскольку для хранения пиксельных данных для вычислений требуется меньше памяти. Последовательный интерфейс также позволяет конструкции работать независимо от размера и формата изображения и делает ее более устойчивой к ошибкам синхронизации видео. Типы данных с фиксированной запятой используют меньше ресурсов и обеспечивают более высокую производительность FPGA, чем типы с плавающей запятой.
open_system('LLEExample');

Местоположение входного изображения указывается в блоке LowLightImage. Подсистема LLEBehavioural вычисляет улучшенное изображение с использованием необработанных уравнений, как описано в разделе Алгоритм LLE. Подсистема LLESimplified вычисляет улучшенное изображение с использованием упрощенных уравнений. В simpOutputViewer отображаются выходные данные подсистемы LLESimplified.
Подсистема LLEHDL реализует упрощенное уравнение, используя формат парящего пикселя и блоки с фиксированной точкой из панели инструментов Vision HDL. Подсистема ввода преобразует входные кадры в поток пикселей uint8 значения и pixelcontrol с использованием блока «Кадр в пиксель». Подсистема вывода преобразует выходной поток пикселей обратно в кадры изображения для каждого канала с использованием блока Pixel To Frame. Полученные кадры сравниваются с результатом работы подсистемы LLESimplified. Подсистема hdlOutputViewer и подсистема inputViewer показывают улучшенное выходное изображение и входное изображение с низким освещением соответственно.
open_system('LLEExample/LLEHDL');

Подсистема LLEHDL инвертирует вход uint8 поток пикселей путем вычитания каждого пикселя из 255. Затем подсистема DarkChannel вычисляет минимальную интенсивность темного канала для всех трех каналов. Подсистема ItingFilter сглаживает изображение освещения с помощью последовательных блоков фильтра изображения. Рост битов каждой ступени фильтра поддерживается для сохранения точности. Коэффициент расширения рассчитывается в области Коэффициент расширения. Константа
реализуется с использованием блоков Константа (Constant) и Возвратно-поступательный (Featural). Блок выравнивания пиксельного потока выравнивает входной поток пикселей с конвейерным измененным потоком. Выровненный входной поток затем умножается на модифицированный поток пикселей.
Входные данные модели предоставляются в блоке LowLightImage (Изображение из файла). В этом примере используется входное изображение размером 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 и J. Wen, «Быстрый эффективный алгоритм улучшения видео с низким освещением» IEEE Международная конференция по мультимедиа и экспо, 2011.