MATLAB-medfilt2函数的实现源代码
Posted Kaerou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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方形窗口
如果对你有用的话,能否点个赞呢?
以上是关于MATLAB-medfilt2函数的实现源代码的主要内容,如果未能解决你的问题,请参考以下文章