避免图像去雾算法中让天空部分出现过增强的一种简易方法
FROM:http://www.chawenti.com/articles/25193.html
在经典的几种去雾算法中,包括何凯明的暗通道去雾、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 转载请保留本行信息**********************
本文链接:避免图像去雾算法中让天空部分出现过增强的一种简易方法。,转载请注明。
避免图像去雾算法中让天空部分出现过增强的一种简易方法相关推荐
- 暗通道优先的图像去雾算法(上)
FROM:http://blog.csdn.net/baimafujinji/article/details/27206237 11.1 暗通道优先的图像去雾算法 图像增强与图像修复二者之间有一定交 ...
- 暗通道优先的图像去雾算法(下)
FROM:http://blog.csdn.net/baimafujinji/article/details/30060161 书接上文 http://blog.csdn.net/baimafujin ...
- [论文阅读] (11)ACE算法和暗通道先验图像去雾算法(Rizzi | 何恺明老师)
<娜璋带你读论文>系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢.由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学 ...
- 图像去雾算法(二)基于暗通道先验算法学习笔记
在http://write.blog.csdn.net/postedit/78301999中介绍了图像去雾的相关研究方法,发现目前为止在图像去雾方面,何凯明博士基于暗通道先验的算法具有很好的效果,关于 ...
- 综述:视频和图像去雾算法以及相关的图像恢复和增强研究
综述:视频和图像去雾算法以及相关的图像恢复和增强研究 翻译自IEEE的一篇文章<Review of Video and Image Defogging Algorithms and Relate ...
- 基于Vision Transformer的图像去雾算法研究与实现(附源码)
基于Vision Transformer的图像去雾算法研究与实现 0. 服务器性能简单监控 \LOG_USE_CPU_MEMORY\文件夹下的use_memory.py文件可以实时输出CPU使用率以及 ...
- 基于暗通道优先的单幅图像去雾算法(Matlab)
基于暗通道优先的单幅图像去雾算法(Matlab) 每一幅图像的RGB三个颜色通道中,总有一个通道的灰度值很低,几乎趋向于0.基于这个几乎可以视作是定理的先验知识,作者提出暗通道先验的去雾算法. 首 ...
- 暗原色先验图像去雾算法研究_先验算法
暗原色先验图像去雾算法研究 Today we are going to learn about Apriori Algorithm. Before we start with that we need ...
- Python基于OpenCV的图像去雾算法[完整源码&部署教程]
1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...
最新文章
- 博客5:文件,目录以及用户的权限管理
- 简单套路发高分文章--杨树内生和根际微生物组结构
- 阿里开源混沌工程工具 ChaosBlade
- QT中树控件QTreeView开发实例
- flex 关键词过滤 2.5.35
- SOL注入——HTTP头部注入(六)
- Teams数据统计 - 通话记录
- 如何用python画转盘_如何用ppt做一个抽奖转盘 看完你学会了么
- 【心情】最近实在是太忙了,没有心情写东西!
- spring4.0:@Configuration的使用
- Rust: Rust Language Cheat Sheet,强烈推荐!
- h5页面如何预览excel文件_在网页中预览word和excel
- 投影仪光源与亮度科普
- 关于win10开始菜单点击无反应解决方案
- npm i 和 npm i -S有什么区别吗?
- android小型app创意,创意无止境!17款让人脑洞大开的APP推荐
- 《药学综合知识与技能》
- Global Malmquist-Luenberger 指数分解及matlab应用,文后有网盘链接
- react移动端登录(第三方登录)和个人执行实现
- 2022年华中杯思路
热门文章
- oracle json 搜索,oracle 正则查询json返回报文中某个字段的值
- OVS packet处理流程(三十二)
- mysql查询当前use的数据库
- 包里替换class文件_Java 反射之根基 Class 类
- 云计算三层架构_金山云发布星曜裸金属服务器 打造面向云计算2.0的云基础架构...
- 9个JavaScript小技巧:写出更简洁,高效代码
- 通过几个例子看sed的模式空间与保持空间
- 一次针对SAP系统的完美渗透测试
- OAuth 2 开发人员指南
- 当当架构部张亮:从码农到大牛,技术与心境的双重提升