MATLAB可视化实战系列(二十五)-MATLAB基于直方图的图像去雾
前言
直方图是图像的一种统计表达形式,在一定程度上能够反映数学图像的概貌性描述,包括图像的灰度范围、灰度分布、整幅图像的亮度均值、阴暗对比度等,并可以此为基础进行分析来得出对图像进一步处理的重要依据。直方图均衡化也叫作直方图均匀化,就是把给定图像的直方图分布变换成均匀分布的直方图,是较为常用的灰度增强算法。直方图均衡化概括起来包括以下三个主要步骤。
以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟!
MATLAB-30天带你从入门到精通
MATLAB深入理解高级教程(附源码)
tableau可视化数据分析高级教程
●预处理。输入图像,计算该图像直方图。
●灰度变换表。根据输入图像的直方图计算灰度值变换表。
●查表变换。执行变换x=H(x),表示对步骤1中得到的直方图使用步骤2得到的灰度值变换表进行查表变换操作,通过遍历整幅图像的每一个像元,将原始图像灰度值x放入变换表H(x)中,可得到变换后的新灰度值x'。
根据信息论的相关理论,我们可以知道图像经直方图均衡化后,将会包含更多的信息量,进而能突出某些图像特征。下面就为大家介绍三种常用的图像去雾方法。
1.全局直方图处理
通过函数imread读取RGB图像,并通过维数m*n*3的矩阵来表示。其中,维数m*n表示图像的行数、列数信息,维数3表示图像的R、G、B三层通道数据。因此,全局直方图处理通过对RGB图像的R、G、B三层通道分别进行直方图均衡化,再整合到新的图像的方式来进行。
%全局直方图
I=imread('photo1.jpg');
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
M=histeq(R);
N=histeq(G);
L=histeq(B);
E=cat(3,M,N,L);
subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(E);
全局直方图去雾处理对比
2.局部直方图处理
全局直方图均衡化增强只是将原图像的直方图进行了均衡化,未能有效保持原始图像的局部特征,容易出现色彩失真问题。通过选择固定尺寸的滑动窗口作用于原始图像来进行局部直方图处理,可以在一定程度上保持原始图像的局部特征,提高图像增强的效果。因此,局部直方图处理通过对RGB图像的R、G、B三层通道分别进行局部直方图均衡化,再整合到新的图像的方式来进行。
%局部直方图
I=imread('photo1.jpg');
x=mat2gray(I);
f=im2double(x);
w=4;
k=0.06;
M=mean2(f);
f1=x(:,:,1);
f2=x(:,:,2);
f3=x(:,:,3);
z1=colfilt(f1,[w w],'sliding',@std);
m1=colfilt(f1,[w w],'sliding',@mean);
z2=colfilt(f2,[w w],'sliding',@std);
m2=colfilt(f2,[w w],'sliding',@mean);
z3=colfilt(f3,[w w],'sliding',@std);
m3=colfilt(f3,[w w],'sliding',@mean);
A1=k*M./z1;
A2=k*M./z2;
A3=k*M./z3;
g1=A1.*(f1-m1)+m1;
g1=im2uint8(mat2gray(g1));
g2=A2.*(f2-m2)+m2;
g2=im2uint8(mat2gray(g2));
g3=A3.*(f3-m3)+m3;
g3=im2uint8(mat2gray(g3));
E=cat(3,g1,g2,g3);
subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(E);
局部直方图去雾处理对比
3.Retinex增强处理
为了进行对比,采取了Retinex 图像增强算法来进行对比,该算法可以平衡图像灰度动态范围压缩、图像增强和图像颜色恒常三个指标,能够实现对含雾图像的自适应性增强。因此,Retinex 增强处理通过对RGB图像的R、G、B三层通道分别应用Retinex算法进行处理,再整合到新的图像的方式来进行。
%Retinex增强
I=imread('photo1.jpg');
f=I;
%提取RGB通道
fr=f(:,:,1);
fg=f(:,:,2);
fb=f(:,:,3);
%数据类型归一化
mr=mat2gray(im2double(fr));
mg=mat2gray(im2double(fg));
mb=mat2gray(im2double(fb));
%定义标准差
aa=1000;
%定义模板大小
n=80;
%计算中心
n1=floor((n+1)/2);
for i=1:n
for j=1:n
%高斯函数
b(i,j)=exp(-((i-n1)^2+(j-n1)^2)/(4*aa))/(pi*aa);
end
end
%卷积滤波
nr1=imfilter(mr,b,'conv','replicate');
ng1=imfilter(mg,b,'conv','replicate');
nb1=imfilter(mb,b,'conv','replicate');
ur1=log(nr1);
ug1=log(ng1);
ub1=log(nb1);
tr1=log(mr);
tg1=log(mg);
tb1=log(mb);
yr1=(tr1-ur1)/3;
yg1=(tg1-ug1)/3;
yb1=(tb1-ub1)/3;
%定义标准差
bb=53;
%定义模板大小
x=31;
%计算中心
x1=floor((n+1)/2);
for i=1:n
for j=1:n
%高斯函数
a(i,j)=exp(-((i-n1)^2+(j-n1)^2)/(4*bb))/(6*pi*bb);
end
end
%卷积滤波
nr2=imfilter(mr,a,'conv','replicate');
ng2=imfilter(mg,a,'conv','replicate');
nb2=imfilter(mb,a,'conv','replicate');
ur2=log(nr2);
ug2=log(ng2);
ub2=log(nb2);
tr2=log(mr);
tg2=log(mg);
tb2=log(mb);
yr2=(tr2-ur2)/3;
yg2=(tg2-ug2)/3;
yb2=(tb2-ub2)/3;
%定义标准差
cc=13000;
%定义模板大小
l=501;
%计算中心
l1=floor((n+1)/2);
for i=1:n
for j=1:n
%高斯函数
e(i,j)=exp(-((i-n1)^2+(j-n1)^2)/(4*cc))/(4*pi*cc);
end
end
%卷积滤波
nr3=imfilter(mr,e,'conv','replicate');
ng3=imfilter(mg,e,'conv','replicate');
nb3=imfilter(mb,e,'conv','replicate');
ur3=log(nr3);
ug3=log(ng3);
ub3=log(nb3);
tr3=log(mr);
tg3=log(mg);
tb3=log(mb);
yr3=(tr3-ur3)/3;
yg3=(tg3-ug3)/3;
yb3=(tb3-ub3)/3;
dr=yr1+yr2+yr3;
dg=yg1+yg2+yg3;
db=yb1+yb2+yb3;
cr=im2uint8(dr);
cg=im2uint8(dg);
cb=im2uint8(db);
E=cat(3,cr,cg,cb);
%结果显示
subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(E);
Retinex算法去雾处理对比
以上就是今天介绍的三种不同图像去雾算法。其中,Retinex算法在使用时可针对图像对程序中定义的标准差与模板大小进行改动,以便于增强适用性,不同算法在不同照片中的效果也会有所不同。
MATLAB可视化实战系列(二十五)-MATLAB基于直方图的图像去雾相关推荐
- 手把手教用matlab做无人驾驶(二十五)--基于控制障碍函数的MPC(MPC-CBF)
这边博客主要完成论文的内容:Safety-Critical Model Predictive Control with Discrete-Time Control Barrier Function,论 ...
- Reflex WMS入门系列二十五:将叉车纳入系统进行管理
Reflex WMS入门系列二十五:将叉车纳入系统进行管理 据笔者所知,SAP WM 模块里是不对仓库里常用的叉车等仓库管理工具进行管理的.笔者发现,Reflex WMS系统则会在很多仓库部门日常操作 ...
- 无人驾驶汽车系统入门(二十五)——基于欧几里德聚类的激光雷达点云分割及ROS实现
无人驾驶汽车系统入门(二十五)--基于欧几里德聚类的激光雷达点云分割及ROS实现 上一篇文章中我们介绍了一种基于射线坡度阈值的地面分割方法,并且我们使用pcl_ros实现了一个简单的节点,在完成了点云 ...
- MATLAB可视化实战系列(四十)-基于MATLAB 自带手写数字集的CNN(LeNet5)手写数字识别-图像处理(附源代码)
一.前言 利用MATLAB实践MNIST手写数字识别,下载手写数据集的准备工作有些麻烦. 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! MATLAB-30 ...
- MATLAB可视化实战系列(四十二)-图像特征提取-使用低秩 SVD 进行图像压缩实例
使用低秩 SVD 的图像压缩 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! MATLAB-30天带你从入门到精通 MATLAB深入理解高级教程(附源码) ...
- MATLAB可视化实战系列(二十八)-贪心算法求快速平方根倒数算法中的“魔术数字”【含matlab源代码】
前言 快速平方根倒数算法(Fast InvSqrt)是一种快速计算平方根的倒数的算法,常用于向量标准化运算,在光照渲染中有重要应用.此算法最早可能是于90年代前期由SGI所发明,后来于1999年在&l ...
- MATLAB可视化实战系列(二十四)-三维可视化如何利用圆锥图显示向量场?
前言 在物理学中,我们学习了矢量,知道了磁力线等矢量图.如何画出优美的矢量场图呢?科学计算软件matlab可以很容易地绘制出矢量场图.下面跟随博主一起来看下matlab高级可视化内容,如何利用圆锥图显 ...
- MATLAB实战系列(十五)-在matlab中如何实现Octave工具包的全自动加载?
前言 俗话说,"工欲善其事必先利其器".想要高效地使用Octave,做好前期工作是相当有必要的.有的工具包安装后并不能被Octave自动使用,需要先加载才能使用.那么问题来了,要怎 ...
- MATLAB应用实战系列(四十三)-基于MATLAB的光伏并网系统仿真设计
前言 在Matlab中建立光伏电站接入系统模型,包括光伏发电逆变器及负荷模型等,仿真分析接入点处的电能质量,实现高品质并网运行. 文中涉及代码可参见matlab电力系统仿真-matlab光伏并网 以下 ...
最新文章
- 毫米波雷达基本技术与应用
- 自定义View实现Canvas炫酷效果
- JAVA架构师面试题and如何成为架构师
- Integer的==问题
- 跟我一起学.NetCore之日志(Log)模型核心
- Xuggler教程:转码和媒体修改
- 一个使用Logging Application Block的小问题[xgluxv]
- c语言序列化后只有四位小数,《C编程.高级C》4.序列化
- Lua基础(字符处理)
- Verdi的使用技巧总结
- 新品Demo —— ZStack Mini 超融合一体机
- 你所想要了解的美国人工智能专业
- SpringMVC(三) --------- SSM 整合开发案例
- 使用Docker搭建实验室共享GPU服务器
- mysql执行计划详解
- 电脑如何进入【安全模式】——杀毒访问清理文件很方便
- 【python】鞭炮快乐响,春联贴门上,祝福送到你身旁
- fastadmin 阿里云oss解决访问图片是下载
- 散论陈寅恪先生《对科学院的答复》
- javaweb简化的医院管理系统
热门文章
- CentOS7下pptp ***一键安装脚本
- 开的什么源?——第三篇:草根创业
- IO 模拟 1/2 Bias、1/4 Duty的 LCD 驱动
- PAT甲级1073 Scientific Notation:[C++题解]字符串处理、科学计数法
- robotframework安装包_Robot Framework零基础入门教程
- python 画图 线标注_Python画图的这几种方法,你学会了吗
- 关于epoll 水平触发在udp套接字上不生效问题的原因
- spring boot第二讲
- 计算机房电源解决方案,apcups电源小型机房电源解决方案
- c语言调用系统当前时间的函数,c语言获取系统当前时间的函数,求讲解?