文档章节

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

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:39
字数 1931
阅读 45
收藏 0

  

    在经典的几种去雾算法中,包括何凯明的暗通道去雾、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 转载请保留本行信息**********************

  

本文转载自:http://www.cnblogs.com/Imageshop/p/3907639.html

abcijkxyz
粉丝 64
博文 6421
码字总数 1876
作品 0
深圳
项目经理
私信 提问
SSE图像算法优化系列二十九:基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)

  拉普拉斯金字塔融合是多图融合相关算法里最简单和最容易实现的一种,我们在看网络上大部分的文章都是在拿那个苹果和橙子融合在一起,变成一个果橙的效果作为例子说明。在这方面确实融合的...

Imageshop
03/30
0
0
天空是无限制的:基于语义的天空替换Sky is not limit:semantic aware sky replacement

第一个图片是输入图片,后面三个是不同风格的天空替换后的结果 这篇文章是给出一张输入的图片,论文中提出的方法自动的生成一组风格化天空图,我们首先使用了FCN全卷积神经网络,得到输入图片...

水球喵
2017/07/15
0
0
用 Go 实现图片尺寸的自动调节

我刚上大学那会儿,课上到最后几分钟的时候,我会翘课奔到另外一个我几乎不怎么了解的班上去蹭课。碰巧,那个班上的课是我觉得最棒的课之一 ——计算机视觉。此外,那个课上介绍了一种很赞的...

sheepbao
2016/07/11
4.1K
16
论文解读:Benchmarking Robustness in Object Detection: Autonomous Driving when Winter is Coming

1.论文目的 讨论现有目标检测算法应用于自动驾驶任务中,在实际场景中会因为雨雪雾等特殊天气造成的图像退化,影响目标检测算法性能。 2.论文介绍 CNN的泛化能力为其一大问题。一系列研究发现...

赵小闹_da42
07/29
0
0
SSE图像算法优化系列二十:一种快速简单而又有效的低照度图像恢复算法。

 又有很久没有动笔了,主要是最近没研究什么东西,而且现在主流的趋势都是研究深度学习去了,但自己没这方面的需求,同时也就很少有动力再去看传统算法,今天一个人在加,还是抽空分享一个简...

Imageshop
2018/08/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java FOR-EACH循环

FOR-EACH循环使得代码更加的简短,也让代码更加易懂,其实他并没有加入什么新的功能。他的功能完全可以用简单的FOR循环代替。 for-each的用法: int a[] = {1,2,3,4,5,6} for(int s:a){ Syst...

无名氏的程序员
11分钟前
2
0
使用HTML5的History API

本文转载于:专业的前端网站➣使用HTML5的History API   HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL。这个功能很有用,例如通过一段JavaScript代...

前端老手
14分钟前
2
0
JAVA 编写redisUtils工具类,防止高并发获取缓存出现并发问题

import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.BoundHashOperations;import org.springframework.data.redis.core.BoundValueOperations;import org.......

huangkejie
55分钟前
7
0
JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
今天
98
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部