MATLAB 自编3*3中值滤波(含边缘)

先上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)|……..

注意

调用的图像矩阵必须是方阵。

你可能感兴趣的:(MATLAB)