原程序地址:https://blog.youkuaiyun.com/timidsmile/article/details/6904381
中值滤波代码如下:
%自编的中值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)
function d=mid_filter(x,n)
[height, width]=size(x); %输入图像是p×q的,且p>n,q>n
x1=double(x);
x2=x1;
for i=1:height-n+1
for j=1:height-n+1
c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的)
e=c(1,:); %是c矩阵的第一行
for u=2:n
e=[e,c(u,:)]; %将c矩阵变为一个行矩阵
end
mm=median(e); %mm是中值
x2(i+(n-1)/2,j+(n-1)/2)=mm; %将模板各元素的中值赋给模板中心位置的元素
end
end
%未被赋值的元素取原值
d=uint8(x2);
end
中值滤波函数中,median(A)是按列返回中值的,也就是说矩阵A有几列,就返回多少个中值,那为什么代码中的e作为一个行矩阵,只返回一个中值呢?因为此处的e应当视作向量,对向量来说,median(A)返回的是向量的中值,具体参考https://cn.mathworks.com/help/matlab/ref/median.html?s_tid=gn_loc_drop
另一种方法可改写程序为e=c(:),此处e为一个列矩阵,c(:)表示按列排列,即第一列接第二列接第三列...