APP下载

基于FPGA的高分辨率视频图像实时增强去雾系统

2020-06-16刘华军张瑞珏刘建锋夏巧桥

郑州大学学报(工学版) 2020年2期
关键词:子块直方图灰度

刘华军, 张瑞珏, 刘建锋, 王 盛, 夏巧桥

(1.华中师范大学 物理科学与技术学院,湖北 武汉 430079; 2.上海航天电子技术研究所,上海 201109)

0 引言

由于大气散射使得图像质量严重退化、对比度下降、层次不丰富[1],雾天图像去雾处理成为了国内外的研究热点。根据不同的图像处理方式将去雾算法分为基于物理模型方法和基于非物理模型方法[2]。睢丹等[3]提出了基于混沌性的加权滤波算法,有效地降低了雾化、减少了浓雾噪点。郭伟[4]提出了基于多种先验知识的单幅雾天图像复原算法;何凯明等[5]提出了“基于暗通道优先的单幅图像去雾”方法,两种方法主要针对单幅图像,去雾效果明显,但算法的时间和空间复杂度较高。何凯明等[6]进一步提出导向滤波算法,以提高暗通道优先算法的处理速度,但其计算复杂度仍较高。魏先民[7]提出了自适应直方图均衡算法(adaptive histogram equalization,AHE),该算法自适应好、鲁棒性强,但是其存在过度放大均匀区域噪声的缺陷。基于此,Zuiderveld[8]提出了限制对比度自适应直方图均衡(contrast limited adaptive histogram equalization,CLAHE)算法,提升了图像的局部对比度并突出图像细节。由于CLAHE算法有优异的去雾效果,计算简单且易于并行化实现,因此得到研究者青睐。杨光等[9]重点研究了CLAHE算法框架及其FPGA实现,实验表明该算法具有良好的去雾效果。周卫星等[10]提出的方法改善了图像的整体视觉效果。文献[11-12]以FPGA为硬件平台实现了CLAHE算法,系统满足实时性且图像对比度明显增强。孔壮等[13]利用CLAHE算法设计基于高分辨率的视频图像去雾系统,但是图像分辨率仅为1 004×1 004。周晓波等[14]利用FPGA设计了支持多种分辨率的图像高速实时去雾系统,但其算法复杂度以及系统实时性仍有改善的空间。虽然现有去雾系统取得了不错的去雾效果,但大多数系统针对单幅图像进行处理,稳定性和实时性不足,且存在亮光区域过曝的缺陷。针对这些问题,笔者设计并构建了一种基于FPGA的1080P全高清视频图像实时增强去雾系统。测试结果表明:系统对分辨率为1080P视频图像去雾效果明显、图像层次感强,同时具有较强的实时性和稳定性,系统功耗小于5 W。

1 系统硬件设计

图1 系统框图Figure 1 System architecture

图1为系统硬件框图。高速相机输出图像分辨率为1 920×1 080,帧频为30 f/s。相机通过HD-SDI接口传输至去雾系统,接口芯片为GV7600,用于视频图像配置,系统可实现图像自检、镜像、电子变倍以及电十字叠加等功能,并完成图像增强去雾。通过RS-422串口命令对系统功能进行控制,其经过FPGA软核解析并转发给逻辑实现控制FPGA内部功能。图2为FPGA内部功能图,图3为系统实物图,其尺寸为103 mm×60 mm,质量小于100 g。

图2 FPGA功能模块Figure 2 The functional modules of FPGA

图3 系统实物图Figure 3 The photo of the system

2 CLAHE算法原理

CLAHE算法将图像进行分块,对每个子块采用对比度限幅操作来克服AHE算法过度放大噪声的缺陷。CLAHE算法步骤如下。

步骤1将图像划分为4×4个大小相同的子块(非重叠图像,1≤i,j≤4),分别对子块进行直方图统计,即统计各灰度级的像素数。

步骤2利用截断阈值β对直方图进行削峰填谷操作,截断阈值β的计算如式(1):

(1)

步骤3对削减后的直方图进行均衡,将多出的像素数分配到像素数小于β的灰度级中,以1作为像素分配步长,通过迭代的方法进行像素重分配,直至像素分配完毕,得到均衡后的结果。

步骤4根据直方图均衡结果可得到每个子块直方图映射f以及其中心像素点的灰度值,其他点的像素通过与其邻近的4个子块的直方图映射f采用双线性插值算法获取。图4为图像第j-1行至第j行、第i-1列至第i列的局部示意图(i,j≥2),其中P为待增强像素点,x、y、w、r数值关系确定P点和参考点的位置关系,根据其处于角落、内部、边界来确定各相邻子块的权重关系,加权计算得到最终的像素值,如式(2)所示:

(2)

式中:Pold为原始像素点的灰度值;Pnew为增强去雾后新灰度值。

图4 第(i,j)子块中像素P及其相邻的4个子块Figure 4 The four adjacent blocks of the sub-block(i, j)

3 改进CLAHE算法的FPGA实现

3.1 FPGA实现框架

图5为改进CLAHE算法的FPGA实现流程图。整个系统划分成6个模块,分别为输入模块、直方图统计模块、直方图均衡模块、灰度值映射模块、双线性插值模块以及输出模块。其中,直方图统计模块采用分块分通道统计,将多通道直方图合并于一个直方图中,用于后面的削峰填谷;针对直方图均衡模块,原CLAHE算法以1作为分配步长,该过程需要多次的迭代,像素重分配操作需要进行多次迭代,使得图像处理延时较大。而笔者将该过程利用映射算法进行计算,将多出的像素灰度值个数均匀的分配给256个灰度级,且仅需要进行一次削峰填谷操作,提高了算法的效率。各个模块均采用标准axi_stream接口进行互联。

图5 FPGA实现流程图Figure 5 The FPGA program block diagram

3.2 各模块原理以及实现

输入模块:输入模块通过SDI接口采集相机输出的高速图像数据,将图像数据从YUV颜色空间转换为RGB颜色空间,并将数据流转换为标准的axi_stream接口,方便与后续模块互联。

直方图统计模块:本系统将视频图像划分为多个非重叠子块,对每个子块分RGB通道进行直方图统计,并将多通道直方图进行合并,合并后的直方图数据存入乒乓RAM中。如图6为子块1的直方图统计,分RGB通道统计各分块的灰度直方图信息,采用边输入边计算的方法,将每个通道灰度值对于像素数存入对应的RAM1_R、RAM1_G、RAM1_B存储器中。当该子块所有像素输入完成之后,读出该子块每个通道像素值并将其进行叠加统计,最后将整合的直方图写入乒乓RAM1_RGB中。截断阈值β可以由上位机通过RS-422设置。当某个灰度值的个数M′大于或者等于β时,由β代替该像素的个数M′存入到RAM_RGB中,并将超过门限值的像素点个数M′-β累计到对应子块的寄存器REG_cnt中,用于后续的直方图均衡操作。

直方图均衡模块:直方图统计完成后,通过削峰填谷对其进行均衡操作,如图7所示。β为输入阈值,由于实际环境的多变性,单一阈值无法对所有情况都达到良好的去雾效果,因此本系统提供了多个可供选择的β值。

图6 子块1的直方图统计Figure 6 The histogram statistics

图7 直方图均衡Figure 7 The histogram equalization

均衡算法步骤如下:

步骤1初始化参数。 计算分配步长L=REG_cnt/256,设置截断阈值β,初始化当前灰度级i=0的像素个数M′,均衡后的灰度级个数K=0以及灰度级范围i∈[0,255]。

步骤2计算均衡后的灰度级像素个数K=L+M′[i]。

步骤3若K>β,则当前灰度级像素个数M′[i]为β;否则灰度级像素个数M′[i]=M′[i]+L。

步骤4更新灰度级i=i+1。

步骤5停止准则,判断i是否达到最大灰度级255。若满足则输出均衡后各灰度级的像素数;否则转步骤2。

原始CLAHE算法像素重分配操作需要进行多次迭代,使得图像处理延时较大,将变量REG_cnt与灰度级的个数作商,将多出的像素灰度值个数一次性均匀地分给各个未饱和灰度级,提高了实时性的同时节约了系统资源。

灰度值映射模块:利用映射算法,通过原始图像灰度值映射出增强后的灰度值。

映射算法步骤如下:

步骤1初始化每个子块的总像素数N、灰度级i=0以及其对应的原始灰度级像素值Yi=0。

步骤4更新灰度级i=i+1。

步骤5判断停止条件,判断i是否达到最大灰度级255。若满足则输出增强后各灰度级的数值;否则转步骤2。

将均衡后的灰度值直方图数据采用乒乓的方式按奇偶帧存入RAM中。

双线性插值模块:图8为双线性插值模块功能框图。双线性插值模块包括数据选取、权值计算以及插值计算。从RAM中读取像素数据时,同时计算权值因子,需对像素时钟做一定的延时来保证两者的同步性。位于角落、内部、边界位置的像素对应不同的插值计算。最后,利用视频图像相邻两帧直方图的高度相似性,以前一帧直方图均衡后的映射灰度值作为当前帧图像处理的数据,可避免缓存一帧的数据,避免了大容量外部存储器的使用,节约了资源,提高了实时性。

图8 插值计算模块Figure 8 The interpolation calculation

像素点在图像中的位置由像素时钟和行同步信号(LVAL)计数获得,即确定其所属子块中的位置。

输出模块:输出数据通过芯片GV7600/DS90CR288解析,通过SDI/Cameralink接口传送给显示端。

4 系统测试结果

为验证本文算法的有效性,将本文算法与原始CLAHE算法进行对比。图9为两种去雾算法效果图。仅对原始CLAHE算法中Y方向分量做均衡使得图片的整体亮度有一定的增强,但其色彩暗淡,对比度较低;而本文算法处理效果明显,图片色彩均匀,图片的层次感较强。

图9 两种算法去雾效果对比Figure 9 The fogging effect of the two algorithms

采用Xilinx Vivado软件对FPGA程序进行布局布线,FPGA资源消耗如表1所示。其中,共消耗了53 064个查找表(LUT),占总查找表的26.04%;消耗103个块存储单元(BRAM),占总BRAM的23.15%;消耗了60个DSP资源,占总DSP的7.14%。

表1 FPGA资源消耗Table 1 The resource consumption of FPGA

图10为直方图统计模块MODELSIM仿真的结果图。将像素灰度值按一定的时序写进RAM中,图中:rgb_vld为数据有效标志(高有效);rgb_data为灰度值(如0×71、0×72等);ram_wr_cnt为灰度值个数(如0×4 100(16进制))。

图11为双线性插值模块的MODELSIM仿真结果图。按一定的时序从RAM中读取直方图均衡后的灰度值,通过读取原始像素值查找新映射表来索引增强后的像素值。以读取B通道数据为例,其中:ram1_en_pi_b为读B值使能(高有效),ram1_addr_pi_b为B的数据地址(如0x85、0x84),ram1_din_pi_b为B的数据值(如0x92),pipe1_row_cnt与pipe1_line_cnt为子块1的行列计数(如0x20、0x3f),以确定该值所在子块1中位置。

图10 直方图统计仿真结果Figure 10 The simulation of histogram statistics

图12为本文算法MATLAB实现和FPGA实现效果图。FPGA与MATLAB实现结果图对应位置像素点的RGB值一致,说明了FPGA实现的正确性。

图12 MATLAB和FPGA 实现效果图Figure 12 The fogging effect of this algorithm in MATLAB and FPGA

图13为系统外场测试结果。可以看出,原始有雾图像图片不清晰、对比度较低,很难识别图中的目标(图中房屋轮廓);而去雾图像对比度增强、突出细节、层次感增强。结果表明,该系统具有较强的实时性和稳定性,系统功耗测试仅为4.848 W,可应用于低功耗领域。

图13 系统去雾效果图Figure 13 The fogging effect of this system

5 结论

以FPGA为硬件平台,设计并构建了一种基于1080P高分辨率视频图像实时增强去雾系统,对CLAHE算法进行一定的改进,完成了改进后的CLAHE算法各个模块的设计和硬件实现。系统测试结果表明,系统具有极好的稳定性和实时性,图像的对比度明显增强,图像内容清晰,层次感强,能够达到很好的去雾效果,同时还具有低功耗特性。

猜你喜欢

子块直方图灰度
基于八叉树的地震数据分布式存储与计算
符合差分隐私的流数据统计直方图发布
采用改进导重法的拓扑结构灰度单元过滤技术
基于特征值算法的图像Copy-Move篡改的被动取证方案
Bp-MRI灰度直方图在鉴别移行带前列腺癌与良性前列腺增生中的应用价值
基于FPGA的直方图均衡图像增强算法设计及实现
一种分层信息提取的多块主元分析故障监测方法
Arduino小车巡线程序的灰度阈值优化方案
用直方图控制画面影调
基于波浪式矩阵置换的稀疏度均衡分块压缩感知算法