先上M文件:
function d=midfilt(x) %x是需要滤波的图像
p=length(x); %输入图像是p×p的,且p>3
x1=double(x);
x2=x1;
for i=1:p-2
for j=1:p-2
c=x1(i:i+2,j:j+2); %取出x1中从(i,j)开始的3行3列元素,即模板(3×3的)
e=c(1,:); %是c矩阵的第一行
for u=2:3
e=[e,c(u,:)]; %将c矩阵变为一个行矩阵
end
mm=median(e); %mm是中值
x2(i+1,j+1)=mm; %将模板各元素的中值赋给模板中心位置的元素
end
end
aa=[x1(1,1) x1(1,1) x1(1,1) x1(1,1) x1(1,2) x1(1,2) x1(2,1) x1(2,1) x1(2,2)]; %4个顶点
bb=[x1(1,p) x1(1,p) x1(1,p) x1(1,p) x1(2,p) x1(2,p) x1(1,p-1) x1(1,p-1) x1(2,p-2)];
cc=[x1(p,1) x1(p,1) x1(p,1) x1(p,1) x1(p,2) x1(p,2) x1(p-1,1) x1(p-1,1) x1(p-1,2)];
dd=[x1(p,p) x1(p,p) x1(p,p) x1(p,p) x1(p-1,p) x1(p-1,p) x1(p,p-1) x1(p,p-1) x1(p-1,p-1)];
x2(1,1)=median(aa);
x2(1,p)=median(bb);
x2(p,1)=median(cc);
x2(p,p)=median(dd);
for m=1:p-2 %上边
g=x1(1:2,m:m+2);
h=g(1,:);
h=[h,h,g(2,:)];
gh=median(h);
x2(1,m+1)=gh;
end
for n=1:p-2 %下边
k=x1(p-1:p,n:n+2);
l=k(1,:);
l=[l,k(2,:),k(2,:)];
kl=median(l);
x2(p,n+1)=kl;
end
for o=1:p-2 %左边
q=x1(o:o+2,1:2);
r=q(:,1);
r=[r;r;q(:,2)];
qr=median(r);
x2(o+1,1)=qr;
end
for s=1:p-2 %右边
t=x1(s:s+2,p-1:p);
u=[t(:,2);t(:,2);t(:,1)];
tu=median(u);
x2(s+1,p)=tu;
end
d=uint8(x2);
以左上顶点为例 拓展元素赋值如下:
|x1(1,1)|x1(1,1) |x1(1,2) |
|x1(1,1)|x1(1,1)|x1(1,2)|…..
|x1(2,1)|x1(2,1)|x1(2,2)|……
以上边为例 拓展元素赋值如下:
|x1(1,1) | x1(1,2)|x1(1,3) |x1(1,4) |……..
|x1(1,1)|x1(1,2)|x1(1,3)|x1(1,4)|……..
调用的图像矩阵必须是方阵。