MATLAB中实现图像的空间域滤波和频率域滤波
2015-05-01 17:29
507 查看
一)空间域滤波与频率域滤波
1)空间域滤波
空间域滤波是指在图像空间中借助模板对图像领域进行操作,处理图像每一个像素值。主要分为线性滤波和非线性滤波两类,根据功能可分为平滑滤波器和锐化滤波器。平滑可通过低通来实现,平滑的目的有两类,一是模糊,目的是在提取较大的目标前去除太小的细节或将目标内的小尖端连接起来;二是去噪。锐化则可用高通滤波来实现,锐化的目的是为了增强被模糊的细节。
在matlab中实现空间域滤波,有很多类型,如均值、中值、索贝尔、高斯、拉普拉斯、高斯-拉普拉斯等,但各有差异。下面是用matlab实现的代码:
其运行结果如下:
空间域滤波均采用matlab自带的函数,参数也采用默认的值,可见中值滤波的效果最好。
其中各滤波器的原理和优缺点如下:
A)均值滤波:由fspecial函数生成的w1是一个大小为3*3的矩形平均滤波器,再用imfilter这个函数使这个掩模的中心逐个滑过图像的每个像素,输出为模板限定的相应领域像素与滤波器系数乘积结果的累加和。由处理结果可见均值滤波器的效果使每个点的像素都平均到它的领域去了,噪声明显减少了很多,效果较好。
B)索贝尔滤波:w2是一个大小为3*3的sobel滤波器sv,用来近似计算垂直梯度,在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。但是Sobel导数并不是真正的导数,这是因为Sobel算子定义于一个离散空间之上,它真正表示的是多项式拟合,用较大的核的话会在更多像素上进行拟合,会更加正确。而较小的核对噪声会更加敏感,此时用sobel算子近似计算导数的缺点精度比较低,这种不精确性在试图估计图像的方向导数 (使用y/x滤波器响应的反正切得到的图像梯度的方向)。比如对于3*3的Sobel滤波器,梯度角度接近水平或者垂直方向的时候,
这样的不准确性会比较明显。由滤波效果可见到图像的边缘凸显了出来,sobel算子主要用于边缘检测。
C)高斯滤波:高斯滤波器是平滑线性滤波器的一种,线性滤波器很适合于去除高斯噪声。而非线性滤波则很适合用于去除脉冲噪声,中值滤波就是非线性滤波的一种。高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波器是带有权重的平均值,即加权平均,中心的权重比邻近像素的权重更大,这样就可以克服边界效应。高斯滤波如果采用3×3掩模的具体公式如下:
g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1)+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16
其中,f(x,y)为原图像中(x,y)像素点的灰度值,g(x,y)为经过高斯滤波和的值。由处理效果可看出高斯滤波的减噪能力较好。
D)拉普拉斯滤波:拉普拉斯算子是n维欧式空间的一个二阶微分算子。拉普拉斯算子会突出像素值快速变化的区域,因此常用于边缘检测。由效果可见图像的边界得到了增强。
E)中值滤波:中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)}
,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。中值滤波对于斑点噪声和椒盐噪声来说尤其有用。保存边缘的特性使它在不希望出现边缘模糊的场合也很有用。由上图效果可见中值滤波的效果最好。
由以上分析可知,各种滤波器各有优劣,适用情况也不尽相同,线性滤波器很适合于去除高斯噪声,而非线性滤波则很适合用于去除脉冲噪声,如中值滤波很适合去除椒盐噪声。使用起来要视具体实际情况而定。
2)频率域滤波
开始时看书看了些原理想自己用算法实现发现有困难,就去百度了一下,写了下面的一些代码:
其运行效果如下:
可见出现了问题,理想低通滤波的效果并不好,巴特沃斯和高斯滤波器的输出图像成了黑色,后经反复检查,调试,并没找出问题所在,于是打算尝试另一种方法。代码和结果如下:
通过这种方法运行出的结果是正常的。低通滤波滤掉了图像频谱中的高频成分,仅让低频部分通过,即变化剧烈的成分减少了,结果是使图像便模糊。比较可见高斯滤波的效果最好。
频率域高通滤波和低通滤波实现的原理差不多,只是在设计滤波器时的公式有些差异,我就没有再重复实现了。
1)空间域滤波
空间域滤波是指在图像空间中借助模板对图像领域进行操作,处理图像每一个像素值。主要分为线性滤波和非线性滤波两类,根据功能可分为平滑滤波器和锐化滤波器。平滑可通过低通来实现,平滑的目的有两类,一是模糊,目的是在提取较大的目标前去除太小的细节或将目标内的小尖端连接起来;二是去噪。锐化则可用高通滤波来实现,锐化的目的是为了增强被模糊的细节。
在matlab中实现空间域滤波,有很多类型,如均值、中值、索贝尔、高斯、拉普拉斯、高斯-拉普拉斯等,但各有差异。下面是用matlab实现的代码:
%空间域滤波 clc;close all; I=imread('1.tif'); w1=fspecial('average',[3 3]); w2=fspecial('sobel'); w3=fspecial('gaussian',[3 3],0.5); w4=fspecial('laplacian',0.2); w5=fspecial('log',[5 5],0.5); g1=imfilter(I,w1,'replicate'); g2=imfilter(I,w2,'replicate'); g3=imfilter(I,w3,'replicate'); g4=imfilter(I,w4,'replicate'); g5=imfilter(I,w5,'replicate'); g6=medfilt2(I); subplot(3,3,1);imshow(I);title('原图'); subplot(3,3,2);imshow(g1);title('均值滤波'); subplot(3,3,3);imshow(g2);title('索贝尔滤波'); subplot(3,3,4);imshow(g3);title('高斯滤波'); subplot(3,3,5);imshow(g4);title('拉普拉斯滤波'); subplot(3,3,6);imshow(g5);title('高斯-拉普拉斯滤波'); subplot(3,3,7);imshow(g6);title('中值滤波');
其运行结果如下:
空间域滤波均采用matlab自带的函数,参数也采用默认的值,可见中值滤波的效果最好。
其中各滤波器的原理和优缺点如下:
A)均值滤波:由fspecial函数生成的w1是一个大小为3*3的矩形平均滤波器,再用imfilter这个函数使这个掩模的中心逐个滑过图像的每个像素,输出为模板限定的相应领域像素与滤波器系数乘积结果的累加和。由处理结果可见均值滤波器的效果使每个点的像素都平均到它的领域去了,噪声明显减少了很多,效果较好。
B)索贝尔滤波:w2是一个大小为3*3的sobel滤波器sv,用来近似计算垂直梯度,在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。但是Sobel导数并不是真正的导数,这是因为Sobel算子定义于一个离散空间之上,它真正表示的是多项式拟合,用较大的核的话会在更多像素上进行拟合,会更加正确。而较小的核对噪声会更加敏感,此时用sobel算子近似计算导数的缺点精度比较低,这种不精确性在试图估计图像的方向导数 (使用y/x滤波器响应的反正切得到的图像梯度的方向)。比如对于3*3的Sobel滤波器,梯度角度接近水平或者垂直方向的时候,
这样的不准确性会比较明显。由滤波效果可见到图像的边缘凸显了出来,sobel算子主要用于边缘检测。
C)高斯滤波:高斯滤波器是平滑线性滤波器的一种,线性滤波器很适合于去除高斯噪声。而非线性滤波则很适合用于去除脉冲噪声,中值滤波就是非线性滤波的一种。高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波器是带有权重的平均值,即加权平均,中心的权重比邻近像素的权重更大,这样就可以克服边界效应。高斯滤波如果采用3×3掩模的具体公式如下:
g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1)+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16
其中,f(x,y)为原图像中(x,y)像素点的灰度值,g(x,y)为经过高斯滤波和的值。由处理效果可看出高斯滤波的减噪能力较好。
D)拉普拉斯滤波:拉普拉斯算子是n维欧式空间的一个二阶微分算子。拉普拉斯算子会突出像素值快速变化的区域,因此常用于边缘检测。由效果可见图像的边界得到了增强。
E)中值滤波:中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)}
,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。中值滤波对于斑点噪声和椒盐噪声来说尤其有用。保存边缘的特性使它在不希望出现边缘模糊的场合也很有用。由上图效果可见中值滤波的效果最好。
由以上分析可知,各种滤波器各有优劣,适用情况也不尽相同,线性滤波器很适合于去除高斯噪声,而非线性滤波则很适合用于去除脉冲噪声,如中值滤波很适合去除椒盐噪声。使用起来要视具体实际情况而定。
2)频率域滤波
开始时看书看了些原理想自己用算法实现发现有困难,就去百度了一下,写了下面的一些代码:
%频率域滤波 clc;close all; f=imread('1.tif'); f=im2double(f); F=fft2(double(f));%傅里叶变换 F=fftshift(F);%将变换的原点移到频率矩形的中心 [M,N]=size(f); %理想低通滤波 D0=input('输入截止频率'); h1=zeros(M,N); for i=1:M for j=i:N if(sqrt(((i-M/2)^2+(j-N/2)^2))<D0) h1(i,j)=1; end end end G1=F.*h1; G1=ifftshift(G1); g1=real(ifft2(G1)); %巴特沃斯低通滤波 n=input('巴特沃斯滤波器的阶数 n='); n1=fix(M/2); n2=fix(N/2); h2=zeros(M,N); for i=1:M for j=1:N d=sqrt((i-n1)^2+(j-n2)^2); h2=1./(1+(d./D0).^(2*n)); end end G2=F.*h2; G2=ifftshift(G2); g2=real(ifft(G2)); %高斯低通滤波 h3=zeros(M,N); for i=1:M for j=1:N h3=exp(-(d.^2)./(2*(D0^2))); end end G3=F.*h3; G3=ifftshift(G3); g3=real(ifft(G3)); subplot(2,3,1);imshow(f);title('原图'); subplot(2,3,2);imshow(g1);title('理想低通滤波'); subplot(2,3,3);imshow(g2);title('巴特沃斯低通滤波'); subplot(2,3,4);imshow(g3);title('高斯低通滤波');
其运行效果如下:
可见出现了问题,理想低通滤波的效果并不好,巴特沃斯和高斯滤波器的输出图像成了黑色,后经反复检查,调试,并没找出问题所在,于是打算尝试另一种方法。代码和结果如下:
%巴特沃斯低通滤波 clc;close all; f=imread('1.tif'); f=im2double(f); M=2*size(I,1); N=2*size(I,2); %滤波器的行列数 u=-M/2:(M/2-1); v=-N/2:(N/2-1); [U,V]=meshgrid(u,v); D=sqrt(U.^2+V.^2); D0=50; %截止频率 n=6; H=1./(1+(D./D0).^(2*n)); %设计巴特沃斯滤波器 F=fftshift(fft2(I,size(H,1),size(H,2)));%傅里叶变换 G=F.*H; L=ifft2(fftshift(G)); %傅里叶反变换 L=L(1:size(I,1),1:size(I,2)); subplot(121);imshow(f); subplot(122);imshow(L);
%高斯低通滤波 clc;close all; I=imread('1.tif'); I=im2double(I); M=2*size(I,1); N=2*size(I,2); %滤波器的行列数 u=-M/2:(M/2-1); v=-N/2:(N/2-1); [U,V]=meshgrid(u,v); D=sqrt(U.^2+V.^2); D0=20; H=exp(-(D.^2)./(2*(D0^2))); %设计高斯滤波器 J=fftshift(fft2(I,size(H,1),size(H,2))); G=J.*H; L=ifft2(fftshift(G)); L=L(1:size(I,1),1:size(I,2)); figure; subplot(121);imshow(I); subplot(122);imshow(L);
通过这种方法运行出的结果是正常的。低通滤波滤掉了图像频谱中的高频成分,仅让低频部分通过,即变化剧烈的成分减少了,结果是使图像便模糊。比较可见高斯滤波的效果最好。
频率域高通滤波和低通滤波实现的原理差不多,只是在设计滤波器时的公式有些差异,我就没有再重复实现了。
相关文章推荐
- MATLAB中实现图像的空间域滤波和频率域滤波
- MATLAB中实现图像的空间域滤波和频率域滤波
- 基于空间相关的图像模板匹配及MATLAB实现
- Matlab中图像处理实例:灰度变换,空域滤波,频域滤波,傅里叶变换的实现
- matlab 实现数字图像的傅立叶变换及滤波锐化
- 用matlab实现视频的空间滤波和直方图均衡化
- matlab实现图像滤波——高斯滤波
- Matlab中图像处理实例:灰度变换,空域滤波,频域滤波,傅里叶变换的实现
- 图像算法之十二:非局部均值滤波及其Matlab实现
- 【图像处理】MATLAB:仅有噪声的复原(空间滤波)
- matlab实现图像滤波——高斯滤波
- 彩色图像空间滤波(MATLAB)
- Matlab---图像滤波之各种滤波器汇总实现
- 基于空间相关的图像模板匹配及MATLAB实现
- Matlab fspecial和imfilter对图像进行空间滤波
- Matlab---图像滤波之各种滤波器汇总实现
- Matlab中常用的空间域滤波和频率域滤波
- 基于空间相关的图像模板匹配及MATLAB实现
- 数字图像处理,经典滤波算法去噪对比实验(Matlab实现)
- 用matlab实现视频的空间滤波和直方图均衡化