第五章 图像复原与重建
目录
1. 实现自适应均值滤波,并和算术均值滤波的结果做对比
程序代码:
% 自适应均值滤波
clear
X=imread('pic.jpg');
% 把原图转为灰度图
X0=double(rgb2gray(X));
% 获取图像大小
[width,height]=size(X0);
% 显示原灰度图
subplot(2,2,1)
imshow(uint8(X0));
title('原灰度图')
% 加高斯白噪声
wgnoise=wgn(width,height,20);
X1=X0+wgnoise;
subplot(2,2,2)
imshow(uint8(X1));
title('加高斯噪声后的灰度图')
% 均值滤波
a=1/9*ones(3,3);
X2=imfilter(X1,a);
subplot(2,2,3)
imshow(uint8(X2));
title('均值滤波后的灰度图')
% 自适应均值滤波
nstd=std2(X1(1:10,1:10));
lstd=stdfilt(X1);
X3=zeros(width,height);
for i=1:width
for j=1:height
X3(i,j)=X1(i,j)-(X1(i,j)-X2(i,j))*nstd^2/lstd(i,j)^2;
end
end
subplot(2,2,4)
imshow(uint8(X3));
title('自适应均值滤波后的灰度图')
输出结果:
2. 实现自适应中值滤波,并和中值滤波的结果做对比
程序代码:
% 这里的自适应中值滤波循环比较多,matlab的循环比较卡,这里每次都做了零延拓,也可以等到框的大小变化的才做,或者只有靠近边缘的像素才做,做实验懒得整了。
% 自适应中值滤波
clear
X=imread('pic.jpg');
% 把原图转为灰度图
X0=double(rgb2gray(X));
% 获取图像大小
[width,height]=size(X0);
% 显示原灰度图
subplot(2,2,1)
imshow(uint8(X0));
title('原灰度图')
% 加脉冲噪声
X1=X0;
for m=1:1000
X1(ceil(rand*256),ceil(rand*256))=0;
end
for m=1:1000
X1(ceil(rand*256),ceil(rand*256))=255;
end
% 显示加噪灰度图
subplot(2,2,2)
imshow(uint8(X1));
title('加脉冲噪声灰度图')
% 中值滤波
m=5;
X2=medfilt2(X1,[m,m]);
subplot(2,2,3)
imshow(uint8(X2));
title([num2str(m),'*',num2str(m),'中值滤波'])
% 自适应中值滤波
Smax=11;
Y=zeros(width,height);
for i=1:width
for j=1:height
n=3;
n0=n;
while 1
% 边界零延拓
X3=zeros(width+n-1,height+n-1);
X3((1+floor(n/2)):(width+floor(n/2)),(1+floor(n/2)):(height+floor(n/2)))=X1(1:width,1:height);
% 自适应判断
if n<=Smax
S=X3(i:(i+n-1),j:(j+n-1));
zmin=min(min(S));
zmax=max(max(S));
so=sort(S);
zmed=so(round(n/2));
zxy=X3(i+floor(n/2),j+floor(n/2));
if ((zmed-zmin)>0 && (zmed-zmax)<0)
if (