自编均值滤波器
算法思想:
均值滤波器是通过传入的图像和滤波器的大小,先申请两个大小为原图尺寸各加上滤波器尺寸减一的二维全零矩阵,第一个用来存储扩大后的原图,在这个扩大后的原图进行滤波处理,通过两层循环,将原图的像素值映射到第一个全零矩阵中,边缘扩充后为0;第二个是在进行滤波处理时,通过两层循环,使每一个值都能作为滤波器中心元素进行滤波处理,通过计算滤波器取得的元素的均值,将计算得到的均值存到中心元素对应的第二个全零矩阵的位置上,直到计算完每个元素的相应均值结束。最后裁剪第二个存储均值结果的矩阵,将扩大的矩阵按映射的方式缩小为原图的大小,输出二维矩阵转换为uint8类型展示输出效果。
均值滤波器*
function avgf= avg_filter(I,n)
%I为原图,n为滤波器的大小
a=ones(n); %生成一个全为1的矩阵
[r,c]=size(I); %图像的行和列
dI=double(I);
dt=n-1; %边缘需要扩充的距离
f=zeros(r+dt,c+dt); %对边缘进行0值处理,根据滤波器的大小把图像扩大
fi=zeros(r+dt,c+dt);
for i=1:r
for j=1:c
f((i+dt/2),(j+dt/2))=dI(i,j);
end
end
for i=1+dt/2:r+dt/2 %对中心元素进行均质化
for j=1+dt/2:c+dt/2
w=f((i-dt/2):(i+dt/2),(j-dt/2):(j+dt/2)).*a; %将模块选中的值与1相乘
sw=sum(sum(w)); %求w矩阵中各元素之和
fi(i,j)=sw/(n*n); %将与模板运算后的各元素的均值赋给模板中心位置的元素
end
end
avgf=zeros(r,c); %裁剪
for i=1:r
for j=1:c
avgf(i,j)=fi(i+dt/2,j+dt/2); %将扩大的图像转变为原图大小
end
end
end
实验结果分析