本文主要介绍基于Retinex理论的雾霭天气图像增强及其实现。并通过编写两个程序来实现图像的去雾功能。

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 Retinex理论示意图

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

(1.3.1)

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

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)做对比度增强,得到最终的结果图像。

3 多尺度Retinex算法

4 例程精讲

例程1是基于Retinex理论进行雾霭天气增强的MATLAB程序,读者可结合程序及注释对基于Retinex理论进行雾霭天气增强的基本原理进行进一步分析,该程序的运行结果如图-2所示。

例程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:N1for j=1:M1F(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:N1for j=1:M1F(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:N1for j=1:M1F(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);
****************************************************************************************

图-2 例程1的运行结果

例程2是基于Retinex理论进行雾霭天气增强的MATLAB程序,读者可结合程序及注释对基于Retinex理论进行雾霭天气增强的基本原理进行进一步分析,该程序的运行结果如图-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:N1for j=1:M1F(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:N1for j=1:M1F(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:N1for j=1:M1F(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:N1for j=1:M1F(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:N1for j=1:M1F(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:N1for j=1:M1F(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);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:N1for j=1:M1F(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:N1for j=1:M1F(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:N1for j=1:M1F(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);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);
****************************************************************************************

图-3 例程2的运行结果

基于MATLAB retinex的图像去雾系统相关推荐

  1. MATLAB retinex的图像去雾系统

    MATLAB retinex的图像去雾系统 本文主要介绍基于Retinex理论的雾霭天气图像增强及其实现.并通过编写两个程序来实现图像的去雾功能. 1 Rentinex理论 Retinex(视网膜&q ...

  2. 基于Matlab暗通道图像去雾处理

    基于Matlab暗通道图像去雾处理 一.简介 何恺明的暗通道先验( dark channel prior)去雾算法是CV界去雾领域很有名的算法,关于该算法的论文"Single lmage H ...

  3. 基于MATLAB的图像去雾系统

    基于MATLAB的图像去雾系统 (一)图像去雾基础原理 1.雾霭的形成机理 雾实际上是由悬浮颗粒在大气中的微小液滴构成的气溶胶,常呈现乳白色,其底部位于地球表面,所以也可以看作是接近地面的云.霭其实跟 ...

  4. 【第 01 章 基于直方图优化的图像去雾技术-全套系统MATLAB智能驾驶深度学习】

    毋庸置疑的是,在汽车智能技术.汽车新能源技术.汽车电子这个群雄逐鹿的赛道.智能驾驶技术的要求也在不断的提升. 智能车辆教学平台.智能网联教学平台.汽车电子教学设备.在环仿真系统,目前主流的系统有很多, ...

  5. 【matlab 图像处理】 guide 图像去雾系统

    matlab guide 快速入门 matlab GUI为用户图形化界面,可以使用guide命令进入图形化编辑界面 回车弹出GUIDE 快速入门,可以选择所需要的模板进行编辑,默认为Blank GUI ...

  6. 【MATLAB图像处理实用案例详解(1)】—— 基于直方图优化的图像去雾技术

    目录 一.背景意义 二.理论基础 2.1 空域图像増强 2.2 直方图均衡化 三.方法选择 3.1 全局直方图算法 3.2 局部直方图算法 3.3 Retinex算法 四.效果演示 五.完整代码 一. ...

  7. 一种基于卷积神经网络的图像去雾研究-含matlab代码

    目录 一.绪论 二.去雾卷积网络 2.1 特征提取 2.2 多尺度映射 2.3 局部均值 2.4 非线性回归 三.实验与分析 四.Matlab代码获取 一.绪论 雾是一种常见的大气现象,空气中悬浮的水 ...

  8. 基于Vision Transformer的图像去雾算法研究与实现(附源码)

    基于Vision Transformer的图像去雾算法研究与实现 0. 服务器性能简单监控 \LOG_USE_CPU_MEMORY\文件夹下的use_memory.py文件可以实时输出CPU使用率以及 ...

  9. 水下图像色彩还原(基于可见光衰减及图像去雾算法)

    参考源 参考论文:UnderwaterHazeLines_BMVC2017 Github项目地址:https://github.com/danaberman/underwater-hl.git 对论文 ...

  10. 毕业设计-基于深度学习的图像去雾算法

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言

最新文章

  1. 如何设计电桥传感器驱动电路?
  2. 马斯克放的卫星被曝3%已成太空垃圾,占资源位置,最坏还能“锁死”地球人...
  3. Linux文件目录结构2
  4. 趣链 BitXHub跨链平台 (9)跨链事务
  5. 差分能量分析介绍(二)
  6. Struts DispatchAction
  7. tkmybatis 子查询_日均20亿流量:携程机票查询系统的架构升级
  8. Cache替换算法:LRU与LFU的区别
  9. [转] 测试员,敢问路在何方(来自微软工程师)
  10. lucene的基础入门
  11. 计算机打印机无法打印机驱动,win7安装打印机出现无法找到打印机驱动程序包...
  12. mysql codesmith_CodeSmith MySql
  13. 写出ch为英语字母的c语言表达式,变量英文,编程 变量 定义的英语
  14. 逃离北上广的成本越来越高了
  15. DataX工具的基本使用
  16. 剖析Linux的守护神
  17. 小哈智能机器人的功能_小哈智能教育机器人H2产品外观参数说明
  18. 如何区分2G/3G/4G基站
  19. 【自动驾驶】Frenet坐标系与Cartesian坐标系(二)
  20. yield 跟 yield * 的区别

热门文章

  1. Java获取文本文件编码
  2. python做生物信息学分析_Python从零开始第五章生物信息学①提取差异基因
  3. 开源单点登录系统CAS
  4. Mac 安装的虚拟机win10系统,设置拥有各自的桌面
  5. 如何绕过mac地址过滤_如何通过路由器来过滤无线MAC地址
  6. 2022年信息安全工程师考试知识点:操作系统安全
  7. 向日葵显示无法连接到服务器,请修复电信卡使用向日葵远程无法连接服务问题!!!...
  8. 浙大翁凯老师Java课堂学习记录(第三周)
  9. VS+Qt应用开发-设置软件图标
  10. oracle库怎么样查询gp数据库,GP数据库分布键查询