首先:这个程序只能处理灰度图--即便是你用图像处理软件变成黑白的也没用,必须用Matlab把任意一个图像变成灰度图,所以加一句img0=rgb2gray(imread('lena.jpg'));
其次,mat2gray()的参数要求是double,所以要加一个double函数把里面的参数转换成img=mat2gray(double(img0));
程序代码如下,亲测可用
close all;
clc;
%本程序只能处理灰度图
img0=rgb2gray(imread('lena.jpg'));
imshow(img0,[]);
img=mat2gray(double(img0));%读取图片文件中的数据,
[m n]=size(img);%转化为二维数组?
img=imnoise(img,'salt & pepper',0.1); %加入椒盐噪声
imshow(img,[]);
Nmax=10; %确定最大的滤波半径
%下面是边界扩展,图像上下左右各增加Nmax像素。
imgn=zeros(m+2*Nmax+1,n+2*Nmax+1);%填充0矩阵?
imgn(Nmax+1:m+Nmax,Nmax+1:n+Nmax)=img;
imgn(1:Nmax,Nmax+1:n+Nmax)=img(1:Nmax,1:n); %扩展上边界
imgn(1:m+Nmax,n+Nmax+1:n+2*Nmax+1)=imgn(1:m+Nmax,n:n+Nmax); %扩展右边界
imgn(m+Nmax+1:m+2*Nmax+1,Nmax+1:n+2*Nmax+1)=imgn(m:m+Nmax,Nmax+1:n+2*Nmax+1); %扩展下边界
imgn(1:m+2*Nmax+1,1:Nmax)=imgn(1:m+2*Nmax+1,Nmax+1:2*Nmax); %扩展左边界
re=imgn;
for i=Nmax+1:m+Nmax
for j=Nmax+1:n+Nmax
r=1; %初始滤波半径
while r~=Nmax
W=imgn(i-r:i+r,j-r:j+r);
W=sort(W);
Imin=min(W(:));
Imax=max(W(:));
Imed=W(uint8((2*r+1)^2/2));
if Imin
else
r=r+1; %否则扩大窗口,继续判断
end
end
if Imin
else %否则输出邻域中值
re(i,j)=Imed;
end
end
end
figure;
imshow(re(Nmax+1:m+Nmax,Nmax+1:n+Nmax),[]);