均值滤波与 matlab 编程
MatLab 自编的均值滤波、中值滤波、高斯滤波 图像处理函数。
%自编的均值滤波函数。x 是需要滤波的图像,n 是模板大小(即 n×n)
function d=avefilt(x,n)
a(1:n,1:n)=1; %a 即 n×n 模板,元素全是 1
p=size(x); %输入图像是 p×q 的,且 p>n,q>n
x1=double(x);
x2=x1;
%A(a:b,c:d)表示 A 矩阵的第 a 到 b 行,第 c 到 d 列的所有元素
for i=1:p(1)-n+1
for j=1:p(2)-n+1
c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出 x1 中从(i,j)开始的 n 行 n 列元素与模板相乘
s=sum(sum(c)); %求 c 矩阵(即模板)中各元素之和
x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %将模板各元素的均值赋给模板中心位置的元素
end
end
%未被赋值的元素取原值
d=uint8(x2);
%自编的中值滤波函数。x 是需要滤波的图像,n 是模板大小(即 n×n)
function d=midfilt(x,n)
p=size(x); %输入图像是 p×q 的,且 p>n,q>n
x1=double(x);
x2=x1;
for i=1:p(1)-n+1
for j=1:p(2)-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);
%自编的高斯滤波函数,S 是需要滤波的图象,n 是均值,k 是方差
function d=gaussfilt(k,n,s)
Img = double(s);
n1=floor((n+1)/2);%计算图象中心
for i=1:n
for j=1:n
b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*k))/(4*pi*k);