【转载】去光照不均匀matlab 算法和代码
其他原创博客http://blog.csdn.net/baolinq
主要看第三部分就可以,前面是一些其他常见 的基本图像方法。基于二维伽马函数的光照不均匀图像自适应校正算法
在视频和图像的采集过程中,由于受到地物环境复杂、物品之间相互遮挡以及环境光照条件多变等因素的影响,经常会导致场景的光照不均匀,主要表现为图像中亮的区域光线足够或者过强,而暗的区域照度不足,导致一些重要的细节信息无法凸显甚至被掩盖掉,严重影响了图像的视觉效果和应用价值,因此开展光照不均匀图像的校正研究,消除不均匀光照对图像的影响,已经成为当前图像处理领域的一个研究热点。
最近在做目标检测的一些东西,有些原始图像的光照很不均匀,影响检测准确度。光照不均匀的图像作目标检测难度其实还真的蛮大的,我在想着能不能从源图像入手,改善或者说提高图像的质量,从而提高检测精度。但是这样说好像有点问题的,对这种情况,是不是应该在深度学习的样本数据中增加光照不均匀的图像,从而能在测试图像中成功检测。先不管了,本文只是谈谈如何去光照不均匀,从而改善图像质量。


本文主要针对类似上面的类型图像,光照不均匀,有的地方亮度较大有的则很暗。
尝试过很多方法:
1.直方图均衡化
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。思路很简单,先统计原图的灰度级分布情况,得到累积分布函数,由该函数可以求出原图和结果图的映射关系f,对每个像素作用此映射即可。
这样可以可以提高图像的对比度。下面是实验结果截图:


传统算法检测结果


分析:从上至下分别为:原图,灰度图,直方图均衡化后的图,后面分别是对应的检测结果。
可以明显看到,经过直方图均衡化处理后的图像由两个car被检测出来了,而在原图是没有被检测出来的。虽然直方图均衡化之后,原图像光照强的地方被曝光很严重,(人眼视觉上)处理结果并不好,但是实验显示更有利于做目标检测。
总的来说,有一定的提升效果但是不够好,还是有车没有检测出来。
2.retenix去雾算法
Retinex理论在彩色图像增强、图像去雾、去光照不均匀影响、彩色图像恢复方面拥有很好的效果。网上有很多博文讲这个算法,是个非常经典的算法,试验测试结果截图:
原图:

Retinex效果图

分析:从人眼视觉效果上看,Retinex的处理去光照效果更好一些,但是检测结果并没有改进。
3. 基于二维伽马函数的光照不均匀图像自适应校正算法
基于二维伽马函数光照不均匀图像自适应校正算法,文献中算法的思路较简单,实现出来没有论文那么好的效果:
(1) 利用多尺度高斯函数去除场景的光照分量
(2) 然后构造了一种二维伽马函数,并利用光照分量的分布特性调整二维伽马函数的参数,降低光照过强区域的亮度值,提高光照过暗区域图像的亮度值,最终实现对光照不均匀图像的自适应校正处理。
利用高斯函数与源图像做卷积即可得到光照分量。G为高斯函数,F为源图像,I为光照分量。


二维伽马函数O(x,y),F是源图像,γ是亮度增强的指数值,由光照分量和光照分量的亮度均值m决定。

为避免RGB通道互相影响,整个处理过程是在HSV色彩空间进行的,对其中的亮度分量V进行处理,最后再从HSV空间转化到RGB空间。
注意:这里原论文的公式有问题,应该是作者的笔误,γ的指数应该是m-I(x,y),而不是I(x,y)-m。不然得到的结果不正确。简单分析一下:
底数小于1,那么指数越小,结果就会越大;指数越大,结果就会越小。伽马也是一个底数小于1的幂指数。
举个例子分析:按照论文的写法,设m=128,I(x,y)是较暗的地方灰度为64,γ是 ,是大于1的,底数小于1,则这个结果是小于底数的,暗的地方灰度变小
若I(x,y)是较亮的地方灰度为192,γ是根号0.5,,是小于1的,底数小于1,则这个结果是大于底数的。亮的地方灰度变大
那这样的结果是暗的地方变得更暗,亮的地方变得更亮,显然不对。
γ的指数应该是m-I(x,y),所以说论文里的公式还是要自己去推导一下~~
算法流程框图如下:

根据此算法流程图,我们写出相应的matlab代码。
Rgb2hsv,对h分量多尺度高斯卷积(高斯滤波),二维gamma函数校正,hsv2rgb,结束。
clc,close all; tic; im=imread('1128-2.jpg'); figure; imshow(im); title('原图'); [h,s,v]=rgb2hsv(im); %转到hsv空间,对亮度h处理 % 高斯滤波 HSIZE= min(size(im,1),size(im,2));%高斯卷积核尺寸 q=sqrt(2); SIGMA1=15;%论文里面的c SIGMA2=80; SIGMA3=250; F1 = fspecial('gaussian',HSIZE,SIGMA1/q); F2 = fspecial('gaussian',HSIZE,SIGMA2/q) ; F3 = fspecial('gaussian',HSIZE,SIGMA3/q) ; gaus1= imfilter(v, F1, 'replicate'); gaus2= imfilter(v, F2, 'replicate'); gaus3= imfilter(v, F3, 'replicate'); gaus=(gaus1+gaus2+gaus3)/3; %多尺度高斯卷积,加权,权重为1/3 % gaus=(gaus*255); figure; imshow(gaus,[]); title('光照分量'); %二维伽马卷积 m=mean(gaus(:)); [w,height]=size(v); out=zeros(size(v)); gama=power(0.5,((m-gaus)/m));%根据公式gamma校正处理,论文公式有误 out=(power(v,gama)); figure; imshow(out,[]); rgb=hsv2rgb(h,s,out); %转回rgb空间显示 figure; imshow(rgb); title('处理结果') toc;
注意:
论文中没有说卷积核是多大,但是根据提取光照分量 的模糊程度,卷积核应该要取很大,我这里是取图像的宽和高中的较小者,min(h,w);
实践发现,在高斯卷积的时候使用imfilter
函数比conv2函数快太多了,在测试中,同一幅图像,使用imfilter
函数的整个过程1s以内,而使用conv2函数的却花了十几秒。
实验测试:


上面是论文中的截图处理效果,下面是我试验的截图,效果还是可以的,依次为原图、光照分量,效果图



错误处理结果,暗的地方变更暗,亮的地方变更亮

参考文献
[1] 刘志成, 王殿伟, 刘颖,等. 基于二维伽马函数的光照不均匀图像自适应校正算法[J]. 北京理工大学学报, 2016, 36(2):191-196.
————————————————
版权声明:本文为CSDN博主「baolinq」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baolinq/article/details/78756322

浙公网安备 33010602011771号