图像去雾算法综述

现有的图像去雾算法综述

一、概述
  图像的去雾问题一直以来数字图像处理爱好者想要突破的难题,自2009年Kaiming He 在CVPR中获得最佳论文后,图像去雾取得了重要的突破。于是便出现了很多基于暗通道处理的去雾方法,其中不乏一些是挺水的。这一个月的去雾算法我主要是从两个方面入手,一方面是基于图像增强去雾方法;一方面是基于先验的方法(比较著名的有暗通道先验的方法)下面将分别介绍一种常见的图像去雾方法。
图像去雾算法综述_第1张图片
二、基于Retinex理论的图像去雾方法

  1. Retinex理论基础:真实的世界是没有颜色的,我们所感受到的颜色是光和物体相互作用后产生的结果;图像的每一个颜色区域都是由红绿蓝三种波长所决定的,三原色决定了图像的每一个区域的颜色;光环境下并不影响物体的颜色恒常性。

  2. Retine理论的基本思想:在图像的三个颜色通道分别处理,把图像S(x,y)分解为光照图像R(x,y)和物体反射图像L(x,y)
    S ( x , y ) = R ( x , y ) ∗ L ( x , y ) S(x,y)=R(x,y)*L(x,y) S(x,y)=R(x,y)L(x,y)

  3. Retinex-SSR
    利用对数的方法将物体反射分量和光照图像进行分离

$$$$

因为我采用的是在频域中提取光照图像,所以采用高斯模板对原图像做卷积运算,相当于低通滤波,空域中两个图像的傅里叶变换相当于频域中傅里叶变换的乘积。(当然也是可以在空域中之间进行高斯滤波)
$$$$

在对数域中减去低通滤波后的图像,得到高频增强图像
$$$$

取反对数得到增强图像R(x,y)
$$$$

后面还需要对整幅图像的对比度进行调整,线性量化(至于为什么要这一步我也不是很清楚),大致猜测是一个归一化过程。
i m g = ( i m g − m i n ) / ( m a x − m i n ) img=(img-min) /(max-min) img=(imgmin)/maxmin
其中在对光源图像L(x,y)做光源估计时,需要事先确定一个宽度范围sigma,然后对图像进行高斯滤波。
因为是单尺度的采用高斯滤波得到光源估计,所以我们称上面的过程为SSR。

  1. Retinex-MSR
    MSR与SSR的不同点在于高斯滤波时所采用的尺度不一样,SSR采用的是单尺度高斯滤波,而MSR采用的的多尺度的高斯滤波,MSR的在效果上毋庸置疑比SSR具有更好的去雾效果。
  2. Retinex-MSRCR
    MSRCR又是在MSR的基础上添加了一个色彩恢复因子,能够更好复原图像的颜色。
    下面是matlab中进行色彩恢复的方法(部分代码)
%定义色彩恢复因子
a=125;
I1=imadd(R,G);
I1=imadd(I1,B);
Ir=immultiply(R,a);
C=imdivide(Ir,I1);
C=log(C+1);
%将增强后的R分量乘以色彩恢复因子,并对其进行反对数变换
Rend=immultiply(C,Raverage);
EXPR=exp(Rend);

三、基于暗通道先验的图像去雾算法
1.暗通道先验的理论基础 :暗通道先验是基于雾图像模型何凯明率先提出来的,给后面图像去雾带来了变革性的发展,下面详细介绍下暗通道先验去雾的方法。
雾模型:
在这里插入图片描述
上面模型中I(x,y)是输入图像,A是大气光,t(x,y)是透射图像,我们要求的J(x,y),即去雾后的图像。
在这里插入图片描述
暗通道图像He是这样定义的:取RGB三通道,每个坐标对应点三通道的最小值我们可以认为是暗通道图像。
对于得到的暗通道图像我们进行最小值滤波,边界可以采用镜面或者相关进行处理,得到的暗通道图像我们可以近似认为下式
在这里插入图片描述
对雾模型进行变形,得到下式:
在这里插入图片描述
何凯明在论文对A的取值其实比较简单,他认为在暗通道中亮度的前0.1%可以人作A值。
在这里插入图片描述
然后两边取最小值,目的是提取出t(x,y),等号右边第一部分其实就是暗通道,趋于0,这样我们就可以得到t(x,y)。
在这里插入图片描述
这样我们A和t(x,y)就求出来了,接着对雾模型进行变形求出J(x,y)。
在这里插入图片描述
t 0 是 为 了 防 止 t ( x , y ) 过 小 t_0是为了防止t(x,y)过小 t0t(x,y)
以上就是He暗通道去雾的基本过程,He在处理得到的透视图图像时候采用了soft mapping软抠图来处理,算法较为复杂,处理量较大,后面发现用导向滤波进行处理,也可以得到较好的效果,本文的实验结果是采用导向滤波来进行透射图图像的软处理。
四、其他的一些去雾方法
其中基于图像增强的去雾方法还有:直方图均衡化,自适应直方图均衡化等
基于暗通道先验的去雾算法那就更多了:因为t(x,y)he采用的是导向滤波,那么后人就提问了能不能把导向滤波改为其他滤波方式,这样一来就出现了基于均值滤波的暗通道先验去雾,基于双边滤波的暗通道先验去雾,基于同态滤波的暗通道先验去雾,还有的人考虑大气光A值的估计,he的方法其实比较简单,也有一定缺陷,后人基于有基于统计的方法得到更好的大气光A值。
四、结果图像比较。
图像去雾算法综述_第2张图片
原图
图像去雾算法综述_第3张图片
SSR
图像去雾算法综述_第4张图片
MSRCR
图像去雾算法综述_第5张图片
暗通道先验图像去雾(采用的的导向滤波)
图像去雾算法综述_第6张图片
暗通道先验图像去雾(采用的是同态滤波)
图像去雾算法综述_第7张图片
暗通道先验去雾(采用的是实时均值滤波)
图像去雾算法综述_第8张图片
直方图均衡化
图像去雾算法综述_第9张图片
自适应直方图均衡化
五、总结
  其实图像去雾的方法还有很多,但基本上离不开两大类,一类是基于图像增强的去雾,一类是基于先验的方法去雾。通过上述几种方法比较而来,我还是比较喜欢MSRC和He的去雾方法,无论是色彩还是细节方面都比其他方法的去雾效果要好。国内的很多论文其实都是基于he的方法或者Retinex方法进行一定优化,改进然后就发行出来,有多大的创新一目了然。
总之,去雾之路还很漫长,我也进行了一个月的学习,虽然达不到精通吧,但是也算是有了一定的了解。后期我也会多查阅一些文献,期待能有一些创新。暂时去雾就告一段路吧。
结尾附上部分代码:

%代码是he的简化版,基于暗通道先验的图像去雾
tic
clc
clear
I=im2double(imread('p4.bmp'));
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
[m,n]=size(R);
I1=zeros(m,n);
I2=zeros(m,n);
for i=1:m
    for j=1:n
        I1(i,j)=min(R(i,j),B(i,j));
        I2(i,j)=min(I1(i,j),G(i,j));
    end
end
I2=ordfilt2(I2,1,ones(20,20),'symmetric');%最小值滤波的半径为=windows/2+1,镜面反射填充边界
sortI2=sort(I2(:),'descend');
num=round(size(sortI2,1)*0.001);
A=sortI2(num);
%粗略估计大气透射率t值
for i=1:m
    for j=1:n
        t(i,j)=1-0.95*min(min(I(i,j)/A));
    end
end
I3=(I-A)./max(max(t,0.1))+A;
subplot(2,2,1);imshow(I);
subplot(2,2,2);imshow(I2);
subplot(2,2,3);imshow(t);
subplot(2,2,4);imshow(I3);
T=imguidedfilter(t);
figure;
imshow(T);
figure;
I4=(I-A)./max(max(T,0.1))+A;
imshow(I4);
imwrite(I4,'E:\图像\ImageEnhancing\3.bmp');
toc

%%
%基于Retinx雾霾图像清晰化,引入色彩恢复因子,MSRCR
tic
clc
clear
close all
I=im2double(imread('p4.bmp'));
R=I(:,:,1);G=I(:,:,2);B=I(:,:,3);
[M,N]=size(R);
EXPR=fun(R,G,B,M,N);
EXPG=fun(G,B,R,M,N);
EXPB=fun(B,G,R,M,N);
RGB=cat(3,EXPR,EXPG,EXPB);
imshow([I RGB]);
imwrite(RGB,'E:\图像\ImageEnhancing\2.bmp');
toc
function [EXPR]=fun(R,G,B,M,N)
Rlog=log(R+1);
Rfft2=fft2(R);
sigma=128;
F=zeros(M,N);
for i=1:M
    for j=1:N
          F(i,j)=exp(-(((i-M/2)^2+(j-N/2)^2)/(2*sigma*sigma)));
    end
end
F=F./(sum(F(:)));
Ffft=fft2(F);
DR0=Rfft2.*Ffft;
%傅里叶反变换
DR=ifft2(DR0);
Rrlog=log(1+DR);
Rr1=Rlog-Rrlog;
sigma=256;
F=zeros(M,N);
for i=1:M
    for j=1:N
          F(i,j)=exp(-(((i-M/2)^2+(j-N/2)^2)/(2*sigma*sigma)));
    end
end
F=F./(sum(F(:)));
Ffft=fft2(F);
DR0=Rfft2.*Ffft;
%傅里叶反变换
DR=ifft2(DR0);
Rrlog=log(1+DR);
Rr2=Rlog-Rrlog;
sigma=512;
F=zeros(M,N);
for i=1:M
    for j=1:N
          F(i,j)=exp(-(((i-M/2)^2+(j-N/2)^2)/(2*sigma*sigma)));
    end
end
F=F./(sum(F(:)));
Ffft=fft2(F);
DR0=Rfft2.*Ffft;
%傅里叶反变换
DR=ifft2(DR0);
Rrlog=log(1+DR);
Rr3=Rlog-Rrlog;
Raverage=(Rr1+Rr2+Rr3)/3;
%定义色彩恢复因子
a=125;
I1=imadd(R,G);
I1=imadd(I1,B);
Ir=immultiply(R,a);
C=imdivide(Ir,I1);
C=log(C+1);
%将增强后的R分量乘以色彩恢复因子,并对其进行反对数变换
Rend=immultiply(C,Raverage);
EXPR=exp(Rend);
%对增强后的R分量进行灰度拉伸
MIN=min(min(EXPR));
MAX=max(max(EXPR));
EXPR=(EXPR-MIN)/(MAX-MIN);
EXPR=adapthisteq(EXPR);
end

欢迎各位大佬指正错误,欢迎相互交流!

你可能感兴趣的:(图像去雾)