基于MATLAB retinex的图像去雾系统
本文主要介绍基于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是基于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);
****************************************************************************************
基于MATLAB retinex的图像去雾系统相关推荐
- MATLAB retinex的图像去雾系统
MATLAB retinex的图像去雾系统 本文主要介绍基于Retinex理论的雾霭天气图像增强及其实现.并通过编写两个程序来实现图像的去雾功能. 1 Rentinex理论 Retinex(视网膜&q ...
- 基于Matlab暗通道图像去雾处理
基于Matlab暗通道图像去雾处理 一.简介 何恺明的暗通道先验( dark channel prior)去雾算法是CV界去雾领域很有名的算法,关于该算法的论文"Single lmage H ...
- 基于MATLAB的图像去雾系统
基于MATLAB的图像去雾系统 (一)图像去雾基础原理 1.雾霭的形成机理 雾实际上是由悬浮颗粒在大气中的微小液滴构成的气溶胶,常呈现乳白色,其底部位于地球表面,所以也可以看作是接近地面的云.霭其实跟 ...
- 【第 01 章 基于直方图优化的图像去雾技术-全套系统MATLAB智能驾驶深度学习】
毋庸置疑的是,在汽车智能技术.汽车新能源技术.汽车电子这个群雄逐鹿的赛道.智能驾驶技术的要求也在不断的提升. 智能车辆教学平台.智能网联教学平台.汽车电子教学设备.在环仿真系统,目前主流的系统有很多, ...
- 【matlab 图像处理】 guide 图像去雾系统
matlab guide 快速入门 matlab GUI为用户图形化界面,可以使用guide命令进入图形化编辑界面 回车弹出GUIDE 快速入门,可以选择所需要的模板进行编辑,默认为Blank GUI ...
- 【MATLAB图像处理实用案例详解(1)】—— 基于直方图优化的图像去雾技术
目录 一.背景意义 二.理论基础 2.1 空域图像増强 2.2 直方图均衡化 三.方法选择 3.1 全局直方图算法 3.2 局部直方图算法 3.3 Retinex算法 四.效果演示 五.完整代码 一. ...
- 一种基于卷积神经网络的图像去雾研究-含matlab代码
目录 一.绪论 二.去雾卷积网络 2.1 特征提取 2.2 多尺度映射 2.3 局部均值 2.4 非线性回归 三.实验与分析 四.Matlab代码获取 一.绪论 雾是一种常见的大气现象,空气中悬浮的水 ...
- 基于Vision Transformer的图像去雾算法研究与实现(附源码)
基于Vision Transformer的图像去雾算法研究与实现 0. 服务器性能简单监控 \LOG_USE_CPU_MEMORY\文件夹下的use_memory.py文件可以实时输出CPU使用率以及 ...
- 水下图像色彩还原(基于可见光衰减及图像去雾算法)
参考源 参考论文:UnderwaterHazeLines_BMVC2017 Github项目地址:https://github.com/danaberman/underwater-hl.git 对论文 ...
- 毕业设计-基于深度学习的图像去雾算法
目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言
最新文章
- 如何设计电桥传感器驱动电路?
- 马斯克放的卫星被曝3%已成太空垃圾,占资源位置,最坏还能“锁死”地球人...
- Linux文件目录结构2
- 趣链 BitXHub跨链平台 (9)跨链事务
- 差分能量分析介绍(二)
- Struts DispatchAction
- tkmybatis 子查询_日均20亿流量:携程机票查询系统的架构升级
- Cache替换算法:LRU与LFU的区别
- [转] 测试员,敢问路在何方(来自微软工程师)
- lucene的基础入门
- 计算机打印机无法打印机驱动,win7安装打印机出现无法找到打印机驱动程序包...
- mysql codesmith_CodeSmith MySql
- 写出ch为英语字母的c语言表达式,变量英文,编程 变量 定义的英语
- 逃离北上广的成本越来越高了
- DataX工具的基本使用
- 剖析Linux的守护神
- 小哈智能机器人的功能_小哈智能教育机器人H2产品外观参数说明
- 如何区分2G/3G/4G基站
- 【自动驾驶】Frenet坐标系与Cartesian坐标系(二)
- yield 跟 yield * 的区别
热门文章
- Java获取文本文件编码
- python做生物信息学分析_Python从零开始第五章生物信息学①提取差异基因
- 开源单点登录系统CAS
- Mac 安装的虚拟机win10系统,设置拥有各自的桌面
- 如何绕过mac地址过滤_如何通过路由器来过滤无线MAC地址
- 2022年信息安全工程师考试知识点:操作系统安全
- 向日葵显示无法连接到服务器,请修复电信卡使用向日葵远程无法连接服务问题!!!...
- 浙大翁凯老师Java课堂学习记录(第三周)
- VS+Qt应用开发-设置软件图标
- oracle库怎么样查询gp数据库,GP数据库分布键查询