课题_Single Image Haze Removal Using Dark Channel Pr

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第1页SingleImageHazeRemovalUsingDarkChannelPrior在图像去雾这个领域,几乎没有人不知道《SingleImageHazeRemovalUsingDarkChannelPrior》这篇文章,该文是2009年CVPR最佳论文。作者何凯明博士,2007年清华大学毕业,2011年香港中文大学博士毕业,可谓是功力深厚,感叹于国内一些所谓博士的水平,何这样的博士才可以真正叫做Doctor。关于何博士的一些资料和论文,大家可以访问这里:最开始接触何的这篇论文是在2011年,说实在的那个时候,只是随便浏览了下,看到里面的softmatting过程比较复杂,并且执行速度非常慢,就没有什么大的兴趣。最近又偶尔拾起,仔细研读,觉得论文的推理步骤特别清晰,讲解很到位。恰好适逢浏览到其另外一篇文章《GuidedImageFiltering》,其中提到了可以用导向滤波来代替softmatting的过程,且速度很快,因此,我对去雾的兴趣算法又大大提高了。本文主要上是对《SingleImageHazeRemovalUsingDarkChannelPrior》的翻译、整理、及部分解释。如果您的英文水平好,建议看原文可能来的更爽些。一、论文思想的简单描述首先看看暗通道先验是什么:在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道具有很低的值。换言之,该区域光强度的最小值是个很小的数。我们给暗通道一个数学定义,对于任意的输入图像J,其暗通道可以用下式表达:式中Jc表示彩色图像的每个通道,Ω(x)表示以像素X为中心的一个窗口。式(5)的意义用代码表达也很简单,首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定,一般有WindowSize=2*Radius+1;暗通道先验的理论指出:实际生活中造成暗原色中低通道值主要有三个因素:a)汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;b)色彩鲜艳的物体或表面,在RGB的三个通道中有些通道的值很低(比如绿色的草地/树/植物,红色或黄色的花朵/叶子,或者蓝色的水面);c)颜色较暗的物体或者表面,例如灰暗色的树干和石头。总之,自然景物中到处都是阴影或者彩色,这些景物的图像的暗原色总是很灰暗的。我们抛开论文中列举的那些例子,自己从网上找几幅没有雾的风景照,看看结果如下:第2页第3页第4页一些无雾的图片其暗通道在看看一些有雾的图的暗通道:第5页第6页一些有雾的图片其暗通道上述暗通道图像均使用的窗口大小为15*15,即最小值滤波的半径为7像素。由上述几幅图像,可以明显的看到暗通道先验理论的普遍性。在作者的论文中,统计了5000多副图像的特征,也都基本符合这个先验,因此,我们可以认为其实一条定理。有了这个先验,接着就需要进行一些数学方面的推导来最终解决问题。首先,在计算机视觉和计算机图形中,下述方程所描述的雾图形成模型被广泛使用:其中,I(X)就是我们现在已经有的图像(待去雾的图像),J(x)是我们要恢复的无雾的图像,A是全球大气光成分,t(x)为透射率。现在的已知条件就是I(X),要求目标值J(x),显然,这是个有无数解的方程,因此,就需要一些先验了。将式(1)稍作处理,变形为下式:如上所述,上标C表示R/G/B三个通道的意思。首先假设在每一个窗口内透射率t(x)为常数,定义他为,并且A值已经给定,然后对式(7)两边求两次最小值运算,得到下式:上式中,J是待求的无雾的图像,根据前述的暗原色先验理论有:第7页因此,可推导出:把式(10)带入式(8)中,得到:这就是透射率的预估值。在现实生活中,即使是晴天白云,空气中也存在着一些颗粒,因此,看远处的物体还是能感觉到雾的影响,另外,雾的存在让人类感到景深的存在,因此,有必要在去雾的时候保留一定程度的雾,这可以通过在式(11)中引入一个在[0,1]之间的因子,则式(11)修正为:本文中所有的测试结果依赖于:ω=0.95。上述推论中都是假设全球达气光A值时已知的,在实际中,我们可以借助于暗通道图来从有雾图像中获取该值。具体步骤如下:1)从暗通道图中按照亮度的大小取前0.1%的像素。2)在这些位置中,在原始有雾图像I中寻找对应的具有最高亮度的点的值,作为A值。到这一步,我们就可以进行无雾图像的恢复了。由式(1)可知:J=(I-A)/t+A现在I,A,t都已经求得了,因此,完全可以进行J的计算。当投射图t的值很小时,会导致J的值偏大,从而使淂图像整体向白场过度,因此一般可设置一阈值T0,当t值小于T0时,令t=T0,本文中所有效果图均以T0=0.1为标准计算。因此,最终的恢复公式如下:当直接用上述理论进行恢复时,去雾的效果其实也是很明显的,比如下面一些例子:第8页第9页有雾图去雾图注意到第一幅图的原图两个字的周围明显有一块不协调的地方,而第二图顶部水平方向似乎有一块没有进行去雾处理,这些都是由于我们的透射率图过于粗糙了。要获得更为精细的透射率图,何博士在文章中提出了了softmatting方法,能得到非常细腻的结果。但是他的一个致命的弱点就是速度特慢,不使用于实际使用。在2011年,何博士又除了一片论文,其中提到了导向滤波的方式来获得较好的透射率图。该方法的主要过程集中于简单的方框模糊,而方框模糊有多重和半径无关的快速算法。因此,算法的实用性特强,关于这个导向滤波算法大家在何博士的网站可以自己去研习下,除了在去雾方面外,还有着其他多方面的应用,这部分本文不多述。使用了导向滤波后的去雾效果:第10页第11页使用原始的预估透射率图使用导向滤波后的透射率图第12页(a)原图(b)去雾结果图第13页(c)暗通道图(d)导向图(原始图像的灰度图)第14页(e)预估透射率图(f)使用导向滤波后的透射率图二、各参数对去雾结果的影响第一:窗口的大小。这个对结果来说是个关键的参数,窗口越大,其包含暗通道的概率越大,暗通道也就越黑。我们不去从理论角度分析,从实践的效果来看,似乎窗口越大,去雾的效果越不明显,如下图所示:第15页(a)原始图像(b)窗口大小=11第16页(c)窗口大小=21(d)窗口大小=101我的建议是窗口大小在11-51之间,即半径在5-25之间。式(12)中的ω具有着明显的意义,其值越小,去雾效果越不明显,举例如下:第17页(a)原始图像(b)ω=0.5(c)ω=0.8(d)ω=1三:编码的步骤如果你仔细的分析了原文的细路,加上适当的参考,编码其实并不是很困难。1)根据原始图像求暗通道,参考代码如下:第18页for(Y=0,DarkPt=DarkChannel;YHeight;Y++){ImgPt=Scan0+Y*Stride;for(X=0;XWidth;X++){Min=*ImgPt;if(Min*(ImgPt+1))Min=*(ImgPt+1);if(Min*(ImgPt+2))Min=*(ImgPt+2);*DarkPt=Min;ImgPt+=3;DarkPt++;}}MinFilter(DarkChannel,Width,Height,Radius);这里需要注意的是MinFilter算法的快速实现,提供一篇论文供有需要的朋友学习:STREAMINGMAXIMUM-MINIMUMFILTERUSINGNOMORETHANTHREECOMPARISONSPERELEMENT。这个算法的时间复杂度是O(1)的。2)按文中所描述的算法自动获得全球大气光的值。这里说明一点,原始论文中的A最终是取原始像素中的某一个点的像素,我实际上是取的符合条件的所有点的平均值作为A的值,我这样做是因为,如果是取一个点,则各通道的A值很有可能全部很接近255,这样的话会造成处理后的图像偏色和出现大量色斑。原文作者说这个算法对天空部分不需特备处理,我实际发现该算法对有天空的图像的效果一般都不好。天空会出现明显的过渡区域。作为解决方案,我增加了一个参数,最大全球大气光值,当计算的值大于该值时,则就取该值。原图未对A值做限定最大第19页A值限定为2203)按式(12)计算预估的透射率图。在式(12)中,每个通道的数据都需要除以对应的A值,即归一化,这样做,还存在一个问题,由于A的选取过程,并不能保证每个像素分量值除以A值后都小于1,从而导致t的值可能小于0,而这是不容许的,原文作者并没有交代这一点是如何处理的。我在实际的编码中发现,如果真的这样做了,其效果也并不是很理想,因此,我最后的办法是在式(12)中,不考虑A的计算。4)计算导向滤波图。这里可以直接用原始的图像做导向图,当然也可以用其灰度图,但是用RGB导向图在下一步的计算中会占用比较大的时间。5)按照《GuidedImageFiltering》论文中的公式(5)、(6)、(8)编码计算获得精细的透射率图。网络上有这个算法的matlab代码可下载的,这里贴部分代码:functionq=guidedfilter(I,p,r,eps)%GUIDEDFILTERO(1)timeimplementationofguidedfilter.%%-guidanceimage:I(shouldbeagray-scale/singlechannelimage)%-filteringinputimage:p(shouldbeagray-scale/singlechannelimage)%-localwindowradius:r%-regularizationparameter:eps[hei,wid]=size(I);N=boxfilter(ones(hei,wid),r);%thesizeofeachlocalpatch;N=(2r+1)^2exceptforboundarypixels.%imwrite(uint8(N),'N.jpg');%figure,imshow(N,[]),title('N');mean_I=boxfilter(I,r)./N;mean_p=boxfilter(p,r)./N;mean_Ip=boxfilter(I.*p,r)./N;cov_Ip=mean_Ip-mean_I.*mean_p;%thisisthecovarianceof(I,p)ineachlocalpatch.mean_II=boxfilter(I.*I,r)./N;var_I=mean_II-mean_I.*mean_I;a=cov_Ip./(var_I+eps);%Eqn.(5)inthepaper;b=mean_p-a.*mean_I;%Eqn.(6)inthepaper;mean_a=boxfilter(a,r)./N;mean_b=boxfilter(b,r)./N;q=mean_a.*I+mean_b;%Eqn.(8)inthepaper;end由上面的代码,可见,主要的工作量在均值模糊上,而均值模糊是个很快速的算法,关于均值模糊的优化可参考我以前的文章:彩色图像高速模糊之懒惰算法。第20页还有一点就是,上述计算需要在[0,1]范围内进行,也就是说导向图和预估的透射率图都必须从[0,255]先映射到[0,1]在进行计算。关于guidedfilter中的半径r值,因为在前面进行最小值后暗通道的图像成一块一块的,为了使透射率图更加精细,建议这个r的取值不小于进行最小值滤波的半径的4倍,如下图所示:(a)r=最小值滤波半径的2倍(b)r=最小值滤波半径的8倍可以看到,当r比较小的时候,在透射率图中基本看不到什么细节信息,因此恢复处的图像边缘处不明显。参数eps的取值也有所讲究,他主要是为了防止计算中除以0的错误以及为了使得某些计算结果不至于过大,一般建议取值0.001或者更小。如果使用的彩色RGB图做导向图,计算时间上会增加不少,所的到的透射率图的边缘会比灰度图所处理的保留了更多的细节,效果上略微比

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功