避免图像去雾算法中让天空部分出现过增强的一种简易方法。

  在经典的几种去雾算法中,包括何凯明的暗通道去雾、Tarel的基于中值滤波的去雾以及一些基于其他边缘保留的方法中,都有一个普遍存在的问题:即对天空部分处理的不好,天空往往会出现较大的面积的纹理及分块现象。究其主要原因,还是因为天空部位基本上是不符合暗通道去雾先验这个前决条件的。目前,针对这一问题,我搜索到的主要有以下几篇文章进行了处理:

  1、 改进的基于暗原色先验的图像去雾算法 作者: 蒋建国\侯天峰\齐美彬   合肥工业大学 2011

2、Single image dehazing Algorithms based on sky region segmentation, 2013  王广义  哈尔滨工业大学(这篇文章似乎要到学校里才能下载);

第一篇文章增加了一个可控参数K, 用来调节每个像素处的透射率:

当|I(x)-A|<k时,认为这个区域可能是天空,重新计算透射率(增加透射率),|I(x)-A|>k处,则认为是符合暗通道先验的区域,透射率不变。

如果K取值为0,则相当于原始的透射率公式。

上面的做法是较为合理的,因为一般情况下大气光A的取值和天空部分应该是非常接近的,而那些符合暗通道的地方则远离天空,关于这个算法的效果,我在我的《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)一文的实例工程中已经提供了测试程序。

第二篇文章的思路则是进行天空分割。对分割后的两部分透射率做不同的处理,那么这个的重点就在于天空特征的提取。作者原文是通过以下几个步骤来实现的。

  对这几个步骤我进行了粗陋的点评吧。

第一步我认为最有价值,直接在原始数据判断天空不是很好做,作者观察到天空部分整体来说是比较平滑的,也就是相邻像素之间变化不大,因此用梯度来表示则更容易识别,梯度值越小则表明图像那一块越光滑。

第二步则设定一个阈值来初步判断某处是否属于天空,这个阈值作者取的是0.02,量化到unsigned char范围则基本对应5。

第三步对初步的边界进行下小范围的扩展。

第四步对分割后的图的每个联通区域统计其原始图像在对应位置的像素的平均亮度,如果大于阈值T则保留,T这里作者取0.81,对应整数205左右。

第五步取符合第四步条件的最大的联通区域作为识别的天空区域。

第六步是为了防止一些漏检点,把在天空区域周边的一些像素在进一步进行识别,符合条件的则加到天空区域中。

第七步是一些被完整包含在天空中还未被认为是天空的小区域添加到天空中。

个人认为,除了第一步、第二步、第四步有必要外,其他的不需要这样处理。特别是第五步的处理会造成天空部位的漏检。比如下面的流程示意图的原图,如果用上述方式肯定会造成左上角处小部分天空完全丢失掉。另外一个问题就是,联通区域的计算还是比较耗时的。

     我的做法是: 

1、将图像转换为灰度:这里为保留更多的边缘信息,可以考虑使用具有对比度保留功能或显著性保留功能的一些去色算法。

2、求灰度图像的梯度信息(其实就可以用常用的一些边缘检测算子实现);

3、对梯度信息进行适当的去噪和滤波;

4、按照设定梯度阈值和亮度阈值对梯度信息进行区分;

5、对区分后的图进行高斯羽化处理(可选的)。

整个流程的示意图如下所示:

   

              原图                                    灰度图                                  梯度信息

  

            稍作去噪                                 初步天空识别                                      进行羽化

作为对比,我们在给出几幅图的天空的识别效果:

  

  

 对于那些基本不存在天空的图,检测的结果如下:

  

  一片黑,因此,完全不影响结果。

得到天空区域后,原文作者将天空区域的透射率图统一的设置成了一个固定值,我认为这样不好,还是应该根据具体的值做适当的修正。 在我上述的操作中,得到的天空去区域是一副蒙版图,某个点并不一定是完全属于天空或完全不属于。因此,我就可以根据这个值来+ 暗通道求得的值进行一下Alpha混合,如下所示:

  DarkChannel[Y]= (SkyPresrve * Sky[Y] + DarkChannel[Y] * (255 - Sky[Y])) / 255 ;    

  其中SkyPresrve就类似于论文的固定透射率值,是用户指定的,在上式中,若Sky[255],即完全属于天空,则改点的透射率即为固定值,若Sky[Y]=0,即完全不属于天空,计算式的值不变,不影响正常去雾。

另外关于大气光值A的计算,论文提出了以获得的天空部位的像素的平均值作为A,这也是非常合理的,但是在实际处理时,针对有些完全没有天空部分的图像,可能检测到的天空区域很小(明显属于误检,但是程序不知道的),这个时候以此为大气光值,也是不合理的。为此,我的处理方式先计算天空部位计算的A值,然后在检测天空像素占整个图像的比例,如果比例小于5%,则还是以何凯明那种计算A的方式进行。

还有一步,论文也提到了,就是这些校正的步骤都必须在refine阶段之前做,简单的说,就是需要在进行导向滤波前做。这样利用导向滤波的平滑功能,可以将天空和非天空分界部位的不平滑现象一定程度上弥补掉);

  为了提高速度,也可以采用我在何那篇论文的分析的博文中的方式,进行下采样处理,然后在上采样。

作为对比,我们给出直接用何的方式实现的效果和用天空识别方式处理的对比效果:

     

  

  

   

   

               原图                                    何的去雾                             本文结果(SkyPresrve =100)

  有以上比较可见,在保护了天空的时候,和天空交接的地方的去雾程度也适当的有所减弱。

   在论文的最后,作者也提到了去雾的图像显得比较昏暗,为此,做了一下处理:

  即在HSV空间,对V分量进行CLAHE增强,然后在转换到RGB空间,这种方式对有些图像确实有很明显的增强效果,但是有些图可能又会增强噪音,因此还是根据实际情况选择性的处理吧。

  示例程序:http://files.cnblogs.com/Imageshop/HazeRemovalWithSkyRecognition.rar

****************************基本上我不提供源代码,但是我会尽量用文字把对应的算法描述清楚或提供参考文档************************

*************************************因为靠自己的努力和实践写出来的效果才真正是自己的东西,人一定要靠自己*******************

****************************作者: laviewpbt   时间: 2014.8.12    联系QQ:  33184777 转载请保留本行信息**********************

避免图像去雾算法中让天空部分出现过增强的一种简易方法。

时间: 2024-10-14 03:57:50

避免图像去雾算法中让天空部分出现过增强的一种简易方法。的相关文章

《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果

本文完全转载:http://www.cnblogs.com/Imageshop/p/3281703.html,再次仅当学习交流使用.. <Single Image Haze Removal Using Dark Channel Prior>一文中图像去雾算法的原理.实现.效果(速度可实时) 本文算法合作联系QQ: 33184777, 非诚勿扰 邮件地址:   [email protected] 最新的效果见 :http://video.sina.com.cn/v/b/124538950-125

暗通道优先的图像去雾算法(下)

书接上文 http://blog.csdn.net/baimafujinji/article/details/27206237 我们已经了解了暗通道图像去雾算法的基本原理,下面我们来编程实现,然后对结果再做一些讨论. 上述代码中调用了几个函数,限于篇幅这里仅给出其中的暗通道处理函数,其余函数读者可以尝试自己写写看,当然其中最关键的就是暗通道处理函数,这也是算法的核心内容. 另外,代码里我们使用了导向滤波函数,导向滤波代码来自何恺明博士,读者可以访问他的网页获得源码,已经论文的原文,链接如下: h

暗通道优先的图像去雾算法(上)

?? 11.1  暗通道优先的图像去雾算法 图像增强与图像修复二者之间有一定交叉,尽管它们一个强调客观标准,一个强调主观标准,但毕竟最终的结果都改善了图像的质量.图像去雾就是这两种技术彼此交叉领域中最典型的代表.如果将雾霾看作是一种噪声,那么去除雾霾的标准显然是非常客观的,也就是要将图像恢复至没有雾霾下所获取的情况.但是如果将在雾霾环境下拍摄的照片就看作是一种图像本来的面貌,那么去雾显然就是人们为了改善主观视觉质量而对图像所进行的一种增强.早期图像去雾的研究并没有得到应有的重视,很多人认为它的实

高级图像去雾算法的快速实现(转载)

原文:http://blog.csdn.net/laviewpbt/article/details/11555877 最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者何凯明博士,2007年清华大学毕业

图像去雾算法

题记:——首先交代一下背景,之前一直做FPGA硬件方面的东西,由于业务需要转做图像处理.由一个小白做起,从阅读冈萨雷斯开始了图像处理之路.中间也经历了很多坎坷曲折,不多说了开图. 阅读了一些图像去雾方面的论文与资料,发现大部分都是围绕“何凯明博士(香港大学)提出的暗通道先验理论做研究”,鄙人也拜读了何博士的文章,真是心悦诚服之感. 论文名称为“single image haze removal using dark channel prior” 论文中是这样解释各个参数的:I(X)就是有雾图像(

用于图像去雾的优化对比度增强算法

图像去雾哪家强?之前我们已经讨论过了著名的基于暗通道先验的图像去雾(Kaiming He, 2009)算法,如果你用兴趣可以参考: 暗通道优先的图像去雾算法(上) 暗通道优先的图像去雾算法(下) 此外,网上也有很多同道推荐了一篇由韩国学者所发表的研究论文<Optimized contrast enhancement for real-time image and video dehazing>(你也可以从文末参考文献[1]给出的链接中下载到这篇经典论文),其中原作者就提出了一个效果相当不错的图

opencv的图像去雾

上个月用基于中值滤波的暗通道图像去雾算法在matlab中实现了,现在想把它改造成C++的代码,结果效果明显不对,特此发出来,希望能找到问题. 1 #include <opencv2/core/core.hpp> 2 #include <opencv2/highgui/highgui.hpp> 3 #include <opencv2/highgui/highgui_c.h> 4 #include <opencv2/imgproc/types_c.h> 5 #i

何恺明经典去雾算法

何恺明经典去雾算法 一:由简至美的最佳论文(作者:何恺明  视觉计算组) [视觉机器人:个人感觉学习他的经典算法固然很重要,但是他的解决问题的思路也是非常值得我们学习的] 那是2009年4月24日的早上,我收到了一封不同寻常的email.发信人是CVPR 2009的主席们,他们说我的文章获得了CVPR 2009的最佳论文奖(Best Paper Award).我反复阅读这封邮件以确认我没有理解错误.这真是一件令人难以置信的事情. 北京灰霾照片的去雾结果 CVPR的中文名是计算机视觉与模式识别会议

[blog 算法原理]基于clahe的图像去雾

基于clahe的图像去雾 通过阅读一些资料,我了解到clahe算法对图像去雾有所价值,正好opencv中有了实现,拿过来看一看. 但是现在实现的效果还是有所差异 #include "stdafx.h"#include <iostream>#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc