数字图像处理之平滑滤波
数字图像处理之平滑滤波
by方阳
版权声明:本文为博主原创文章,转载请标出转载地址
http://www.cnblogs.com/fydeblog/p/6590343.html
1.相关知识
今天介绍平滑滤波的一些知识!
相关知识:均值模板和中值滤波
例如,3X3均值模板(取图像相邻区域的像素求和取平均代替中心像素,更高次类似)
[ 1 1 1
1 1 1
1 1 1]
然后说说中值滤波,还是以3X3来说,将3X3区域内的像素按大小值进行排列,取中间的值代替模板中心的值。
好了,基础说完了,来实际操作吧!
2.内容代码
2.1 选择一副具有大小尺寸的物体图像,分别选择 3×3,7×7,25×25 等平均模板进行均值滤波模糊处理,并对不同尺寸的滤波器模板操作后的图像进行比较。
参考代码:
I=imread('fig620.jpg'); I1=fy_Mean_filter(I,3); I2=fy_Mean_filter(I,7); I3=fy_Mean_filter(I,25); figure; subplot(1,3,1); imshow(I1); title('3X3'); subplot(1,3,2); imshow(I2); title('7X7'); subplot(1,3,3); imshow(I3); title('25X25');
fy_Mean_filter函数参考代码:
%实现均值滤波器 %image_in为输入图像,N选择几乘几的算子,image_out为输出图像 % by 方阳 function image_out=fy_Mean_filter(image_in,N) [m,n]=size(image_in); N=ones(N); [a,b]=size(N); n=n/3;%由于我的灰度图像是314x323x3的,所以除了3,你们如果是PxQ的,就不要加了 A=zeros(m+2*(a-1),n+2*(b-1));%构造矩阵(0填充) B=A;%用来存放均值后A的值 C=zeros(m,n);%存最后的输出结果 for i=a:m+a-1 for j=b:n+b-1 A(i,j)= image_in(i-a+1,j-b+1);%填充图像到A end end [L,T]=size(A); %以下是实现均值相关运算 for i=1:L-a+1 for j=1:T-b+1 for p=1:a for q=1:b B(i+(a-1)/2,j+(b-1)/2)=B(i+(a-1)/2,j+(b-1)/2)+A(p+i-1,q+j-1); end end end end B=uint8(B/(a*b)); %对运算完的B进行剪切,恢复出均值后的图像 for x=a:m+a-1 for y=b:n+b-1 C(x-a+1,y-b+1)=B(x,y); end end image_out=uint8(C);
运行结果:
可见模板越大,图像越平滑,但也越模糊。
2.2 选择一副图像,对图像加入椒盐噪声,检验两种滤波模板(3×3 平均模板和 3×3 中值滤波器)对噪声的滤波效果。
参考代码:
I4=imread('lena.bmp'); I5=imnoise(I4,'salt & pepper',0.02); I6=fy_Mean_filter(I5,3); I7=fy_Mid_Filter(I5,3); figure; subplot(2,2,1); imshow(I4); title('原图'); subplot(2,2,2); imshow(I5); title('加椒盐噪声后的图像'); subplot(2,2,3); imshow(I6); title('均值滤波后的图像'); subplot(2,2,4); imshow(I7); title('中值滤波后的图像');
fy_Mid_Filter函数的参考代码(与fy_Mean_filter类似):
%该函数实现中值滤波 function image_out=fy_Mid_Filter(image_in,N) [m,n]=size(image_in); n=n/3; A=zeros(m+2*(N-1),n+2*(N-1));%构造矩阵 B=A;%用来存放均值后A的值 C=zeros(m,n);%存最后的输出结果 for i=N:m+N-1 for j=N:n+N-1 A(i,j)= image_in(i-N+1,j-N+1);%填充图像到A end end [L,T]=size(A); for i=1:L-N+1 for j=1:T-N+1 c=A(i:i+(N-1),j:j+(N-1)); e=c(1,:); %是c矩阵的第一行 for u=2:N e=[e,c(u,:)]; %将c矩阵变为一个行矩阵 end mm=median(e); %mm是中值 B(i+(N-1)/2,j+(N-1)/2)=mm; end end for x=N:m+N-1 for y=N:n+N-1 C(x-N+1,y-N+1)=B(x,y); end end image_out=uint8(C);
实验结果:
由此可见,在滤除椒盐噪声方面,中值滤波要比均值滤波要好!