MATLAB-medfilt2函数的实现源代码

对中值滤波还不是很了解的朋友可以看下我之前写的文章:MATLAB-中值滤波原理、实现及应用,链接的这文章是我根据 《数字图像处理》许录平版 相关内容而写的,中值窗口有线状、正方形、十字形、X型、菱形以及圆形,窗口很丰富,但没有完完全全实现medfilt2函数的功能,而且边缘处理的算法都是统一的,便有了现在这篇文章

这篇文章主要涉及如何实现medfilt2函数,medfilt2的详细用法可以在MATLAB输入help medfilt2查看或者看:Matlab中消除图像噪声之中值滤波器:medfilt2

注:实际上处理效果与medfilt2函数有点小差别,对边缘的处理,我是使边缘处的像素点取最近值,而且对四个顶角的处理方法也不同。具体处理方法可以看上面链接的我写的那篇文章(有图解)或看下面的代码

代码 

 不过多解释,都有注释,不懂为何如此处理的请看:MATLAB-中值滤波原理、实现及应用

close all;clear;clc;

%仿medfilt2函数
%l、w分别为方形中值滤波窗口的行和列

l=3;w=3; %进行中值滤波的窗口大小

f=imread('cameraman.tif'); %读取图像
f=im2double(f);
fsap=imnoise(f,'salt & pepper',0.05); %加入椒盐噪声
[m,n]=size(f);
fmed=fsap;
S=l*w;
a=zeros(l,w);

%计算常用数值,简洁代码
if rem(l,2)==1 %窗口行数为奇数
    l1=(l-1)/2;
    l2=(l+1)/2;
else %窗口行数为偶数
    l1=l/2;
    l2=l1;
end

if rem(w,2)==1 %同上,此处为列数的情况
    w1=(w-1)/2;
    w2=(w+1)/2;
else
    w1=w/2;
    w2=w1;
end

for i=l2:m-l1
    for j=w2:n-w1
        for k=1:l
            for p=1:w
                a(k,p)=fsap(i+k-l2,j+p-w2); %取点
            end
        end
        a2=reshape(a,S,1); %排成一列,方便排序赋值
        a3=sort(a2); %排序
        if rem(S,2)==1 %奇数赋中值,偶数赋俩中间值的平均值
            fmed(i,j)=a3((S+1)/2); %赋中值
        else
            fmed(i,j)=(a3(S/2)+a3(S/2+1))/2;
        end
    end
end

%处理边缘处的像素点
for i=1:l1 %处理第l1列——倒数第l1列的第1——l1行、倒数第1——l1行的像素点
    for j=l1:n+1-l1
        fmed(i,j)=fmed(l2,j);
        fmed(m+1-i,j)=fmed(m-l1,j);
    end
end

for j=1:w1 %处理第w1行——倒数第w1行的第1——w1列、倒数第1——w1列的像素点
    for i=w1:m+1-w1
        fmed(i,j)=fmed(i,w2);
        fmed(i,n+1-j)=fmed(i,n-w1);
    end
end

%处理四个顶角
for i=1:l2-1
    for j=1:w2-1
        fmed(i,j)=fmed(l2,w2); %左上顶角
        fmed(i,n-w2+1+j)=fmed(l2,n-w2+1); %右上顶角
        fmed(m-l2+1+i,j)=fmed(m-l2+1,w2); %左下顶角
        fmed(m-l2+1+i,n-w2+1+j)=fmed(m-l2+1,n-w2+1); %右下顶角
    end
end

%图像对比
subplot(131),imshow(fsap),title('加噪图像')
subplot(132),imshow(fmed),title(sprintf('使用%d*%d方形窗口进行中值滤波',l,w))
subplot(133),fimg=medfilt2(fsap,[l w]);imshow(fimg),title('medfilt2函数对比')

图像对比

 可以留意下处理后的图像的边缘处和四个顶角处的不同

 2*2方形窗口

2*3方形窗口

 

 

3*3方形窗口

 9*9方形窗口

如果对你有用的话,能否点个赞呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值