基于ZYNQ的图像去雾系统

423 阅读12分钟

基于引导滤波的暗通道去雾算法

主观评价方法

客观评价方法:

信息熵:图像中所包含的信息量,汉武图像的信息熵较小

峰值信噪比PSNR:PSNR越大,图像的失真程度越小。

平均梯度: 反应图像的细节反差以及纹理变化的速率。

雾霾浓度

1 根据雾天成像模型得到,雾天退化模型:

I为待去雾图像 J为清晰图像 t为透射率,反应光线穿透雾的能力,随着场景深度的增加而指数衰减。 A为大气光值 image.png

则透射率的估计和大气光值的计算是雾天退化模型的关键。

2 暗通道先验去雾

暗通道先验: 实现对透射率的粗估计

在不包含天空的区域,通常有一些像素至少一种颜色通道有非常低的强度值,且趋近于零,称之为暗原色。

对雾天退化模型做局部最小化处理。 实际是这样进行的:

首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定。

3 大气光值

从暗通道图中按照亮度大小取前0.1%的像素的均值

4 引导滤波来优化去雾图像的透射率

在引导图像的帮助下使得滤波输出更结构化,更加凸显细节。

引导滤波模型和输入图像做岭回归。

引导滤波来优化去雾图像的透射率:

图像处理,导向滤波器(Guided Image Filter)是一种能使图像平滑化的非线性滤波器。与双边滤波器(Bilateral Filter)相同,这个滤波器同样能够在清楚保持图像边界的情况下,达到让图像平滑的效果。

引导滤波来优化去雾图像的透射率,引导滤波器可以保持平滑特性。在引导图像的帮助下,它可以帮助使滤波输出比输入更有结构化,更加凸显细节。

将图像的灰度图作为引导图像I,输入图像P进行滤波。在一个像素处的滤波输出可以表示为一个加权平均。q为输出图像,ij为像素坐标。

image.png 滤波核Wij是引导图像I的一个函数,与P无关,其值如下:

image.png

image.png

局部线性滤波模型公式如下:

image.png 上式两边求梯度,引导图像的梯度信息决定输出图像的梯度信息,当I有边界时候,输出图像对应位置也会有边界。而a,b的值会决定梯度信息和平滑信息的权重大小。

为了确定系数(ak,bk),需要对输入P进行约束,减去一些不需要的分量n,例如噪声:

image.png

通过岭回归去计算p和q之间的差异。

image.png

最后计算出a,b在就局部的值,进而可以求出输出q。

image.png

对于ZYNQ7010的资源介绍:

包含PS和PL两部分。ZYNQ-SOC整合了ARM双核的cortex-A9处理器和Xilinx7系列的FPGA架构。

触发器FF:35200

查找表: 17600

逻辑单元CLB: 28k

BLOCK RAM: 2.1Mb

乘法器 : 80个

ZYNQ以处理器为核心的系统,PL为外设。

AXI协议:

ZYNQ将高性能ARM-cottex-A系列处理器和FPGA在单芯片内紧密结合。 两者之间交互通过AXI4总线协议,即高级可扩展接口,是ARM发布的AMBA4.0协议的一部分。

AXI4协议是一种高性能,高带宽,低延迟的片内总线。其数据、控制、地址通道是分离的。 支持不对齐传输,支持突发传输。

PS-PL的AXI接口

在ZYNQ中,PS和PL的相互通信通过三个通路完成,分别是GP(General Purpose)接口、HP(High Performance)接口以及ACP(Accelerator Coherency Port)接口三种不同的数据通路。

GP接口: AXI通用传输接口,一般用于PS PL之间传输低俗的控制信息和少量数据。

HP接口:一般用于和DDR间的高速数据交互,数据迁移一般通过PL的DMA完成。图像通过FPGA完成采集,预处理,然后通过AXI-HP接口传输到DDR中以便进行下一步处理。

ACP接口:通过这个接口PL可以直接访问PS部分的cache。

系统硬件开发设计方案:

构建针对交通视频实时去雾模块,该系统包括图像采集模块,视频处理模块VIP模块,存储模块,显示模块,以及PS和PL交互模块。

其中采集模块通过OB5640采集图像,VIP模块基于暗通道先验的引导滤波去雾算法实现,存储模块包括了DDR3,提供给程序暂存空间,显示模块包括HDMI接口输出图像去雾图像.

图像采集模块 以及存储模块 全部基于PS端实现,去雾算法模块以及显示模块基于PL端实现。两者的交互通过AXI接口实现。

image.png

image.png

系统PS端通过SCCB协议配置OV5640采集图片数据,随后将采集到的图片通过去雾模块, 处理后的数据为摄像头输出的行、场同步信号并不能直接作为视频流出,需要对数据进行转换,

通过Xilinx提供的video to AXI-Stream IP核进行数据转换,把处理后的数据通过VDMA写入帧缓存,VDMA支持将AXI-Stream数据转化成AXI-Memory Map格式,通过HP接口连接,从而高效的访问DDR3。

VDMA从DDR3中在将数据通过AXI-Stream to Video Out IP核,在VTC IP核控制下,可以产生时序信号,将帧缓存的数据转化成视频输出的数据格式。

VDMA从DDR3中在将数据通过AXI-Stream to Video Out IP核,在VTC IP核控制下,可以产生时序信号,将帧缓存的数据转化成视频输出的数据格式。

VTC:video timing controller ip核用于控制AXI stream接口和视频输出的时序参数。 时序发生器,用于对显示器输出所需的时序信号,方便再下一帧图像对行,场消隐区进行逻辑处理。

HDMI 驱动 IP 核的输入接口连接到 AXI_Stream to Video Out 的输出接口,其需要两个不同频率的输入时钟,HDMI的串行时钟是像素时钟的5倍,均由动态时钟生成 IP 核来提供。

动态时钟配置为VTC和HDMI提供时钟信号,其主要功能是根据不同的分辨率配置出不同的时钟输出,本质上是锁相环(PLL)。

AXI互联IP

在某些情况下,对于高带宽应用程序,使用SmartConnect IP可以提供更好的优化。AXI SmartConnect IP通过综合针对重要接口进行优化的低区域自定义互连,在低延迟下提供最大的系统吞吐量。

对于中到高性能设计,推荐使用AXI SmartConnect IP,因为它在面积和时间上提供了更好的向上扩展。对于低性能(AX14-Lite)或中小型复杂性设计,AXI Interconnect IP可能更有效的面积。

image.png

在通过AXI4-Stream to Video Out IP后,需要添加VTC(Video Timing Controller)IP核,它用于控制AXI4-Stream接口和视频输出的时序参数,其可以视为一个时序发生器,用于对显示器输出所需的时序信号,方便再一帧图像对行、场消隐区进行逻辑处理。

HDMI 驱动 IP 核的输入接口连接到 AXI_Stream to Video Out 的输出接口,其需要两个不同频率的输入时钟,HDMI的串行时钟是像素时钟的5倍,均由动态时钟生成 IP 核来提供。GP接口和HP接口的时钟频率不同,

GP接口主要负责低速的控制流模块配置,HP接口主要负责高速的视频流传输接口,

动态时钟配置为VTC和HDMI提供时钟信号,其主要功能是根据不同的分辨率配置出不同的时钟输出,本质上是锁相环(PLL)。

HDMI是高清晰的多媒体接口,其有3组差分信号,所以RGB数据在传输过程中需要将RGB数据转化为TMDS信号用于HDMI的显示,本次系统调用了DVI接口,HDMI向下兼容DVI传输接口。

OV5640

OV5640是由豪威科技公司生产的COMS图像传感器,OV5640支持高分辨率、采集速度更佳,具有更高的图像处理性能。本次系统采用OV5640进行视频的图像采集,它是一款单芯片图像传感器,光感阵列达500W像素,传感器内部继承了图像处理功能,包括自动曝光控制,自动白平衡等。

本系统像素输出格式为RGB888,输出时序有帧同步信号(VSYNC)、行同步信号(HREF\HSYNC)、像素数据(D[9:0])、以及像素时钟(PCLK)

初始化配置:

image.png

在SDK上部署初始化OV5640,调用初始化函数,初始化参数为输出水平像素点数,输出垂直像素点数,水平总像素大小,垂直总像素大小。

图像处理模块 行缓存

图像去雾模块硬件实现主要包括以下几个部分:暗通道的求取,估计透射率,估计大气光值,以及求解复原图像。

其中暗通道的求取,以及透射率细化模块处理较为复杂,需要对图像进行滤波操作,关于空间滤波在图像处理中有许多的方法可以实现,但是对于硬件描述语言Verilog去实现这些算法不仅会很复杂还会导致运算速率大大降低。

image.png

滤波操作:对于串行数据,图像的处理都是以帧为单位,将相机采集到的数据存入内存,串行处理器从内存进行数据读取。数据对内存反复读取很耗时,如果输入输出图像都以帧缓存,算法性能受限。

对于FPGA实现滤波操作电路设计,行缓存可以与窗口并行放置,窗口则是由移位寄存器构成,行缓存自然也可与窗口串行放置。

思路 :fifo行缓存,移位寄存器开窗口3x3窗口

基于3行数据缓存模块,在滤波模块中我们只需要做的是通过移位寄存器获取同一行的三个数

使用三个fifo作为三行数据的缓存,当第一行数据写入满line_buffer0后将第一行数据读出作为line_buffer1的输入,同时line_buffer0继续写入。 当line_buffer0,line_buffer1,line_buffer2,等三个fifo 写满目的数据后,第四行数据来临时,同时输出三行数据实现并行操作。

当对图像进行开窗操作时,以边界像素为中心的窗口会存在部分像素点缺失,对于边界问题在图像边界外补充合适的常数

可以采用填充固定值的方式,不会影响到开窗的局部区域像素点极值,操作简便。

暗通道模块

对输入图像的像素点进行最小化处理:

对于同一位置像素值,在rgb通道像素点取最小值,随后在三个通道的最小值的局部区域进行最小值滤波。得到暗通道数值。

在Verilog设计中对三个通道值进行比较,对于通道内的像素点的值比较可以采用两个数据选择器可以完成。

image.png

本系统采用5*5窗口大小通过FPGA行缓存对图像进行滤波处理,得到窗口列最小值,最后再比较列最小值,从而得到暗通道图像。

大气光值A的求取

暗通道中亮度强度为前0.1%的像素点进行平均计算而得到的。

遍历整个图像进行大气光值的求取会消耗大量的资源以及时间,且在各个模块中数据传输都是以流的方式进行传输,不利于实时性的要求。

我们图像所有像素点进行直方图统计分布最广的灰度值大小,依此来对大气值进行估计。

在FPGA模块中,本文做法将像素灰度值分段进行处理,在含雾图像中设置阈值为160为始,分段区间分别为:160169、170189、190199、200209、210219、220229、230239、240255,在未达到阈值的灰度图像以160为大气光值进行统计处理,

在Verilog中采用时序电路进行设计,将灰度值分为8段再遍历暗通道图像,对区间段的像素点进行统计。

透射率粗估计

结合暗通道图像以及大气光值进行求解。

透射率的范围在[0,1]区间内,但是在Verilog中,对于浮点数的运算存在一定的难度,需要对式同时扩大256倍,有利于硬件的实现。除此之外,在实现任意数之间的乘法运算中需要乘法器,其占用逻辑资源较多,对于此类问题可以采用移位操作,将数据左移八位,从而达到扩大倍数的作用。

image.png

求取流程图 image.png

除法器使用,除法器就是利用取余运算,自定义位宽,Xilinx封装好了Divider Gennerator除法器的IP可以直接调用。

引导滤波部分

行缓存+开窗 进行滤波处理