matlab实现中值滤波去除脉冲噪声matlab小程序(图像处理)2010-04-1612:58:44阅读8评论0字号:大中小
实验原理:中值滤波器是将领域内像素灰度的中值代替该像素的值,对处理脉冲噪声(椒盐噪声)非常有效。
为了对一幅图像上的某个点进行中值滤波处理,必须先将掩模内欲求的像素及其领域的像素值排序,确定出中值,主要功能是使拥有不同灰度的点看起来更接近于它的邻近值。
程序说明:函数名为mid(pic_name,s)的函数,其中参数pic_name为读入的图像,s为掩模矩阵的边长,由用户自行决定。
实验说明:随着掩模矩阵的变大,我们可以看到脉冲噪声去除得更加理想,但同时图像会变得更模糊,因为各点像素与其邻域更为接近,因此,进行中值滤波时选择一个适合的掩模矩阵十分重要。
另外,我们看到图像的边界处出现了黑色的斑点,这是由于我采用了0来直译边界,这种影响可用镜像反射方式对称地沿其边界扩展来减弱。
另附:其实本实验可以完全由matlab中的函数median或medfilt2简单实现,此处写出内部处理过程,主要是为了让大家理解中值滤波的具体处理过程。
程序源代码:
function mid(pic_name,s)
close all;
s=double(s);
X=imread(pic_name);
Y1=imnoise(X,'salt&pepper',0.2);%对读入的图像加脉冲噪声
figure;
imshow(uint8(Y1));
Y1=double(Y1);
[m,n]=size(X);
s2=round(s/2);
s3=round(s*s/2);%中值像素点的位置
Y2=zeros(s,1);
%边界填充,用零延拓
Z1=zeros(s2-1,n+(s2-1)*2);
Z2=zeros(m,s2-1);
Y3=[Z1;Z2,Y1,Z2;Z1];
%对延拓后的图像进行中值滤波
for k1=s2:m-s2+1
for k2=s2:n-s2+1
%取出以其中上个像素点为中心的领域矩阵Y2=Y3(k1-s2+1:k1+s2-1,k2-s2+1:k2+s2-1);
%对取出的矩阵进行排序
Y2=sort(Y2(1:s*s));
Y3(k1,k2)=Y2(s3);%取其中值end
end
%取出处理后图像的有效部分,舍去零填充的部分
Y1=Y3(s2:m-s2+1,s2:n-s2+1);
figure;
imshow(uint8(Y1));
clear all;。