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

在经典的几种去雾算法中,包括何凯明的暗通道去雾、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

opencv图像去雾改进相关推荐

  1. 【计算机视觉课程设计】基于暗通道先验单幅图像去雾算法的实现(MATLAB)

    声明:原创内容,创作不易,欢迎点赞收藏~ 摘    要 随着信息化时代的到来,计算机视觉得以迅速发展,在社会生活中的各个领域发挥了重要作用.然而,近年来大气污染逐渐加重,雾霾天气出现的频率越来越高,导 ...

  2. 纯c语言实现的改进暗通道去雾算法测试程序(附赠大量测试图像),基于改进暗通道先验算法的图像去雾...

    邱清辉 摘要:针对普通暗通道先验算法去雾能力的不足,本文提出了一种改进算法,通过采用高斯平滑将原图像分为基础子图和细节子图,基础子图采用暗通道先验算法,细节子图采用gamma变换方法,再采用图像融合进 ...

  3. Python基于OpenCV的图像去雾算法[完整源码&部署教程]

    1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...

  4. 【论文阅读】改进的基于均值滤波的单幅图像去雾算法研究

    改进的基于均值滤波的单幅图像去雾算法研究 吴延海,张婧,陈康 西安科技大学 学报, 2016 本文是在<基于单幅图像的快速去雾>基础上进行改进.主要改进有以下几点: 对<基于单幅图像 ...

  5. 基于guided image filtering的图像去雾 opencv实现

    基于guided image filtering的图像去雾 与暗原色图像去雾模型是一个系列的. 暗原色图像去雾模型是cvpr2009 bestpaper,图像去雾效果很好. 即.Kaiming He, ...

  6. 基于MATLAB改进暗通道先验的图像去雾算法

    基于MATLAB改进暗通道先验的图像去雾算法 摘要:暗通道先验去雾算法求得的的透射率比较精细,去雾效果优于大多数去雾算法.然而在暗通道求取过程中,最小值滤波的处理会使得暗色向外扩张,导致透射率扩张变大 ...

  7. 图像去雾算法_Matlab:单幅图象的暗原色先验去雾改进算法,能够很好地改进天空或明亮部分色彩失真问题...

    Matlab:单幅图象的暗原色先验去雾改进算法,能够很好地改进天空或明亮部分色彩失真问题 目录 输出结果 实现代码 代码下载 输出结果 ​ 实现代码 %单幅图象的暗原色先验去雾改进算法,能够很好地改进 ...

  8. 机器学习实践系列之13 - OpenCV之图像去雾

    图像去雾 是图像质量保证的一个重要方面,这里要讲到的是这个领域的一个里程碑式的贡献: 来自 何凯铭 的基于 暗原色先验(dark channel prior)的单一输入图像去雾方法,这是一种简单但是有 ...

  9. [论文阅读] (11)ACE算法和暗通道先验图像去雾算法(Rizzi | 何恺明老师)

    <娜璋带你读论文>系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢.由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学 ...

  10. globalmapper如何选取图像上的点_图像去雾的算法历史与综述

    图像去雾的算法历史与综述 1. 前言 其实之前对图像去雾也没有什么深入的理解,只是了解,实现过一些传统的图像去雾方法而已.个人感觉,在CNN模型大流行的今天,已经有很多人忽略了传统算法的发展,以至于你 ...

最新文章

  1. git中Please enter a commit message to explain why this merge is necessary.
  2. 问题和任务包003.使用报告.数据可视化.PowerBI.微软的新武器
  3. Windows 8 开发31日-第04日-新控件
  4. 10G_Ethernet_01 万兆以太网设计引言
  5. Activiti源码 之 DataManager EntityManager
  6. private关键字 java 1613808402
  7. 如何计算代码的运行性能
  8. MS-SQL 时间的操作
  9. python爬虫库教程_Python爬虫Selenium库详细教程
  10. syn flood 攻击 c 语言源代码,利用Python和C实现syn flood攻击
  11. Qt那些事0.0.2
  12. [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  13. 10个经典的公开数据集+免费下载链接
  14. php 错误503的原因,网站503错误原因和解决方法
  15. oa项目经验描述_(完整版)简历中的项目经验范文
  16. Could not enlist in transaction on entering meta-aware object
  17. GIS+=地理信息+行业+大数据——纽约公开11亿条出租车和Uber原始数据下载及分析...
  18. [收藏] 最全服务器基础知识科普
  19. L1-norm (L1范数) L2-norm(L2范数)
  20. geohash网格图_Geohash 网格聚合

热门文章

  1. 管理感悟:看清软件功能的“二八定律”
  2. 新入职朋友说话时,一定不要用“你们”,用“咱们”
  3. 设置GRUB菜单密码
  4. php mysql sum用法_mysql怎么使用sum()求id字段的和?
  5. 用python排序算法_用Python实现常见的排序算法
  6. C#调用DLL函数方法
  7. VNC 远程重装 Linux
  8. 构建LVS+Keepalived高可用群集
  9. 启动、停止、重启 MySQL 常见的操作方法:
  10. 体验Windows server 2012上安装SQL 2012