去雾的算法及实现

去雾的算法及实现

一、原理

本次试验使用Retinex理论的雾霭天气图像增强及其实现。

1)基本原理

Retinex(视网膜“Retina”和大脑皮层“Cortex”的缩写)理论是一种建立在科学实验和科学分析基础上的基于人类视觉系统(Human Visual System)的图像增强理论。该算法的基本原理模型最早是由Edwin Land(埃德温•兰德)于1971年提出的一种被称为的色彩的理论,并在颜色恒常性的基础上提出的一种图像增强方法 Retinex 理论的基本内容是物体的颜色是由物体对长波(红)、中波(绿)和短波(蓝)光线的反射能力决定的,而不是由反射光强度的绝对值决定的;物体的色彩不受光照非均性的影响,具有一致性,即Retinex理论是以色感一致性(颜色恒常性)为基础的。

根据Edwin Land提出的理论,一幅给定的图像S(x,y)分解成两幅不同的图像:反射物体图像R(x,y)和入射光图像L(x,y),其原理示意图如图1所示。

图1 原理示意图

对于观察图像S中的每个点(x,y),用公式可以表示为: 

                     S(x,y)=R(x,y)×L(x,y)            (1.3.1)

实际上,Retinex理论就是通过图像S来得到物体的反射性质R,也就是去除了入射光L的性质从而得到物体原本形态。

2)基本步骤

步骤一:利用取对数的方法将照射光分量和反射光分量分离,即:

S'(x,y)=r(x,y)+l(x,y)=log(R(x,y))+log(L(x,y));

步骤二:用高斯模板对原图像做卷积,对原图像做低通滤波,得到低通滤波后的图像D(x,y),F(x,y)表示高斯滤波函数:

D(x,y)=S(x,y)*F(x,y);

步骤三:在对数域中,用原图像减去低通滤波后的图像,得到高频增强的图像G(x,y):

G(x,y)=S'(x,y)-log(D(x,y));

步骤四:对G(x,y)取反对数,得到增强后的图像R(x,y):

R(x,y)=exp(G(x,y));

步骤五:对R(x,y)做对比度增强,得到最终的结果图像。

二、程序

clear;

close all;

I=imread('youwutu.jpg'); %读入图像

R=I(:,:,1);% 取输入图像的R分量

[N1,M1]=size(R);

R0=double(R);% 对R分量进行数据转换,并对其取对数

Rlog=log(R0+1);

Rfft2=fft2(R0);% 对R分量进行二维傅里叶变换

sigma=250;% 形成高斯滤波函数

F = zeros(N1,M1);

for i=1:N1

for j=1:M1

F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));

end

end

F=F./(sum(F(:)));

Ffft=fft2(double(F)); %对高斯滤波函数进行二维傅里叶变换

DR0=Rfft2.*Ffft;  %对R分量与高斯滤波函数进行卷积运算

DR=ifft2(DR0);

DRdouble=double(DR); %在对数域中,用原图像减去低通滤波后的图像,得到高频增强图像

DRlog=log(DRdouble+1);

Rr=Rlog-DRlog;

EXPRr=exp(Rr);  %取反对数,得到增强后的图像分量

MIN = min(min(EXPRr));  %对增强后的图像进行对比度拉伸增强

MAX = max(max(EXPRr));

EXPRr = (EXPRr-MIN)/(MAX-MIN);

EXPRr=adapthisteq(EXPRr);

G=I(:,:,2);   % 取输入图像的G分量

[N1,M1]=size(G);

G0=double(G);  %对G分量进行数据转换,并对其取对数

Glog = log(G0+1);

Gfft2=fft2(G0);  %对G分量进行二维傅里叶变换

sigma=250;

for i=1:N1

for j=1:M1

F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));

 end

end

F = F./(sum(F(:)));

Ffft=fft2(double(F));  %对高斯滤波函数进行二维傅里叶变换

DG0=Gfft2.*Ffft;  %对高斯滤波函数进行二维傅里叶变换

DG=ifft2(DG0);

DGdouble=double(DG); %在对数域中,用原图像减去低通滤波后的图像,得到高频增强图像

DGlog=log(DGdouble+1);

Gg=Glog-DGlog;

EXPGg=exp(Gg); %取反对数,得到增强后的图像分量

MIN = min(min(EXPGg)); %对增强后的图像进行对比度拉伸增强

MAX = max(max(EXPGg));

EXPGg = (EXPGg-MIN)/(MAX-MIN); EXPGg=adapthisteq(EXPGg);

B=I(:,:,3);  %取输入图像的B分量

[N1,M1]=size(B);

B0=double(B);  %对B分量进行数据转换,并对其取对数

Blog=log(B0+1);

Bfft2=fft2(B0);  %对B分量进行二维傅里叶变换

sigma=250;  %形成高斯滤波函数

for i=1:N1

for j=1:M1

F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));

 end

end

F = F./(sum(F(:)));

Ffft=fft2(double(F)); %对高斯滤波函数进行二维傅里叶变换

DB0=Gfft2.*Ffft;    %对B分量与高斯滤波函数进行卷积运算

DB=ifft2(DB0);

DBdouble=double(DB); %在对数域中,用原图像减去低通滤波后的图像,得到高频增强图像

DBlog=log(DBdouble+1);

Bb=Blog-DBlog;

EXPBb=exp(Bb);

MIN = min(min(EXPBb));  %对增强后的图像进行对比度拉伸增强

MAX = max(max(EXPBb));

EXPBb = (EXPBb-MIN)/(MAX-MIN);

EXPBb=adapthisteq(EXPBb);

I0(:,:,1)=EXPRr;   %对增强后的图像R、G、B分量进行融合

I0(:,:,2)=EXPGg;

I0(:,:,3)=EXPBb;

subplot(121),imshow(I); title('Original image');

subplot(122),imshow(I0); title('Changee image');

三、图像结果

图2a 程序结果(youwutu)

图2b 程序结果(补充图1)

图2c 程序结果(补充图2)

四、结果分析

  通过实验结果可以看出,基于Retinex理论的去雾程序有一定的去雾能力。但是经过多幅图的测试后,出现了一些问题。比如在雾气较浓的情况下去雾能力一般(图2a),对于一些较浅的雾气去除还是很好的(图2b),在图2c中,处理后的图像的对比度、亮度、饱和度发生了一些变化,这也是不同之处。

五、实验反思

通过查阅相关资料,找到了此篇有关去雾的文章,文中提到的用高斯模板对原图做卷积等方法在课程中学过,理解起来较为容易。对于方法“在对数域中,用原图像减去低通滤波后的图像,得到高频增强的图像G(x,y)”,在钝化掩膜锐化方法中也有类似的相减步骤。使用过反对数这种方法,还是第一次学习到。通过学习这个基本的去雾程序,我意识到很多基本的方法都很好用,灵活运用能够解决类似的很多问题。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值