MATLAB典型去雾算法代码 - 图文
更新时间:2023-03-15 21:12:01 阅读量: 教育文库 文档下载
- 图像去雾算法matlab推荐度:
- 相关推荐
本节主要介绍基于Retinex理论的雾霭天气图像增强及其实现。 1.3.1 Rentinex理论
Retinex(视网膜“Retina”和大脑皮层“Cortex”的缩写)理论是一种建立在科学实验和科学分析基础上的基于人类视觉系统(Human Visual System)的图像增强理论。该算法的基本原理模型最早是由Edwin Land(埃德温?兰德)于1971年提出的一种被称为的色彩的理论,并在颜色恒常性的基础上提出的一种图像增强方法。Retinex 理论的基本内容是物体的颜色是由物体对长波(红)、中波(绿)和短波(蓝)光线的反射能力决定的,而不是由反射光强度的绝对值决定的;物体的色彩不受光照非均性的影响,具有一致性,即Retinex理论是以色感一致性(颜色恒常性)为基础的。
根据Edwin Land提出的理论,一幅给定的图像S(x,y)分解成两幅不同的图像:反射物体图像R(x,y)和入射光图像L(x,y),其原理示意图如图8.3-1所示。
图 1.3-1 Retinex理论示意图
对于观察图像S中的每个点(x,y),用公式可以表示为:
S(x,y)=R(x,y)×L(x,y) (1.3.1)
实际上,Retinex理论就是通过图像S来得到物体的反射性质R,也就是去除了入射光L的性质从而得到物体原本该有的样子。 1.3.2 基于Retinex理论的图像增强的基本步骤
步骤一: 利用取对数的方法将照射光分量和反射光分量分离,即:
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)做对比度增强,得到最终的结果图像。
1.3.3 多尺度Retinex算法
D Jobson等人提出了多尺度Retinex算法,多尺度算法的基本公式是:
Ri(x,y)??Wn?log?Ii(x,y)??log?Fn(x,y)?Ii(x,y)??
n?1N 其中,R是Retinex的输出,i?R,G,B表示3个颜色谱带,F(x,y)是(ix,y)高斯滤波函数,Wn表示尺度的权重因子,N表示使用尺度的个数,N=3,表示彩色图像,i?R,G,B。N=1,表示灰度图像。从公式中可以看出:MSR算法的特点是能产生包含色调再现和动态范围压缩这两个特性的输出图像。
在MSR算法的增强过程中,图像可能会因为增加了噪声而造成对图像中的局部区域色彩失真,使得物体的真正颜色效果不能很好的显现出来,从而影响了整体视觉效果。为了弥补这个缺点,一般情况下会应用带色彩恢复因子C的多尺度算法(MSRCR)来解决。带色彩恢复因子C的多尺度算法(MSRCR)]是在多个固定尺度的基础上考虑色彩不失真恢复的结果,在多尺度Retinex算法过程中,我们通过引入一个色彩因子C来弥补由于图像局部区域对比度增强而导致图像颜色失真的缺陷,通常情况下所引入的色彩恢复因子C的表达式为
RMSRCRi(x,y)?Ci(x,y)RMSRi(x,y)
Ci(x,y)?f[Ii(x,y)]?f[Ii(x,y)?Nj?1Ij(x,y)]
其中,Ci表示第个通道的色彩恢复系数,它的作用是用来调节3个通道颜色的比例,f(?)表示的是颜色空间的映射函数。带色彩恢复的多尺度Retinex算法(MSRCR)通过色彩恢复因子C这个系数来调整原始图像中三个颜色通道之间的比例关系,从而通过把相对有点暗的区域的信息凸显出来,以达到消除图像色彩失真的缺陷。处理后的图像局域对比度提高,而且它的亮度与真实的场景很相似,图像在人们视觉感知下显得极其逼真。因此,MSR算法具有较好的颜色再现性、亮度恒常性以及动态范围压缩等特性。 1.3.4 例程精讲
例程1.3.1是基于Retinex理论进行雾霭天气增强的MATLAB程序,读者可结合程序及注释对基于Retinex理论进行雾霭天气增强的基本原理进行进一步分析,该程序的运行结果如图1.3-2所示。 例程1.3.1
****************************************************************************************
clear;
close all;
% 读入图像
I=imread('wu.png'); % 取输入图像的R分量 R=I(:,:,1);
[N1,M1]=size(R);
% 对R分量进行数据转换,并对其取对数 R0=double(R); Rlog=log(R0+1);
% 对R分量进行二维傅里叶变换 Rfft2=fft2(R0);
% 形成高斯滤波函数 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));
% 对R分量与高斯滤波函数进行卷积运算 DR0=Rfft2.*Ffft; 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分量 G=I(:,:,2);
[N1,M1]=size(G);
% 对G分量进行数据转换,并对其取对数 G0=double(G); Glog=log(G0+1);
% 对G分量进行二维傅里叶变换 Gfft2=fft2(G0);
% 形成高斯滤波函数 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));
% 对G分量与高斯滤波函数进行卷积运算 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分量 B=I(:,:,3);
[N1,M1]=size(B);
% 对B分量进行数据转换,并对其取对数 B0=double(B); Blog=log(B0+1);
% 对B分量进行二维傅里叶变换 Bfft2=fft2(B0);
% 形成高斯滤波函数 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));
% 对B分量与高斯滤波函数进行卷积运算 DB0=Gfft2.*Ffft; 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); % 对增强后的图像R、G、B分量进行融合 I0(:,:,1)=EXPRr; I0(:,:,2)=EXPGg; I0(:,:,3)=EXPBb;
% 显示运行结果
subplot(121),imshow(I); subplot(122),imshow(I0);
****************************************************************************************
1.3-2 例程1.3.1的运行结果
例程1.3.2是基于Retinex理论进行雾霭天气增强的MATLAB程序,读者可结合程序及注释对基于Retinex理论进行雾霭天气增强的基本原理进行进一步分析,该程序的运行结果如图1.3-3所示。 例程1.3.2
**************************************************************************************** clear;
close all;
I=imread('wu.png');
% 分别取输入图像的R、G、B三个分量,并将其转换为双精度型 R=I(:,:,1); G=I(:,:,2); B=I(:,:,3); R0=double(R); G0=double(G); B0=double(B);
[N1,M1]=size(R);
% 对R分量进行对数变换 Rlog=log(R0+1); % 对R分量进行二维傅里叶变换 Rfft2=fft2(R0);
% 形成高斯滤波函数(sigma=128)
sigma=128; 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));
% 对R分量与高斯滤波函数进行卷积运算
DR0=Rfft2.*Ffft; DR=ifft2(DR0);
% 在对数域中,用原图像减去低通滤波后的图像,得到高频增强的图像
DRdouble=double(DR); DRlog=log(DRdouble+1); Rr0=Rlog-DRlog;
% 形成高斯滤波函数(sigma=256)
sigma=256; 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));
% 对R分量与高斯滤波函数进行卷积运算
DR0=Rfft2.*Ffft; DR=ifft2(DR0);
% 在对数域中,用原图像减去低通滤波后的图像,得到高频增强的图像
DRdouble=double(DR); DRlog=log(DRdouble+1); Rr1=Rlog-DRlog;
% 形成高斯滤波函数(sigma=512)
sigma=512; 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));
% 对R分量与高斯滤波函数进行卷积运算
DR0=Rfft2.*Ffft; DR=ifft2(DR0);
% 在对数域中,用原图像减去低通滤波后的图像,得到高频增强的图像
DRdouble=double(DR); DRlog=log(DRdouble+1); Rr2=Rlog-DRlog;
% 对上述三次增强得到的图像取均值作为最终增强的图像
Rr=(1/3)*(Rr0+Rr1+Rr2);
% 定义色彩恢复因子C
a=125;
II=imadd(R0,G0); II=imadd(II,B0); Ir=immultiply(R0,a); C=imdivide(Ir,II); C=log(C+1);
% 将增强后的R分量乘以色彩恢复因子,并对其进行反对数变换 Rr=immultiply(C,Rr); EXPRr=exp(Rr);
% 对增强后的R分量进行灰度拉伸 MIN = min(min(EXPRr)); MAX = max(max(EXPRr));
EXPRr = (EXPRr-MIN)/(MAX-MIN); EXPRr=adapthisteq(EXPRr);
[N1,M1]=size(G);
% 对G分量进行处理,步骤与对R分量处理的步骤相同,请读者仿照R分量处理的步骤进行理解。 G0=double(G); Glog=log(G0+1);
Gfft2=fft2(G0); sigma=128; 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));
DG0=Gfft2.*Ffft; DG=ifft2(DG0);
DGdouble=double(DG); DGlog=log(DGdouble+1); Gg0=Glog-DGlog;
sigma=256;
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));
DG0=Gfft2.*Ffft;
DG=ifft2(DG0);
DGdouble=double(DG); DGlog=log(DGdouble+1); Gg1=Glog-DGlog;
sigma=512;
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));
DG0=Gfft2.*Ffft; DG=ifft2(DG0);
DGdouble=double(DG); DGlog=log(DGdouble+1); Gg2=Glog-DGlog;
Gg=(1/3)*(Gg0+Gg1+Gg2); a=125;
II=imadd(R0,G0); II=imadd(II,B0); Ir=immultiply(R0,a); C=imdivide(Ir,II); C=log(C+1);
Gg=immultiply(C,Gg);
EXPGg=exp(Gg);
MIN = min(min(EXPGg)); MAX = max(max(EXPGg));
EXPGg = (EXPGg-MIN)/(MAX-MIN);
EXPGg=adapthisteq(EXPGg);
% 对B分量进行处理,步骤与对R分量处理的步骤相同,请读者仿照R分量处理的步骤进行理解。 [N1,M1]=size(B);
B0=double(B); Blog=log(B0+1);
Bfft2=fft2(B0); sigma=128;
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));
DB0=Bfft2.*Ffft; DB=ifft2(DB0);
DBdouble=double(DB); DBlog=log(DBdouble+1); Bb0=Blog-DBlog;
sigma=256;
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));
DB0=Bfft2.*Ffft; DB=ifft2(DB0);
DBdouble=double(DB);
DBlog=log(DBdouble+1); Bb1=Blog-DBlog;
sigma=512;
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));
DB0=Rfft2.*Ffft; DB=ifft2(DB0);
DBdouble=double(DB); DBlog=log(DBdouble+1); Bb2=Blog-DBlog;
Bb=(1/3)*(Bb0+Bb1+Bb2); a=125;
II=imadd(R0,G0); II=imadd(II,B0); Ir=immultiply(R0,a); C=imdivide(Ir,II); C=log(C+1);
Bb=immultiply(C,Bb); EXPBb=exp(Bb);
MIN = min(min(EXPBb)); MAX = max(max(EXPBb));
EXPBb = (EXPBb-MIN)/(MAX-MIN); EXPBb=adapthisteq(EXPBb);
% 对增强后的图像R、G、B分量进行融合
I0(:,:,1)=EXPRr; I0(:,:,2)=EXPGg; I0(:,:,3)=EXPBb;
% 显示运行结果
subplot(121),imshow(I); subplot(122),imshow(I0);
****************************************************************************************
1.3-3 例程1.3.2的运行结果
正在阅读:
MATLAB典型去雾算法代码 - 图文03-15
Unit3《Myweekendplan》ALet&39;slearn教学设计05-15
2017年8月7日晚至8日凌晨,甘肃省舟曲县发生特大泥石流灾害,造成02-08
CWDM是什么11-09
社会工作真题大合集(社会工作原理311和社会工作实务427综合覆盖05-06
一个恐怖的梦作文400字06-19
2012届上海市高三二模英语试卷 - 阅读AB篇 - 图文11-25
2010高考词组之完全总结05-04
小学生运动会加油稿02-07
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 算法
- 典型
- 代码
- 图文
- MATLAB