基于暗通道去雾算法的实现与优化(三)优化策略

注:这一系列的文章是我大四时写的,现在回顾,发现当时的布局和公式实在是太难看了,读者可移步至这里查看舒服的排版github同步博客。


点我查看测试样例


一 原论文方法的局限性

谈到优化,我们首先需要了解原论文的方法有何局限,在实际编码测试中我发现了以下的三点局限:

1.太过耗时 

在上一篇中,在透射图的精细化(refine)中原论文使用的是softmatting方法,而我编码使用的是引导滤波,一是因为softmatting我看不太懂,二是因为softmatting实在是太耗时间了,而引导滤波的时间复杂度是常数并且其效果不比softmatting差。

即使在使用引导滤波代替原文softmatting之后,处理一幅324*284的图像也需要150ms左右,这对于视频处理来说时间还是太长了(一般30ms左右)!

2.色斑,色块效应

在实验中发现,当像素点的强度(intensity)接近大气光值(airlight)时,去雾的图像会出现局部的色斑,色偏效应,这样说的比较抽象,大家可以看一下下边的对比图:


大家可以看到左图上部区域出现了明显的色斑效应,这是因为上部分的图像像素强度非常接近大气光值,有人可能会问,为什么接近大气光值就会导致色斑呢?

还记得第一篇中提到的透射图的计算公式吗?如下:


    

   当I(y)非常接近A时,t(x)就会非常小,接近于0,也就是说t(x)<t0,于是乎,当我们计算J(x)时,会有很多的像素对应着同一个t值,即t0,这就会导致出项色斑啦!

3.图像亮度降低

                何在论文中也提到了,处理完之后,图像的亮度会有一点变暗,至于为啥,我暂时不能理解;这就需要我们使用一定的策略进行图像增强,我使用的是局部非线性增强的方法。


二 解决的策略

1.图像降采样处理

这一点要特别感谢http://www.cnblogs.com/Imageshop/p/3281703.html 的博主,受到他的启发;

我们知道:去雾的过程中计算的暗通道和透射率图像并不需要特别的高质量(高分辨率),那么我们就可以把图像降采样,把缩小的图像作为输入计算暗通道和透射率图像,在最后一步时我们再使用插值的方式resize暗通道和透射率图像到原图的大小,这样从理论上来说对效果没有明显的影响。

基于这样的思路,我进行了实验,其中我的降采样率为0.5,理论上来说应该可以减少1/4左右的计算量,效果如下:

原图:



降采样处理过的去雾效果:



未降采样的去雾效果:



执行时间:降采样处理过的去雾耗时:42ms;未处理的去雾效果:150ms

从上边的对比图像中可以发现,从主观上来看,降采样处理之后的效果几乎与未降采样的效果是一样的,但是,时间确大大减少了,仅仅需要42ms 啊亲!

需要注意:不能把scale降采样率设置的太小了,一是会影响效果;二是在缩小和放大图像过程中耗时可能会过多,得不偿失啊亲!

2.优化t(x)的计算

既然是因为计算t的时候出现的问题,那么我们可以人为的在t过小的时候进行一些处理,使它不至于总是比t0小;

for(int k=0;k<nr;k++){
		const uchar* inData=darkimg.ptr<uchar>(k);  
		const uchar* srcData=srcimg.ptr<uchar>(k);  
		float* outData=transmission.ptr<float>(k);
		for(int l=0;l<nl;l++)
		{
			pix[0]=*srcData++;
			pix[1]=*srcData++;
			pix[2]=*srcData++;
			r=fabs((pix[0]+pix[1]+pix[2])/3.0-avg_A);
			if(r<r0)
				*outData++=1-w*(*inData++/avg_A)+(r0-r)/r0;
			else			
				*outData++=1-w*(*inData++/avg_A);			
		}
	}
上述代码中,我加了一个判断,当像素的强度非常接近大气光值时,对于t的计算加上一个增幅项,即:(r0-r)/r0;其中,r是当前的像素intensity,r0是判断的阈值。

经过这样简单的处理之后,我们再来看看效果吧!见下图:

原图:


未优化的效果:


优化之后的效果:


对比可以看出来,优化之后明显的去除了第二幅图中的色斑效应!当然,阈值的选择很重要,太大了,图像去雾不明显,太小了色斑又会出来,大家可以继续优化,搞个动态阈值什么的~

下一篇,介绍一下opencv for android,并在android中实现去雾算法(我并不想染指android,没办法啊,党指挥枪哈哈)。

2016/09/25更新

时隔多日。。博主并不想更新了 ==

主要是在安卓中如果想保持较快的处理速度一定要调用C的函数,其他参考opencv for android的 api即可

这就涉及到如何在java中调用c函数的一些blablabla了。。。

再废话一句:突然想到《藤王阁序》一句:

登高作赋,是所望于群公。


  • 6
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值