MATLAB可视化实战系列(二十五)-MATLAB基于直方图的图像去雾
前言
直方图是图像的一种统计表达形式,在一定程度上能够反映数学图像的概貌性描述,包括图像的灰度范围、灰度分布、整幅图像的亮度均值、阴暗对比度等,并可以此为基础进行分析来得出对图像进一步处理的重要依据。直方图均衡化也叫作直方图均匀化,就是把给定图像的直方图分布变换成均匀分布的直方图,是较为常用的灰度增强算法。直方图均衡化概括起来包括以下三个主要步骤。
以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟!
●预处理。输入图像,计算该图像直方图。
●灰度变换表。根据输入图像的直方图计算灰度值变换表。
●查表变换。执行变换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算法在使用时可针对图像对程序中定义的标准差与模板大小进行改动,以便于增强适用性,不同算法在不同照片中的效果也会有所不同。
文章来源: wenyusuran.blog.csdn.net,作者:文宇肃然,版权归原作者所有,如需转载,请联系作者。
原文链接:wenyusuran.blog.csdn.net/article/details/119247114
- 点赞
- 收藏
- 关注作者
评论(0)