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算法

  D Jobson等人提出了多尺度Retinex算法,多尺度算法的基本公式是:

  其中,

是Retinex的输出,

表示3个颜色谱带,

是高斯滤波函数,

表示尺度的权重因子,

表示使用尺度的个数,

=3,表示彩色图像,

=1,表示灰度图像。从公式中可以看出:MSR算法的特点是能产生包含色调再现和动态范围压缩这两个特性的输出图像。

 在MSR算法的增强过程中,图像可能会因为增加了噪声而造成对图像中的局部区域色彩失真,使得物体的真正颜色效果不能很好的显现出来,从而影响了整体视觉效果。为了弥补这个缺点,一般情况下会应用带色彩恢复因子C的多尺度算法(MSRCR)来解决。带色彩恢复因子C的多尺度算法(MSRCR)]是在多个固定尺度的基础上考虑色彩不失真恢复的结果,在多尺度Retinex算法过程中,我们通过引入一个色彩因子C来弥补由于图像局部区域对比度增强而导致图像颜色失真的缺陷,通常情况下所引入的色彩恢复因子C的表达式为

其中,

表示第个通道的色彩恢复系数,它的作用是用来调节3个通道颜色的比例,

表示的是颜色空间的映射函数。带色彩恢复的多尺度Retinex算法(MSRCR)通过色彩恢复因子C这个系数来调整原始图像中三个颜色通道之间的比例关系,从而通过把相对有点暗的区域的信息凸显出来,以达到消除图像色彩失真的缺陷。处理后的图像局域对比度提高,而且它的亮度与真实的场景很相似,图像在人们视觉感知下显得极其逼真。因此,MSR算法具有较好的颜色再现性、亮度恒常性以及动态范围压缩等特性。

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: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);

****************************************************************************************

图-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: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);

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);

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 图像处理】 guide 图像去雾系统

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

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

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

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

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

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

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

  5. 基于MATLAB的图像去雾GUI系统(集成4种去雾算法)

    00 目录 应用背景 去雾算法理论 MATLAB程序实现 源码获取 01 应用背景 由于大气中存在灰尘.烟雾.薄雾和其他漂浮颗粒物,因此大气中拍摄的图像通常会出现颜色失真.模糊.对比度低等问题,而模糊 ...

  6. 图像去雾(二)Retinex图像增强算法

    前一段时间研究了一下图像增强算法,发现Retinex理论在彩色图像增强.图像去雾.彩色图像恢复方面拥有很好的效果,下面介绍一下我对该算法的理解. Retinex理论 Retinex理论始于Land和M ...

  7. 【计算机视觉课程设计】基于暗通道先验单幅图像去雾算法的实现(MATLAB)

    声明:原创内容,创作不易,欢迎点赞收藏~ 摘    要 随着信息化时代的到来,计算机视觉得以迅速发展,在社会生活中的各个领域发挥了重要作用.然而,近年来大气污染逐渐加重,雾霾天气出现的频率越来越高,导 ...

  8. MATLAB图像去雾处理系统

    MATLAB图像去雾处理系统 设计目的 由于大气的散射作用,照相机接收到景物反射过来的光线经过了衰减.雾天的大气退化图像具有对比度低.景物不清晰的特点,给交通系统及户外视觉系统的应用带来严重的影响.. ...

  9. matlab图像去雾实现

    目录 一.课题意义 1 (一)研究意义 1 (二)研究现状 1 二.相关知识 4 (一)系统功能及简介: 4 (二)用到的知识 5 三.系统设计与实现 5 (一)实现条件 5 硬件条件:计算机 5 软 ...

最新文章

  1. Nginx会话保持之nginx-sticky-module模块
  2. LeetCode初级算法(数组)解答
  3. git报错fatal: HTTP request failed
  4. java todo error_Java全局异常处理(TODO)
  5. 【数字信号处理】基于matlab GUI频谱分析仪【含Matlab源码 932期】
  6. 数据结构之红黑树插入详解
  7. 反三角函数的积分公式
  8. Java基础视频教程(最适合初学者入门)
  9. watir学习系列--Watir API介绍
  10. exchange 服务器设置自动答复,Exchange自动回复设置配置
  11. 想了解直播系统开发用什么语言?
  12. 遥想大肠包小肠----python装饰器乱弹
  13. 04. 基本数据类型 - list,tuple
  14. filetransferdmg魅族下载_filetransfer.dmg魅族下载
  15. Django期末考试复习
  16. python 存储字典_python 字典存储
  17. 道一HTTP测试工具功能升级
  18. 赵本山小品之跟紧急集合似的铃声 赵本山小品之跟紧急集合似的...
  19. python爬取mblock的图片素材
  20. 【重磅】2021年互联网大厂职级对应薪资一览表

热门文章

  1. androidstudio使用Svn忽略文件
  2. 通过Is夹角来实现MTPA和FW
  3. springboot源码 红色J_通达信主图指标源码之,启爆点
  4. 华为IE讲师:直通华为HCNA课程实战第一部分-安德-专题视频课程
  5. 健康上报系统springboot+vue+wx
  6. matlab平均值消噪声
  7. matlab获取全局变量的值_MATLAB中搜索、查询和全局变量的用法(摘录)
  8. 大数据同步工具Canal
  9. C#根据IP地址和子网掩码计算广播地址
  10. 宽带网速测试皮肤软件,【问题求助】这个网速测量皮肤测量的网速不准哪大神知道原因?...