基于C674x-DSP的视频图像实时透雾优化

2019-12-20 08:36路锦正
自动化仪表 2019年12期
关键词:透射率指令滤波

路锦正,董 川

(1.西南科技大学信息工程学院,四川 绵阳 621010;2.特殊环境机器人技术四川省重点实验室,四川 绵阳 621010)

0 引言

室外场景由于受到雾、霾、烟等因素的影响,其成像结果通常是模糊的。已退化图像的对比度低、颜色暗淡,缺失的关键信息给图像直观体验、目标检测与跟踪、目标识别等造成重大影响。视频监控、计算机视觉等领域对图像去雾或透雾技术有着迫切需求。透雾能够提高雾天图像利用价值、改善图像观感体验。透雾可以显著改善场景可懂度、纠正颜色偏差,为机器视觉提供精确的目标信息,从而提高特征提取、滤波或成分分析等算法性能[1]。

图像透雾有诸多方法,主要包括图像增强法、图像融合法和图像复原法[2]。前两种技术的效果有限或者图像实时处理难度高。近年来,透雾方法大多集中在基于单幅雾天图像的复原透雾领域。此类方法通常需要场景的景深信息或者一些关于降质图像的先验假设作为约束条件,从而将大气成像模型求解由不适定性转换为适定性。Fattal[3]从光学成像本质上实现了透雾处理,通过估算景物的反射率来推断反射光线在空气中传播时的透射率;后来,其又提出了基于color-lines的高阶马尔可夫随机场透雾算法,对暗通道的透射率图利用高阶马尔可夫随机场优化传输图,恢复了更多的图像细节,对天空等大片白色区域具有很好的适应性。但是以高阶能量项来约束全局先验,算法较耗时。He等提出了暗原色先验单幅图像透雾,是目前透雾效果较好的算法之一[4-5]。后续文献的许多方法是对该方法的持续改进。暗通道先验算法采用软抠图法进一步对透射率图修复,其中的大规模稀疏矩阵运算,给透雾算法带来了巨大的运算量、耗用了大量内存,使得算法具有较高的空时复杂度。研究人员又提出采用最小值滤波和导向滤波相结合、双边滤波等算法代替软抠图法修复透射率图。虽然以上改进算法的复杂度都较原算法有所减小,但在处理数据量巨大的视频序列图像时仍难以满足实时处理的要求[6]。

视频图像处理的嵌入式实施,以其易升级、掌握知识产权、抗恶劣环境等优势,受到了工业界的普遍关注[7-9]。基于数字信号处理器(digital signal processor,DSP)的透雾方案更是被广泛采纳。Khodary[10]研究了德州仪器(Texas Instrument,TI)公司达芬奇DM6446下的视频透雾,实现了3帧/s的处理结果,后续经深入优化实现了8帧/s的透雾速度。Liu[11]基于DM6467T实现了25帧/s的标清分辨率透雾处理,但是透雾效果还有待改善,且该平台功耗大、体积大。

本文结合暗原色先验原型算法,提出了一种改进的、适用于图像序列的快速透雾技术,在保证不显著影响图像质量的前提下,大幅降低算法运算量。选择TI公司面向低功耗的C6748 DSP嵌入式平台,算法与平台协同优化,采用系统级和模块级的两级优化策略,实现了纯DSP平台下视频图形阵列(video graphics array,VGA)分辨率,即640×480像素大小的视频图像实时透雾处理。

1 研究背景

1.1 暗通道先验算法

基于McCartney[12]在1977年提出的大气光模型及其衰减模型,研究人员设计了在大气散射理论下被广泛采用的雾天成像模型:

I(x)=J(x)t(x)+A[1-t(x)]

(1)

式中:I为摄像头采集到的含雾图像;J为理想条件下的清晰无雾图像;t(x)为透射率图,表示场景中光线穿透雾的大小;A为大气光成分,表征周围环境光强弱;J(x)t(x)为直接衰减项,反映了场景反射的光线经过衰减后的能量;A[1-t(x)]为环境光与雾相互作用产生的大气光能量成分,可用来表征场景颜色的偏差。

分析式(1)可知,由于t(x)和A均未知,则从I复原J的方程问题是不确定的,即图像复原解不唯一。所以,期望求解得到一个“唯一解”的清晰图像,就需要对该方程添加约束条件。研究人员经统计大量清晰和有雾图像,得出了暗原色先验规律,即对t(x)的三通道最小值和非天空下大气光值先验作为约束条件求解J(x),通过该逆问题计算得到无雾图像。上述正则化过程可表示为:

(2)

式中:JC为清晰无雾图像J的某一颜色通道;Ω(x)为以x像素点为中心的窗口;Jdark为J的暗通道,对于非天空部分,Jdark的值趋近于0。

1.2 C674x-DSP平台

基于C674x-DSP开展图像视频应用时,算法DSP优化是重点。为最大限度提高算法执行效率、降低CPU指令消耗:一方面,算法自身运算量应适中,即过于复杂的模块需要被优化或替换;另一方面,应充分发挥CPU的并行优势,即一个指令周期执行尽可能多的指令,如定点8条、浮点6条指令并行运行。算法与平台的联合优化可望达到DSP算法的实时运行。

根据DSP架构特点,DSP算法优化可从系统级优化和模块级优化两个方面来实施。系统级优化包括直接内存访问(direct memory access,DMA)的双缓冲,即片上内存与片外内存的数据乒乓搬移,以及在核心代码中添加编译指示指令。模块级优化指算法核心函数的内联指令优化、线性汇编优化。系统级优化的目的是使CPU在片上空间读写数据或读取程序,以提高其访问速度。模块级优化的目的是使函数能够软件流水、实现单指令多数据(single instruction multiple data,SIMD)处理或单指令周期并行更多指令,以提高CPU指令周期的利用率。无论哪一级优化,均可通过集成开发环境(code composer studio,CCS)的-O2、-O3选项,开启编译器的优化功能。

2 C674x-DSP实时透雾技术

2.1 暗通道图像透雾改进算法

(3)

(4)

2.1.1 均值滤

过于复杂的软抠图无法在DSP上实时处理。本研究经过多次的试验与分析,采取了计算量低而效果没有显著降低的均值滤波替代软抠图滤波。以模板HR,r=2n+1(n≥0)为掩膜,对图像矩阵自左向右、自上向下,逐点累积与加权。其中,窗口尺寸r越大,平滑作用越强;反之越弱。考虑到除法对DSP优化有一定限制,r的取值需合理设置。

(5)

2.1.2 优化大气光值

大气光值A∈(0,255)为常量。已有试验表明,它的不同取值对图像整体亮暗有显著影响。从当前待透雾图像直接估计得到合适的A值,显然是较为合理的。但是,相邻帧A的抖动会带来对应透雾后图像的亮度突变。为此,本文采取窗口内加权方法:

(6)

式中:A0由当前帧图像计算获得;A1~A3由前三帧图像计算获得。

上述四个值加权得到参与透雾处理的大气光值A。当前帧透雾完毕后,依次更新A1~A3,为后续图像透雾作准备。大气光值加权取偶次降幂目的是:一方面便于DSP移位操作;另一方面体现了其他图像帧越靠近当前帧,其大气光值权重越大的特点。

2.2 DSP优化技术与实现

2.2.1 单指令多数据

图像处理算法中,纯粹的内存读写操作,浪费了宝贵的CPU资源。在线性汇编优化中,单次读写多像素点可显著提高CPU指令执行效率,如四字节读写LDW/STW、八字节读写LDDW/STDW指令。类似地,C语言环境下的内联指令_amem4、_amem8实现读写操作。在算法的开始部分,通常执行读取数据源;在算法的结束部分,通常执行存储结果。算法中间即为处理核心,包括数据的解包(_unpklu4、_unpkhu4、_pack2)与组包(_packl4、_packh4)、饱和式组包(_spacku4、_spack2)、乘法运算(_mpysu4、_mpyu4、_dotp2)、求最大最小(_minu4、_maxu4)、加减运算(_add4、_sub2、_sub4)、移位与抽取(_shru2、_extu)等。上述指令的共性即单个指令操作了多个像素的相同运算。

2.2.2 软件流水

通常,图像算法中存在大量的循环处理,并且是消耗CPU指令的主要部分。要提高算法系统的执行速度,就必须提高CPU指令的并行性,即充分发掘循环体之间的指令级并行(instruction level parallelism,ILP)。软件流水技术通过对循环重新建构,使得每次迭代执行的指令是属于原循环不同迭代过程;通过编排循环指令,使循环体多次迭代并行执行。该技术主要应用于具有多个功能部件的并行处理器,如TI的C6000系列DSP。此类CPU配有八个功能单元,每个功能单元执行不同指令,因此可最多并行八条指令。通过编译生成并行汇编文件(*.asm),根据其中的反馈信息综合判断编写的线性汇编或者内联指令的优化效果。其中包含软件流水成功建立的提示信息“PIPED LOOP KERNEL”。

2.2.3 浮点除法运算优化

①计算透射率:tRow_t = a_haze - ((w_m×jdarkRow[x])>>8)。

②钳位透射率:if (tRow_t < t_o×a_haze) tRow_t = t_o×a_haze。

③计算中间值:aljz = a_haze/tRow_t。

④透雾的图像:tem_b = aljz×(srcB[x]-a_haze) +a_haze。

上述过程中,影响系统性能的关键是浮点变量tRow_t的除法运算。除法的函数调用方法使遍历所有像素点的循环体无法构建软件流水。通过分析C674x的指令体系可知,借鉴倒数运算可将除法转化为乘法,即aljz=a_haze×_rcpsp((float)tRow_t)。其中,内联指令_rcpsp用于计算浮点数tRow_t的倒数。该方法避免了函数调用,使软件流水成为可能。另外,优化上述过程的操作还包括乘法_mpyu4ll、右移_shru2、钳位_max2、减法_sub4、组包_spack2和_spacku4等指令。

2.2.4 均值滤波的快速优化实现

基于暗原色先验图像透雾算法中的软抠图或导向滤波均含有矩阵复杂运算,这对于嵌入式DSP来说难以实现实时处理。根据多次试验验证,采用具有模板快速实现的均值滤波来替换软抠图或导向滤波。其增强结果是可以接受的,透雾能力没有显著降低。从具体实现来说,模板HR,r=2n+1,n≥0与粗透射率图卷积得到精细透射率图。TI的图像库(image library,IMGLIB)提供了卷积优化模块IMG_conv_7x7_i8_c8s,即n=3、r2=49。但该模块在存储最后结果前的操作为移位运算。所以本文设计了如式(7)的卷积模板,即移位大小shift为6。另外,在滤波前将粗透射率图的四个图像边扩展n个像素点,以保证边缘数据的正常处理。

(7)

3 试验结果与分析

以上介绍了基于C674x-DSP的实时透雾优化技术与实现,接下来针对上述的各种优化方法,在不同场景图像下开展透雾试验、性能评估与原因分析。

3.1 平台参数

本文在TI的C6748 LCDK(L138/C6748 Develop Kit)开发平台上验证优化技术有效性。透雾因子w为0.85,平滑滤波模板见式(7),透射率最小值t_o为0.2。DSP的CPU主频456 MHz,二级缓存L2空间都设置为普通内存模式。

3.2 优化对比

为了评估优化前后的CPU占用情况,使用仿真器SEED-XDS560v2PLUS,剖析算法模块的优化结果。在每个主要模块的执行前后分别读取系统时间,其时间差值即为消耗的CPU指令周期数量。用简写字母表示模块名称,Color表示颜色空间变换,Min表示计算RGB的最小通道,Filter表示平滑滤波,A_c表示计算大气光值,Dehaze表示最后的透雾计算。表1给出了算法主要模块优化前后CPU资源占用情况。

表1 算法主要模块优化前后CPU资源占用情况

表1中的优化前(Before)表示没有启用CCS编译器的-O3资源占用,优化后(After)表示开启了该功能的资源占用,优化倍率(Ratio)表示两者的CPU时钟周期占用倍率。实际上,上述主要模块均使用了内联指令进行优化。若函数模块没有使用任何优化方法,优化前的指令消耗会更多。从表1可知,算法经过优化后,CPU占用平均降低了98%,单帧图像透雾消耗CPU约6M指令周期,估算后可完全达到实时(25帧/s)视频序列透雾。

3.3 滤波和透雾效果对比

暗通道数据的滤波性能决定了透射率图精细程度,从而影响了最终的透雾效果。接下来,对不同程度的含雾图像分别进行滤波和透雾试验,以展示、分析本文算法的优化结果。

3.3.1 两种滤波效果

为提高算法系统的处理速度,以达到实时透雾目的,本文对最耗时模块——透射率图优化作了研究。在不显著降低系统效果前提下,将透射率图的导向滤波精细化替换为均值滤波算法。图1展示了针对浓雾和淡雾图像透射率图的导向滤波与均值滤波的处理结果对比。其中:左列为原始的透射率图即暗通道信息,中列为透射率图的导向滤波,右列为透射率图的均值滤波。

分析图1可知,导向滤波在滤除细小纹理的同时,较好地保持了几何结构的边缘。这是均值滤波所不能达到的。特别是图1(e)边缘比图1(f)的边缘保留得相对较好。但是,导向滤波会对局部的白色区域作平滑处理。这是由于其取局部均值操作所带来的限制。根据含雾不同程度的图像滤波结果:浓雾图像透射率图的两种滤波结果差别较小,如图1(b)、图1(c)的滤波效果相近;而淡雾图像透射率图的两种滤波结果差别较大,如图1(e)、图1(f)的滤波差异对比较明显。

3.3.2 图像透雾结果对比

利用上文均值滤波优化后的精细透射率图,以及窗口加权优化后的大气光值,根据透雾模型计算透雾图像。

图2、图3分别展示了浓雾图像和淡雾图像用文献[5]算法和本文算法的透雾结果。两图中的左列为有雾图像,中列为文献[5]透雾结果,右列为本文透雾结果。

为便于对比区分细节差别,对用矩形框标注的相应区域作了局部放大,以分析观察不同方法的细节透雾能力。

图1 浓雾和淡雾图像透射率图的两种滤波效果对比图

图2 浓雾图像的透雾结果对比图

图3 淡雾图像的透雾结果对比图

由图2可知,对于浓雾的透雾来说,图2(b)与图2(c)的差别很小。由图3可知,对于淡雾的透雾而言,图3(b)与图3(c)的差别较大。这种浓雾与淡雾的透雾效果差别,也印证了由图1分析得出的滤波分析结论。本文的图2(c)透雾相比文献[5]方法的图2(b)透雾结果并不逊色。尤其是局部区域的放大显示中,图2(b)与图2(c)的凉亭顶部,比较来看差别都很小。对于淡雾图像的透雾能力而言,本文的透雾结果图像如图3(c),图像整体偏暗,对比度稍偏过;而图3(b)整体更自然些,对比度适中。

4 结束语

本文在分析暗通道先验算法图像透雾原理基础上,结合DSP的CPU架构特点和指令类型,实现了基于C674x-DSP的视频图像实时透雾。本文由均值滤波代替透雾算法中运算复杂的导向滤波模块。优化过程中,采用DMA双缓冲技术提高CPU的数据读写速度。使用SIMD操作提高CPU处理数据效率,充分使用核心循环模块的软件流水,极大地节约了CPU指令资源。浮点运算使用倒数计算指令替换除法函数调用,以保证软件流水。均值滤波的2次幂移位提高透射率图滤波速度。试验结果证实,在C6748纯DSP平台上实现了VGA分辨率图像25帧/s的实时透雾处理。未来将研究在保证处理速度基础上改善滤波效果,以提高非浓雾图像的透雾能力。

猜你喜欢
透射率指令滤波
噪声对相干衍射成像重构物体图像的影响
《单一形状固定循环指令G90车外圆仿真》教案设计
基于EKF滤波的UWB无人机室内定位研究
图像去雾中的大气光强度自适应恢复算法研究
电流变液光学性能的研究
一种GMPHD滤波改进算法及仿真研究
基于自适应Kalman滤波的改进PSO算法
RTS平滑滤波在事后姿态确定中的应用
中断与跳转操作对指令串的影响
一种基于滑窗的余度指令判别算法