文档章节

暗通道去雾与自适应直方图均衡去雾之比较

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:45
字数 1499
阅读 7
收藏 0
点赞 0
评论 0

本文主要对比两种去雾增强算法的优略。

1. 暗通道去雾方法

           这种方法目前研究的比较多。虽然大家认为去雾已经被研究烂了,但是从工程实践的角度看,仍然存在很多问题。却不说暗通道先验对天空本身的不合理假设,就单说时间复杂度。对于视频图像处理来说,视频编解码就已经占了大量的CPU时间,而如果其它一些图像增强的算法也要占用大量的计算时间,就会导致了很多所谓的the state of art 的算法在工程实践上,依然并不可行。举一个很简单的例子,目前普通PC单核的处理能力只能编码2-4路的720P的H264码流,如果图像增强算法的处理时间大于15ms,则意味着在普通PC上这种算法并不可行。

      关于暗通道去雾的原理,下面几篇网络文章可以参考。

http://www.cnblogs.com/Imageshop/p/3281703.html

http://blog.csdn.net/celerychen2009/article/details/8839098



2. 对比度受限自适应直方图增强去雾方法


        直方图增强是一种古老的技术。不过给我的印象是,对于大部分图像,简单的直方图增强的效果很不好。不过,前几天看到网络上一位牛人的文章,让我对直方图增强有了新的认识。当然,不是直接用直方图,而是对比度受限自适应直方图增强。


       自适应直方图是使用多个直方图,例如对整个图像可以划分为8x8个小块,称为8x8的tiles,则总共会有64个直方图。用这64个直方图来做,tiles的边界处用线性插值的方法实现平滑的过渡。具体原理可以参考下面的博文:

http://www.cnblogs.com/Imageshop/archive/2013/04/07/3006334.html

http://www.cnblogs.com/Imageshop/p/3395968.html


3. 算法实现


   3.1 暗通道去雾的快速算法。


         暗通道去雾的快速算法改进主要集中在对透射率的refine上。有很多的非线性边缘保持滤波可以用。我起初使用的是非线性各向异性扩散方程,非线性扩散在KAZE特征提取中被采用,其相关的网络资源可以参考:http://blog.csdn.net/chenyusiyuan/article/details/8710462。采用加法分裂算子来离散化偏微分方程,仅需很少的几次迭代就可以收敛,如果采用跳跃格式的迭代算法,则可以不必求解三对角线性方程组,这种方法是快速稳定高效的。

      采用双边滤波也是一种不错的选择,然而双边滤波的快速算法实在是快不起来。一种更快更好的方案是采用引导滤波guided filter. guided filter应该是目前最快的边缘保持滤波了,我的实现方案表明,其计算时间比我的快速高斯滤波算法还要快。


  3.2 对比度受限自适应直方图的实现


      这个算法实现相对比较简单,没有暗通道去雾那么多过程。

      例如对于2x2的tiles,如果图像是64x64的,则每个block的大小是32x32,对每一个32x32的小块,计算直方图,然后根据相应的参数重新调整直方图再映射回去。当然,如果图像的尺寸不是tiles的整数倍的时候需要进行对称拓展。最后,在tiles的边缘处进行插值是比较耗时的操作。本文直接给出笔者的实现代码:

static clahe_interpolation( int width, int height, int stride, cv8u* src, cv8u* dst,int channel, 
						   Size2i* tileSize, int tiles_y, int tiles_x, cv8u* ptr_lut_data, int lut_step)
{
	int i,j;
	if (channel == 1){
		for (j = 0; j < height; j++){
			cv8u* pTmpSrc = src + j * stride;
			cv8u* pTmpDst = dst + j * stride;
			int tyf_i =  (j << CLAHE_Q)/tileSize->height - (1 << (CLAHE_Q -1));
			int ty1_i = tyf_i >> CLAHE_Q;
			int ty2_i = ty1_i + 1;

			int ya_i = tyf_i - (ty1_i << CLAHE_Q);
			cv8u* lutPlane1,*lutPlane2;

			ty1_i = (ty1_i < 0) ? 0 : (ty1_i);
			ty2_i = (ty2_i > tiles_y - 1) ? (tiles_y - 1) : (ty2_i);


			lutPlane1 = &ptr_lut_data[ty1_i * tiles_x * lut_step];
			lutPlane2 = &ptr_lut_data[ty2_i * tiles_x * lut_step];

			for (i = 0; i < width; i++){
				int srcVal;
				int ind1,ind2;
				int res_i;
				int txf_i = (i << CLAHE_Q)/tileSize->width - (1 << (CLAHE_Q -1));
				int tx1_i = txf_i >> CLAHE_Q;
				int tx2_i = tx1_i + 1;
				int xa_i = txf_i - (tx1_i << CLAHE_Q);
				int tf_1_i,tf_2_i,tf_3_i,tf_4_i;
				
				srcVal = *pTmpSrc++;

				tx1_i = (tx1_i < 0) ? 0 : (tx1_i);
				tx2_i = (tx2_i > tiles_x - 1) ? (tiles_x - 1) : (tx2_i);

				ind1 = tx1_i * lut_step + srcVal;
				ind2 = tx2_i * lut_step + srcVal;


				tf_1_i = (((1 << CLAHE_Q) - xa_i) * ( (1 << CLAHE_Q) - ya_i)) >> CLAHE_Q;
				tf_2_i = ((xa_i) * ((1 << CLAHE_Q) - ya_i)) >> CLAHE_Q;
				tf_3_i = (((1 << CLAHE_Q) - xa_i) * (ya_i)) >> CLAHE_Q;
				tf_4_i = ((xa_i) * (ya_i)) >> CLAHE_Q;

				res_i  = lutPlane1[ind1] * tf_1_i;
				res_i += lutPlane1[ind2] * tf_2_i;
				res_i += lutPlane2[ind1] * tf_3_i;
				res_i += lutPlane2[ind2] * tf_4_i;
				res_i = (res_i + (1 << (CLAHE_Q - 1))) >> CLAHE_Q;

				*pTmpDst++ = FCV_CLAMP0255_INT(res_i);
			}
		}
    }
}

   3.3 性能比较


4. 去雾效果比较

   最后还是给几张去雾效果图:

                          暗通道去雾效果                                                                             对比度受限自适应HE效果


                                   原图      


暗通道去雾


对比度受限自适应HE


原图


暗通道去雾


对比度受限自适应HE


原图



不足之处分析:

1. 暗通道去雾在较远的天空处存在失真的块效应,通过适当的参数调节可以有效减弱但没法完全避免。没有一个统一的参数来针对所有的图像。

2. 暗通道去雾对于某些低对比度却存在大量天空的区域可能完全失效,效果惨不忍睹。

3. 暗通道去雾的效果可能把整幅图像的亮度降低了,可以通过融合了亮度调整到透射率的优化之中来减轻这种现象。

4. 对比度受限自适应HE可能存在颜色的过饱和现象,自适应HE更适合图像整个对比度较低的场合。

5. 对比度受限自适应HE的计算成本很低,对于D1尺寸的图片其处理时间小于15ms。




本文转载自:http://www.cnblogs.com/celerychen/p/3588190.html

共有 人打赏支持
abcijkxyz
粉丝 61
博文 6195
码字总数 1876
作品 0
深圳
项目经理
9- OpenCV+TensorFlow 入门人工智能图像处理-8- OpenCV+TensorFlow 入门人工智能图像处理-图像修复

图像美化 案例1: 直方图 案例2: 直方图均衡化 案例3: 亮度增强 案例4: 磨皮美白 案例5: 图片滤波 案例6: 高斯滤波 颜色等级的直方图。 图片滤波 这一章节所有的知识点都比较复杂,也就是难度...

天涯明月笙 ⋅ 05/08 ⋅ 0

图像相似度比较和检测图像中的特定物

对普通人而言,识别任意两张图片是否相似是件很容易的事儿。但是从计算机的角度来识别的话,需要先识别出图像的特征,然后才能进行比对。在图像识别中,颜色特征是最为常见的。每张图像都可以...

Tony沈哲 ⋅ 2017/06/12 ⋅ 0

不同色彩转换

〇 引子 图像有多种色彩模型,如灰度图、RGB、HSV、YCbCr等等。这些图片文件在计算机中以不同的格式存在,如JPEG、png。图像的原始存储格式限定了读取到内存后的存在形式,在图像处理、计算机...

Aspirinrin ⋅ 2017/09/19 ⋅ 0

OpenCV 2.4+ C++ 人脸识别

机器学习 机器学习的目的是把数据转换成信息。 机器学习通过从数据里提取规则或模式来把数据转成信息。 人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸。 每个节点的正确...

j_m ⋅ 2012/11/26 ⋅ 0

Opencv系列-图像增强

Opencv系列-图像增强 图像增强对于图像预处理有很大的帮助,再一次看到这篇文章的时候,有如看到。。。反正不一样的感觉 1. 基于直方图均衡化的图像增强 直方图均衡化是通过图像的灰阶分布,...

googler_offer ⋅ 01/27 ⋅ 0

图像直方图与直方图均衡化

图像直方图(英语:Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布。这种直方图中,横坐标的左侧...

Tony沈哲 ⋅ 2017/05/22 ⋅ 0

前沿 | MIT自动驾驶技术突破:实现浓雾中物体观测和测距

     大数据文摘作品   编译:蒋宝尚   开发可见光自主车辆导航系统一直有一个主要障碍:无法应对雾蒙蒙的驾驶条件。   可见光系统比雷达探测系统表现更好,是因为其拥有高分辨率、...

大数据文摘 ⋅ 04/13 ⋅ 0

深度学习必备---用Keras和直方图均衡化---数据增强

作者:王抒伟 编辑:王抒伟 本文100字3图,阅读约三分钟 算了 爱看多久看多久 在读这技术文章之前,请大家想象一个标准河南口音的娃在读这篇文章,那么你不知不觉,你的嘴角就上扬咯。 俺、遇...

机器学习算法全栈工程师 ⋅ 01/26 ⋅ 0

PrismCDN 网络的架构解析,以及低延迟、低成本的奥秘

5 月 19、20 日,行业精英齐聚的 WebRTCon 2018 在上海举办。又拍云 PrismCDN 项目负责人凌建发在大会做了《又拍云低延时的 WebP2P 直播实践》的精彩分享。 分享介绍了 WebP2P 行业将从 Flas...

又拍云 ⋅ 06/07 ⋅ 0

【图像处理】图像强度变换、直方图均衡化(Image Intensity Transformations and Histogram Equalization)

实验要求   该实验使用强度变换方法对图像进行增强。实验图像为图3.8(a)   (1.a) 用公式(3.2-2)所示的对数变换方法进行图像增强。   (1.b) 用公式(3.2-3)形式的指数变换方法进行图像增...

u013165921 ⋅ 01/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 33分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 56分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 58分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 今天 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 今天 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 今天 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部