前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MATLAB基于直方图的图像去雾

MATLAB基于直方图的图像去雾

作者头像
巴山学长
发布2021-07-09 15:44:34
9260
发布2021-07-09 15:44:34
举报
文章被收录于专栏:巴山学长巴山学长

直方图是图像的一种统计表达形式,在一定程度上能够反映数学图像的概貌性描述,包括图像的灰度范围、灰度分布、整幅图像的亮度均值、阴暗对比度等,并可以此为基础进行分析来得出对图像进一步处理的重要依据。直方图均衡化也叫作直方图均匀化,就是把给定图像的直方图分布变换成均匀分布的直方图,是较为常用的灰度增强算法。直方图均衡化概括起来包括以下三个主要步骤。

●预处理。输入图像,计算该图像直方图。

●灰度变换表。根据输入图像的直方图计算灰度值变换表。

●查表变换。执行变换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三层通道分别进行直方图均衡化,再整合到新的图像的方式来进行。

代码语言:javascript
复制
%全局直方图
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三层通道分别进行局部直方图均衡化,再整合到新的图像的方式来进行。

代码语言:javascript
复制
%局部直方图
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算法进行处理,再整合到新的图像的方式来进行。

代码语言:javascript
复制
%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爱好者和使用者前来交流!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 巴山学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
灰盒安全测试
腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档