APP下载

改进的图像去雾算法及其OpenCL实现

2019-05-05路锦正

小型微型计算机系统 2019年4期
关键词:透射率像素点双边

刘 明,路锦正,2

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

1 引 言

近年来,随着无人驾驶汽车等有关图像识别领域技术的快速发展,人们提出了越来越多的图像去雾方法.

目前的图像去雾算法主要分为两大类:图像增强算法和图像复原算法[1].Narasimhan[2]等人根据相同位置不同天气下的多幅图片来估计物理模型中的参数,该方法去雾效果好,但这些方法需要提供同一场景的多幅图像,不具有实用意义.Tan[3]等将去雾图像中景物颜色的对比度最大化,从而实现去雾,但是这种方法所得到图像颜色往往会过于饱和,去雾图像中景物的颜色会出现失真的现象.Fattal[4]等通过假设估计场景中的大气光值来恢复图像,但是这种方法需要大量的图像颜色信息,当雾气很大时算法会失效.HE等[5]提出了一种基于暗通道先验的去雾算法,去雾效果较好,但算法的时间复杂度较高,难以达到实时去雾的目的.文献[6]基于HE的方法提出了一种基于阈值分割的暗原色先验图像去雾方法,优化了天空区域的去雾效果,但仍旧没有考虑时间优化的问题.总之,后来者对算法进行的改进大多集中在算法的去雾效果上,对于实时去雾处理没有过多的研究.

OpenCL(Open Computing Language)作为一种开放的异构编程框架[7],相比于CUDA等平台,它提供了以一个解决方案,用于实现GPU通用计算程序的跨平台移植[8],而这正是本文选其作为开发平台的考量.四川大学的黄等[9]人实现了基于GPU的暗原色先验的去雾算法,其对于720P图像的处理时间大约是43ms;Lvy等[10]对600×400的图像实现了83ms的处理时间.Xue等[11]也实现了同样的算法,最终处理时间在36ms左右.上述文章虽然实现了去雾算法的并行化,但效果并不理想,尤其对于超清甚至更高分辨率的图像.对于去雾算法的并行化,仍然需要更多的研究.

本文在深入研究基于暗通道先验去雾算法原理基础上,对算法进行并行化优化,同时有效的利用高速内存,尽可能减少内核的数量,从而节省时间花销,最终实现了1280×720图像的实时去雾处理.

2 算法模型

HE的暗通道先验去雾算法基于雾天退化图像的物理模型,退化模型可表示为:

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

(1)

其中,x是像素点在图像中的位置,t(x)为透射率,A是大气光值,I(x)为输入图像,也就是待去雾的图像,J(x)为输出图像,亦是去雾后图像.所谓的先验是指它是建立在对大量的无雾图像统计的基础之上的.此先验是指:在绝大多数图像中的非天空区域里,总存在一些像素点至少一个的通道分量的值很低.通常,对于一幅图像的J(x),定义为:

(2)

这里Ω(x)是以x为中心的一个局部区域,Jdark(x)为x处的一个颜色通道内的值,且通过大量研究得出,如果J是无雾图像,在非天空域内,Jdark(x)的值是很小的,趋近于零.基于以上理论,可以得到基于暗通道先验去雾的算法流程如图1所示.

图1 算法流程图Fig.1 Algorithm flowchart

去雾算法步骤如下:

1)计算暗通道图.根据公式(2),以像素点x处为中心“开窗”,本文将“窗口”半径取值为7,对“窗口”内的像素点求其三个通道内的最小值,然后进行最小值滤波,将得到的最小值作为x处的暗通道值.

2)估计大气光值.大气光值的选取方式是,选择暗通道图中最大暗通道值的前0.1%,然后在这些点对应的原图中选择最亮点的颜色值作为大气光值,但这个算法不适合做并行计算.

3)预估透射率.由于在非天空区域有Jdark(x)≈0[12],可以推导出:

(3)

图像中一定程度的雾可以使人感受到景深的存在,因此有必要在去雾的时候保留一定浓度的雾,这可以通过在式(3)中加入一个因子ω来实现,则式(3)修正为:

(4)

4)透射率细化.HE在细化透射率上采用的是导向滤波算法,导向滤波具有较好的平滑效果,但在边缘信息保留效果上不如双边滤波.本文采用双边滤波对初始透射率图进行细化.双边滤波器(Bilateral Filter)是一种可以在去噪的同时又保留图像边缘信息的滤波器,其两个构成函数保证了这种滤波效果.一个函数通过几何空间距离确定滤波器系数,另一个函数则通过像素差值确定滤波器系数[13].双边滤波函数如公式(5)所示.

(5)

其中权重系数w(i,j,k,l)取决于d函数和r函数的乘积.

(6)

d函数是根据像素距离选择权重,距离越近权重越大.

(7)

r函数则是根据像素的差异来分配权值.正是r函数的作用,使得图像边缘,即相距较近但差异大的像素点的特性得以保留.

由上面的d函数和r函数的表达式就可以得到w(i,j,k,l)的表达式:

(8)

5)复原图像.将以上几步得到的数据代入公式(9)就可以得到图像中x点处的复原后颜色值.

(9)

(10)

3 算法实现

3.1 OpenCL

OpenCL的计算架构由4个模型构成,分别为平台模型(Platform Model),内存模型(Memory Model),执行模型(Execution Model)以及编程模型(Programming Model).在内存模型中,OpenCL根据线程访问权限的不同将内存分为4种:全局内存(Global Memory)、局部内存(Local Memory)、常量内存(Constant Memory)以及私有内存(Private Memory)[14].OpenCL内存模型如图2所示.

3.2 并行优化

1)求解暗通道图的并行实现.在对这一步进行算法的实现上,需要先对图像开个大小为15×15的“窗口”,接着求取“窗口”内所有像素点RGB三个值中的最小值,并将这个最小值作为“窗口”中心点的暗通道值.在这一步中,每个暗通道值的产生都需要进行(15×15×3-1)次比较.而位于图像边缘的像素点,以它为中心的“窗口”会超出图像范围,这里要先向边缘外围做图像的扩充.扩充的方式是,以图像边缘的颜色值向外延伸,这样整幅图像四周都将会向外延伸7个像素的大小.

图2 OpenCL内存模型Fig.2 OpenCL memory model

在将图像边缘填充完成后,就可以进行求暗通道值的计算.在算法的并行实现中,首先需要将数据从主机端传到GPU中显存内的全局寄存器,然后每个PE完成一个像素点的处理,处理所需的数据从全局寄存器读取.在进行数据读写时,如果将图像数据从全局寄存器拷贝到局部寄存器,之后从局部寄存器中读取数据,那么将大大减少数据的读写耗时.

2)求大气光值的并行实现.在求暗通道图的时候已经知道,暗通道值是R、G、B三个通道中的最小值.在非天空区域,如果存在白色的物体,大多数情况下,白色物体在图像中的面积较小.在对图像“开窗”过程中,位于白色区域边缘的窗口可能包含有白色物体,此时求得窗口中心的暗通道值可能会偏大.相比于纯粹地选取暗通道图中暗通道值最大的点作为大气光值选取点,本文提出加入一个惩罚项.具体如公式(11)所示.

(11)

P=min(R-D,G-D,B-D)

3)求透射率的并行实现.将上两步的计算结果带入式(3)即可求得每个像素点的透射率值,因为求透射率时每个像素点各不相关,所以这一步的并行度可以达到像素点数.GPU内核的频繁开关是影响算法运行速度的一个重要的因素,减少内核的数量有助于减少算法执行时间.由于暗通道去雾算法第二步的运算需要第一步的结果,而第三步的运算也需要第一步和第二步的结果,所以可以将前三步合在同一个内核中执行,将前两步的运算结果暂放到GPU显存中,避免了数据在CPU与GPU之间频繁的拷贝,这将大大提高算法运算速度.内核执行示意图如图3所示.

图3 前3步kernel执行示意图Fig.3 First three steps kernel execution diagram

4)透射率优化及最终去雾的并行实现.由于在这两步的算法的计算中每个像素也都不相关,所以并行度也都可以达到像素点数.对于双边滤波和复原图像kernel,在进行计算前也将数据由全局内存拷贝到局部内存降低对数据访问的时间开销.

4 实验结果与分析

4.1 算法效果对比

本节将对实验结果进行综合测评与分析,实验中采用的平台为:Intel core I7-7700K,NVIDIA GeForce GTX 950,软件编译环境为:Microsoft Windows 7(64位),Visual Studio 2012.

图4 大气光值选取点示意图Fig.4 Schematic diagram of selecting points for atmospheric light

如图4(a)所示,受到图像中白色车灯区域影响,传统的大气光值选取方法会误将车灯部分当做天空区域,导致的结果就是复原后的图像颜色失真.本文提出的改进的大气光值算法,由于加入了一个惩罚项,并不是完全依据暗通道值的大小.在非天空区域较小的明亮点,惩罚项的存在将会使其暗通值适当的减小,在求最值过程中将会避免选取到这些点,最终得到合理的大气光值.如图4(b)方框内所示,改进的算法选取的大气光值取值点在天空区域内,正确地避开了车灯等非天空区域较明亮物体的影响.

在细化透射率算法的选择方面,本文选择双边滤波对透射率细化.为了证明双边滤波是比导向滤波更好的选择,本文对两种算法进行了对比,实验结果如图5所示.

图5 两种滤波效果对比图Fig.5 Comparison of two filtering effects

图5中(a)是未经处理的原图,其尺寸为256×256,图5(b)是经导向滤波过处理后的图像,图5(c)是双边滤波处理后的图片.本文采用峰值信噪比(PSNR)和结构相似度(structural similarity index,SSIM)对两种细化透射率方法做评价,同时还加入基于GPU平台的算法耗时的比对.表1展示了评价指标的对比结果.

从实验结果可以看出,双边滤波算法具有更大的PSNR,这表明双边滤波具有更好的去噪效果.在SSIM指标上,双边滤波表现的也比导向滤波好, 这说明双边滤波能在去噪的同时又保持图像结构不做大的改动.

表1 透射率细化结果对比Table 1 Transmission thinning comparison

与此同时,在相同的GPU平台上实现的两种算法,双边滤波的算法耗时也比导向滤波短.说明双边滤波的平滑效果在和导向滤波效果相似的前提下,其并行效果更优,由此可以得出本文选择双边滤波做透射率的细化是合理且更优的选择.图6展示了原图、HE算法、文献[6]算法和本文算法去雾后的结果.

4.1.1 主观评价

如图6所示,图6(a)为未进行去雾处理的原图,其图像尺寸为600×400,图6(b)为HE算法的去雾图,图6(c)为文献[6]算法的去雾图,图6(d)为本文算法的去雾图.从图6中可以看出,HE算法得到的复原图像在天空区域有失真现象,图像边缘信息有所丢失,例如,图6(b)中上图中的很多草都被过度的模糊化了,且图像整体亮度较低.图6(c)文献[6]算法的算法复原的图像,颜色较鲜艳,但过于饱和,图像有些不够真实.而且由于其用的是分割天空区域的方法,对图像上部不做处理,所以存在去雾不完整的现象,这点可以从图6南瓜图中看出,图像上部的雾几乎被完全保留了下来.图6(d)中本文算法复原的图像在色彩上表现的更加自然,去雾效果与HE算法较为相似.但与HE复原的图像相比,本文算法复原后的图像展现了更多的细节信息,图6(b)中被模糊了的草在图6(d)中保留的较好.同时相比于文献[6]算法,本文算法亮度更高,而且做到了对整幅图像的处理.

图6 不同算法的去雾效果图Fig.6 Defogging effect of different algorithms

4.1.2 客观评价

本文使用平均梯度和结构相似度(SSIM)作为图像质量的评价指标.

所谓平均梯度即是通过图像边缘两侧邻近灰度的变化率来反映图像清晰度.一般而言,平均梯度越大,图像层次越多,所含信息越丰富,图像越清晰.其表达式为:

(12)

其中,M,N表示图像的尺寸,Δxf(i,j),Δyf(i,f)分别表示点(i,j)在x方向于y方向的一阶微分.

对于信息熵,它是从信息论的角度反映图像的丰富程度.一幅具有N级灰度的图像,其整幅图像的熵可以表示为:

(13)

其中pi为图像中第i级灰度出现的概率,e(i)即为该级灰度的熵.通常情况下,E越大,图像的信息量越丰富,图像的直方图分布越均匀.

在图像质量评价的常用指标中,SSIM被用来描述两幅图片的结构相似度,其值越大表示去雾后的图像保留有用信息越多,处理过后的图片的结构的完整性更好,与原图的结构相似性越高.表2列出了不同算法与本文算法处理后图像的平均梯度值与结构相似度值.

表2 算法评价指标比较Table 2 Comparison of algorithm evaluation indexes

从实验结果可以看出,文献[6]算法在处理南瓜图时具有最大的平均梯度,但在处理远处楼房时,本文算法的平均梯度最大.而在SSIM方面,无论是复原南瓜图还是楼房图,本文算法都具有最好的表现.这表明,本文算法处理过后的图像包含的信息更加丰富,同时对图像细节信息的保留上表现的也更优.综合主观和客观评价两个方面,可以得出相比于HE算法和文献[6]算法,本文算法具有更优的去雾效果.

4.2 加速效果对比

实验采用分辨率为1280×720的图片,基于本文提出的算法,测得的实验数据如表3所示.记录了去雾步骤中求取暗通道图、计算大气光值、预估透射率、细化透射率和复原图像五个步骤以及总处理过程所耗时间,在表3中依次用步骤1至步骤5和总耗时表示,实验统一在CPU和GPU平台上实现.

表3 算法耗时对比Table 3 Algorithm time-consuming comparison

从以上的数据可以看出在CPU平台上想要获取理想的去雾图像,时间耗时过长,算法的实时性较差.而对于相同算法采用GPU平台优化后,算法时间被有效的缩短,对一幅1280×720图像的整体耗时从5945毫秒缩减到19.62毫秒,达到了每秒49帧,完全满足实时性的要求.从图中可以得出,复原步骤的加速比最高,达到了376倍.最低的是计算大气光值,也有242倍的加速比.总的算法加速比也来到了303倍,时间提升效果很显著.

表4 不同算法耗时对比Table 4 Time comparison of different algorithms

表4展示了本文算法与文献[9]的算法在相同GPU平台下去雾处理耗时上的对比结果.从对比结果来看,相比于文献[9]的算法,本文算法在处理相同尺寸图像上所消耗的时间更少,说明本文算法相比于文献[9]具有更加优异的并行加速效果.

表5 不同尺寸图像下的总去雾过程加速比Table 5 Acceleration ratio of total dehazing process under different size images单位(ms)

表5展示了不同尺寸图像的加速比.从表5可以看出,随着图像分辨率的提升,算法的加速比在不断提高.本文算法对于1280×720分辨率的图像完全可以做到720P图像的实时去雾处理,而对于1080P的图像也接近实时处理,具有较强的实用价值.

5 结束语

暗通道先验去雾算法是目前去雾效果较好的一种图像复原方法.随着人工智能、深度学习等领域的快速发展,GPU加速技术也越来越受到重视.基于OpenCL的去雾技术极大的提高了算法的运行速度,使去雾技术变得更加实用.本文基于暗通道先验去雾算法,提出了适用于并行加速的新的大气光值计算算法,该算法能有效的避免图像中白色物体的影响.经过加速的算法既能有效的去雾,又实现了1280×720图像的实时处理.对于未来的改进,建议放在充分利用硬件资源和改善算法上.另外,减少kernel的数量,利用GPU中的高速内存也是需要重视的方面.

猜你喜欢

透射率像素点双边
噪声对相干衍射成像重构物体图像的影响
图像二值化处理硬件加速引擎的设计
隧道内超短边多公共转点双边角交会测量技术探讨
基于局部相似性的特征匹配筛选算法
双边投资协定与外商直接投资
基于像素点筛选的舰船湍流尾迹检测算法
与2018年全国卷l理数21题相关的双边不等式
基于canvas的前端数据加密
图像去雾中的大气光强度自适应恢复算法研究
基于不确定性严格得分下双边匹配决策方法