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所示。


9bc9a49bf9bcaabf525c90b4d5e133ad.png


图 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理论的图像增强的基本步骤

9f01da50f20e8ba8718d14ee7ec1adf8.png

08b6152c1903a86288927219b14d5757.png

1.3.3 多尺度Retinex算法

6a512c25c9dcd15d6da7b885a50aa958.png

553713d18f4e57ed93a2a069d7f81956.png

例程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);
****************************************************************************************


7b013c27f693c17ed23e0208bf6cbf3a.png


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(:)));
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(:)));
% 对高斯滤波函数进行二维傅里叶变换
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;
 
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);
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);
****************************************************************************************


2844d145aa09bdaceea29b14631deeb2.png
1.3-3 例程1.3.2的运行结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值