APP下载

基于ZYNQ的实时去雾系统设计实现

2023-01-31姚小江解其云张润芃

计算机工程与设计 2023年1期
关键词:色彩图像算法

陆 成,姚小江,解其云,张润芃

(南京邮电大学 电子与光学工程学院、柔性电子(未来技术)学院,江苏 南京 210046)

0 引 言

雾天光线传播会受到空气中悬浮颗粒散射的影响,导致诸如视频监控、航拍无人机、辅助驾驶系统等成像设备获取的图像关键信息丢失且对比度大幅降低,无法进行有效工作[1,2]。

区别于传统单一的串/并行处理器,ZYNQ SoC(system on chip)作为全可编程的异构平台,内部集成了双核ARM Cortex-A9处理器与7系列FPGA,并通过AXI总线实现SoC内部高带宽、低时延的连接。SoC兼具ARM灵活的控制能力与FPGA强大的并行计算能力,特别适用于含有大量的数学运算和逻辑控制的实时图像处理场合。能够满足当前户外视觉系统高实时性、高灵活性、低功耗、低成本以及小型化的需求。而Retinex算法因其去雾效果良好,适用场合较广,复杂度及计算量适中等特点,适合部署在嵌入式设备。

目前在ZYNQ SoC上对于Retinex去雾算法部署优化的研究较少。文献[3]使用HLS工具完成SSR算法设计,去雾效果及资源利用仍有较大优化空间。文献[4]基于软硬件协同的思想实现了基于HSV空间的Retinex算法,资源利用优秀,但去雾效果受限于数据精度。文献[5]中方法及效果与前者较为相近。文献[6]实现了一种针对夜间图像增强的Retinex算法,图像暗部细节提升十分明显,但资源消耗相对较大,成本较高。文献[7]提出一种自然恢复的Retinex算法,同样效果明显,且资源使用率有大幅度降低。现有相关研究在资源利用、成本控制方面仍然有很大优化空间,无法同时保证算法有效性与设计低成本。另外没有实现去雾算法针对不同场合使用的灵活参数调整,在算法实时性方面也还有提升空间。本文从Retinex理论出发,针对现有设计与研究的不足加以改进,并对算法部署在可编程逻辑架构上的难点提出解决方案。

1 Retinex理论

Retinex理论由Land等提出,理论具体内容可见文献[8]。理论核心思想是认为一幅图像S(x,y) 可分解为图像照度分量L(x,y) 和反射分量R(x,y), 即

S(x,y)=L(x,y)·R(x,y)

(1)

式(1)两边同时转向对数域可以计算出物体真实图像数据

logR(x,y)=logS(x,y)-logL(x,y)

(2)

式(2)包含一个已知量和两个未知量,为了得到确切解, 众多学者提出了不同的Retinex算法。

Jobson等使用高斯中心环绕函数F(x,y) 与原图像S(x,y) 进行卷积来估算图像照度分量,称为SSR(single scale retinex)算法,目前被广泛使用各种图像增强场合[9]。即

logR(x,y)=logS(x,y)-log[F(x,y)*S(x,y)]

(3)

基于SSR算法,Rehman等选择不同尺度求取反射分量的值,再进行加权平均,称为MSR(multi scale retinex)算法。MSR可以在保持图像色调均衡的同时进一步压缩图像灰度的动态范围[10]

(4)

式中:K是高斯中心环绕函数的个数,一般取3兼得高、中、低3个尺度的优点,wk为每个尺度的权重。

为了解决MSR算法因噪声放大引起图像局部颜色失真的现象,Jobson等又提出了MSRCR(multi-scale retinex with color restoration)算法[11]。MSRCR通过引入色彩恢复因子来修正图像在去雾过程中丢失的彩色信息。算法实现如下

RMSRCRi(x,y)=G·[Ci(x,y)RMSRi(x,y)-O]

(5)

(6)

式中:Ci(x,y) 为i通道对应像素点的色彩恢复因子,Ii(x,y) 为当前通道对应像素点的值,α为受控制的非线性强度,β为增益常数,G为整体增益,O为修正偏差,N为图像通道数,对于RGB图像,N=3, 则Ij(x,y) 为各通道当前像素点位置的值。

2 改进Retinex算法

Retinex算法经过众多学者的优化与创新,去雾效果足够优秀,但是对于高分辨率图像,就其在PC处理器的运行速度而言,还远达不到实时处理的标准。区别于传统串行处理器,FPGA能够在同一个时钟周期内并行处理多个计算任务,不同任务之间可以形成流水线结构,进而大幅度缩短算法的运行时间。但FPGA同样受限于本身架构特点,存在不足之处。算法实现存在以下难点:SoC内部无论是Cortex-A9处理器或是Artix-7的DSP48资源都很难做到对算法产生的大量浮点数据进行实时处理;SoC内部逻辑资源有限,难以在低成本的同时保证去雾算法的效果;传统Retinex算法为串行执行,需要在不改变算法本质的基础下进行并行加速。基于以上,本文对算法进行改进,在保证去雾效果的基础上,使其适合在可编程逻辑架构运行,改进算法架构如图1所示。

图1 改进Retinex算法架构

改进算法在原算法基础上主要进行了光照估计、色彩平衡、图像融合三方面优化。使用双边滤波联合Gamma校正改善原有算法的光照估计过程,并引入色彩恢复因子加以白平衡对去雾后图像色彩进行校正,最后融合直方图均衡化的优点对输出图像进行增强。

2.1 光照分量估计优化

经典Retinex算法采用的高斯滤波是空间域滤波,中心点像素值由邻域内其它点像素值加权计算得到,权值仅与像素距离有关,滤波后图像会变得模糊,丢失细节。而双边滤波可以看成两个高斯滤波的结合,一个考虑距离空间临近,一个考虑颜色相似[12]。计算空间临近度权值和像素值相似度权值的乘积,使用优化的权值与原图像卷积,进而达到保边去噪的效果。双边滤波实现如下

(7)

其中,BF[I]p为滤波后像素,s为滤波窗口域,Gσs和Gσr分别为空间临近和像素相似高斯滤波器,滤波器标准差由人为确定。

小尺度的SSR可以增强细节,但容易丢失色彩,大尺度的SSR可以保持色彩,但对比度增强方面欠佳[13],因此MSR算法使用高、中、低3个尺度的高斯函数分别对原图像进行卷积,兼顾了亮度提升和细节增强。在FPGA中,可以将数据流复制后再分别进行流水线处理,不会影响算法实时性,但是会消耗大量的逻辑资源。而Gamma校正在γ<1时,可以提升图像对比度,使得校正后的图像更符合照度图像。所以设计使用小尺度的双边滤波函数与原图像卷积加以Gamma校正代替多尺度高斯函数用于提取图像的照度分量。根据对大量图像进行实验后发现γ值为0.35校正后的照度分量为佳,Gamma校正硬件实现如下所示

(8)

dst(x,y)=lut[src(x,y)]

(9)

其中,lut[i] 是存储对应γ值校正后的数组,src(x,y) 为原图像灰度值,dst(x,y) 为经过Gamma校正后该点灰度值。

2.2 Min-Max归一化替代指数域回转

传统Retinex算法存在对数域数据转向指数域的步骤,浮点型数据进行指数运算会消耗大量的DSP资源,并且较难满足时序要求。Min-Max归一化相比于指数计算可以节省大量资源,如果样本数据没有大量集中在一起时,对图像数据的线性映射效果会非常好。本设计使用Min-Max归一化的方法来代替指数运算将加法器输出的数据重新映射到[0-255]的值域内实现图像的恢复。Min-Max归一化算法实现如下

(10)

其中,Ii max和Ii min分别为图像第i个通道的最大和最小值。Vmax和Vmin是给定放缩范围的最大值和最小值,对于8位无符号图像Vmax=255,Vmin=0。 而I′i(x,y) 则为原图像Ii(x,y) 经过线性映射后的结果。

2.3 原始色彩恢复与平衡

SSR和MSR算法都存在去雾后图片往往会出现色彩偏差的问题,因为算法分通道单独进行,忽略了不同色彩通道之间的联系。文献[5,6]将图像从RGB空间分别转换到HSV和YCbCr空间,只对亮度信息进行处理,这样虽然有效防止了色彩出现偏差,但是并不能增强被雾霾弱化的色彩,且一定程度上也会减弱去雾效果。本文根据MSRCR算法,引入色彩恢复因子,用于调节各个通道之间的比例关系,在数据选取恰当的情况,可以在不影响去雾效果的情况下有效恢复出图像原始色彩。为了抑制高亮天空区域,G选择为0.7。调节各通道比例的α、β参数分别选择为200和0.36可以对大部分有雾图像起到较好的色彩恢复效果。

Retinex算法以色彩恒常性理论为基础,而自动白平衡算法(auto white balance,AWB)可以消除相机在不同光线条件下可能会出现的偏色问题,模拟人类视觉系统的颜色恒常性。常用的AWB算法有灰度世界法、完美反射法等[14],硬件实现难度相仿。本文选取消耗资源更少的灰度世界法对经过色彩因子恢复的图像进行白平衡,进一步保证算法对原始色彩、色温的准确恢复调节。算法实现如下

(11)

(12)

式中:Ravg、Gavg、Bavg分别为RGB这3个通道亮度均值,K=(Ravg+Gavg+Bavg)/3。

2.4 融合增强

直方图均衡化将图像的原始直方图变换为均匀分布的形式,有效增加图像灰度的动态范围,一定程度上消除了颜色偏差,同时增加了对比度,显示了更多的细节。Reti-nex算法可以显著提高暗部区域的细节,但亮部区域处理后可能会出现光晕、泛白、对比度下降等现象[15]。本文将这两种图像增强算法进行像素级融合互补,首先将图像转换到YCrCb空间对亮度分量Y进行直方图均衡,可以使图像不出现失真的情况下增强对比度,再转回RGB空间与经过Retinex算法后输出的图像进行线性融合,融合规则如下

dst(x,y)=α*src1(x,y)+(1-α)src2(x,y)

(13)

src1(x,y) 和src2(x,y) 分别为直方图均衡化与Retinex过程处理后图像,α取0.2时对大部分图像都能起到良好的融合效果,融合后图像各方面指标都较为优秀。

3 硬件加速实现

Xilinx公司的Vitis HLS(high-level synthesis)工具可以从C层面开发和验证算法,以更高的抽象级别实现硬件细节。相比于RTL层面更快迭代设计。在设计中使用指令(pragmas),进而实现算法代码对硬件电路精确的调度与绑定。Vitis vision库是基于OpenCV针对FPGA架构专门优化的视觉库,包含了大部分基础的OpenCV算法函数,方便用户快速实现自己的算法。设计使用Vitis HLS工具完成去雾IP核开发与验证,并在ZYNQ 7020开发板上进行测试。

3.1 算法整体流水线设计

FPGA通过为每个功能模块建立单独的硬件来实现整个算法所需要的逻辑功能,指令#pragma HLS DATAFLOW可以让每个功能模块间形成流水线,实现在一个时刻完成多个算法的并行处理,最大程度上降低算法总延时,算法整体流水线架构如图2所示。

图2 改进Retinex算法内部流水线设计

(1)将原图像每个像素点加1,防止在对数运算中出现错误。

(2)复制数据流,分别用于直方图均衡化过程和Reti-nex过程。

(3)第一路数据流图像转换到YCrCb色彩空间,通过直方图均衡化模块只对Y分量进行处理后再转回RGB空间。

(4)第二路数据流经过双边滤波与Gamma校正处理后与经过同步保持的第三路数据流进行Retinex过程处理。

(5)将Retinex算法和直方图均衡化算法处理后的数据进行线性融合。

(6)对融合后的图像进行色彩恢复以及白平衡处理,最后输出去雾图像。

3.2 模块内部设计与优化

算法内部是由许多功能模块通过DATAFLOW指令串联而成的,功能模块根据FPGA架构特点进行设计,同时也应用了适合的pragma在逻辑资源与处理延时之间达到平衡。

3.2.1 查找表计算对数

改进算法中的Retinex过程模块和色彩恢复模块都涉及到对数运算。对数运算和指数运算一样会消耗FPGA内部大量的硬件资源。算法处理的图像是8位3通道的真彩色图像,像素点的灰度级数在0-255之间,所以对于Retinex过程模块只需要存储ln[0-255]的值就可以快速计算出对数值。而对于色彩恢复模块,将式(6)变形可得

(14)

3.2.2 数据格式标准化

改进算法中处理过程中会产生大量的小数,例如进行Min-Max归一化时,会先将图像数据压缩到0-1范围,再重新映射回0-255值域内。考虑到ZYNQ中DSP48E资源的浮点运算能力较弱,本设计将所有出现的浮点数转化为定点保存。由Min-Max归一化公式可知,要想数据在定点近似保存时不存在误差,分辨率至少为1/255≈4×10-3。在计算机中二进制近似表示为0.000000010000011000。Vitis HLS除了支持C++基本数据类型之外,还提供了任意精度定点数据类型,可以避免位宽资源不必要的浪费。通过模板类ap_[u]fixed 可以创建任意精度定点类型,其中W表示数据总位宽,I为整数部分位宽,Q为舍入或量化类型,O为溢出模式,N为溢出模式下的饱和位数。在FPGA中使用定点表示浮点数不仅可以节约大量的位宽、逻辑资源,还能大幅度改善算法综合实现后的时序性能。

根据上述分析,设计统一使用ap_fixed<24,8> 有符号定点数表示浮点数。对于图3中不同数据精度输出图像:主观上看不出太大差别,但是使用Image Watch工具放大道路红灯处像素,可以看出使用ap_fixed<16,8> 定点数据相对于使用单精度浮点数算法输出图像有较大误差,而使用ap_fixed<24,8> 定点数据的输出误差可以忽略不计。经过计算,使用ap_fixed<24,8> 类型数据相对于单精度浮点数据输出图像结构相似性达到99.7%,客观上保证了去雾效果不会受限于数据精度。

图3 不同数据精度输出图像及其局部像素值

3.2.3 依赖循环流水化

在Min-Max归一化算法和自动白平衡算法以及直方图均衡化算法内部都存在有依赖关系的循环。以Min-Max归一化处理为例,算法需要计算出一帧图像数据的最大最小值,再使用该值进行归一化处理。

如图4所示,算法需要经过两次对图像遍历的Loop才能完成对图像的归一化处理,由于两个Loop之间存在依赖关系,无法使用DATAFLOW指令进行流水线处理,只能串行执行这两个Loop,极大增加了算法的延时,且对于其它模块需要的同步FIFO是巨大的。对此,设计使用static限制符初始化一个存放最大最小值的数组用于Loop2进行归一化处理,并将Loop1和Loop2合并,在完成当前帧数据归一化后再使用当前帧数据最大最小值更新数组,下一帧图像使用上一帧图像数据进行归一化处理,在实际测试中,可以每秒处理100帧以上数据,不会对效果产生影响。

图4 Min-Max归一化算法流水线改进方式

3.2.4 模块间数据同步

设计使用#pragma HLS PIPELINE II=1指令将模块内部流水线化,并指定启动时间间隔(II)为1,这样可以降低每个模块之间需要同步的FIFO大小。流水线的瓶颈位于设计中处理最慢的模块,对于改进Retinex算法来说是双边滤波模块,根据设计推导可知,需要同步的FIFO深度D≥[(S-1)/2]·W, 其中S为滤波器窗口大小,W为图像宽度。所以设计指定FIFO深度为1000以使得不同模块之间的数据得以同步处理。

4 实验结果与分析

本文算法仿真测试环境为基于OpenCV3.4.11的Vitis HLS 2020.2。基于HSV空间的MSR算法处理平台为基于OpenCV4.1的Visual Studio 2019,PC配置为主频3.6 GHz的AMD Ryzen R5-3600 CPU,以及16 GB双通道DDR4内存。算法实际验证平台为正点原子启明星ZYNQ7020开发板、OV5640摄像头和4.3寸800×480分辨率屏幕。

4.1 HLS与PC仿真结果对比

为了验证算法的效果以及可行性,选取了3组图片分别进行仿真对比,测试结果如图5所示。

图5 两种算法输出结果

主观上来看,基于HSV空间的MSR算法和本文算法输出图像相对于原图像均有不同程度细节提升、对比度增强。前者对于浓雾处细节增强要优于后者,但是图像部分噪声也被放大,出现了明显的色彩失真,本文算法处理后图像颜色偏差很小,饱和度适中,但是细节不够丰富。整体来说,本文算法处理图像相较于前者更符合人类视觉感知。从客观上,对两种算法输出的去雾图像进行了信息熵、峰值信噪比(PSNR)、结构相似性(SSIM)以及每帧处理耗时(T)这4个维度的评价。信息熵表示图像中每个灰度级像素的可能信息量,信息熵越大,图像的细节越完整、轮廓越清晰。PSNR可评价图像的重建质量,PSNR越小,表示图像越模糊。SSIM主要用于度量图像结构信息的保留程度,值越大,表明图像保留了越多的结构或深度信息。指标具体计算方法可见文献[16],原图像以及两种算法输出图像作为评价标准参数输入,其中每帧处理耗时(T)计算结果分别由Vitis HLS/Visual Studio工具输出,其余指标均在MATLAB中编写程序计算得出。表1与表2分别为两种算法输出图像清晰度指标数据。

表1 基于HSV空间的MSR算法输出图像数据

表2 本文算法输出图像数据

从表中数据分析可知,本文算法相对于前者算法输出3幅图像平均的信息熵和峰值信噪比数据有不同程度提高,而在结构相似性方面则有较大幅度提升,算法在ZYNQ上运行帧处理耗时相对于PC更是有高达17倍的加速。客观说明本文算法相较于前者算法图像更清晰,颜色保真度更高,实时性更好。与主观感受基本相符。

4.2 实际工程测试

在C验证完成后,对工程进行了C/RTL联合仿真,保证算法映射出的电路准确无误。综合报告指出在主频为100 MHz下需要403 363个Cycle完成一帧800×480大小的彩色图像处理,也就是约为4.03 ms处理完一帧图像。完全能够满足系统实时性的需求。算法综合后资源报告见表3。

表3 算法综合后资源使用数据

经过优化后的算法综合后完全满足ZYNQ SoC的资源要求,实际上整体工程经过布局布线后会进一步优化,SoC内部除了IO资源外其余各种资源利用率均不超过30%。在完成软硬件设计后,进行实际工程测试,系统测试架构如图6所示。

图6 去雾系统视频通路设计

系统将OV5640摄像头输入的有雾视频数据转换为AXI4-Stream协议方便在SoC内部高速传输,输入视频通过Retinex去雾IP核进行实时处理。VDMA IP核通过AXI-HP高性能接口将去雾后的数据送入ARM端并写入DDR3中缓存,VDMA同时根据LCD屏幕时序与数据速率读取DDR3中缓存数据并进行输出。另外ARM端使用AXI-GP通用接口对IP核以及外设进行配置,上位机可以通过AXI4-Lite协议对去雾IP核绝大部分参数进行实时配置以取得更好的去雾效果,实际测试结果如图7所示。

图7 实际去雾效果测试

通过配置OV5640摄像头寄存器输出800×480@45 fps格式视频,实际测试时输出去雾图像因室内测试光线影响出现部分失真,不会影响实际使用。切换场景时系统可以对输入视频进行实时去雾处理。算法上板测试与之前仿真结果基本一致,验证了嵌入式去雾系统的有效性与实时性。

5 结束语

本文首先分析了异构SoC相对于传统串/并行架构在进行图像处理的优劣势所在,并对MSRCR算法做出照度估计、色彩平衡、融合增强等多方位改进,克服了原算法的不足。同时根据ZYNQ SoC架构特点,对算法全流水线设计部署难点提出解决方案,大大提升了算法实时性。数据分析与实测结果表明:改进算法客观上显著提高了对比度和清晰度并有效恢复原始图像色彩,与主观感受与实际测试结果相符。另外本文构建的基于ZYNQ SoC的实时去雾系统,可以根据使用场景不同,灵活调整算法参数。系统在实时性、成本控制、去雾效果、灵活性等各方面完全满足了户外去雾系统的需求。

猜你喜欢

色彩图像算法
巧用图像中的点、线、面解题
有趣的图像诗
基于MapReduce的改进Eclat算法
Travellng thg World Full—time for Rree
进位加法的两种算法
神奇的色彩(上)
一种改进的整周模糊度去相关算法
春天的色彩
色彩当道 俘获夏日
2015春夏鞋履色彩大集结