【修订版】本文已整理到我的个人博客订正了原文的几处错误卷积的定义有误补零的作用是避免圆周卷积的缠绕误差并不是扩大频率范围中心化应乘 (−1)^(xy)。CSDN 这一版保留原样之后的勘误与更新只在博客进行 Frequency Domain Filter : 低通滤波 | Finns blog之前的博文主要介绍了空间域内的滤波器本文主要从频域的角度进行分析。主要使用傅里叶变换将空间域的图像转换到频域内在频域内进行数字图像处理。这部分的内容及其重要频域内的处理可以解决空间域内无法完成的图像增强。本文首先从数学角度对图像的频域内的性质进行分析然后在着重介绍滤波器在频域内的性质。1.傅里叶变换与频域在之前的文中我们已经进行过一些基本的图像处理。比如使用低通滤波可以将图像模糊也有些许降噪的作用。这些都是在空间域内进行的滤波处理这个处理主要是依靠卷积来进行计算的。首先从连续的一维卷积入手如下所示。将上式进行傅里叶变换可以得到如下结果。从这个式子我们可以得到一个重要的结论。也就是函数与卷积的傅里叶变换所得到的结果是函数与的傅里叶变换与的乘积。再将其总结得简单易懂一些有如下结论。在将其扩展到二维的形况下假设尺寸为MxN的图像如下关系是成立的。其实到这基本的原理就明了的。我们所看到的图像均为空间域内的表现形式我们无法辨识出频域内的图像。要进行频域内的滤波器处理首先就需要进行傅里叶变换然后直接进行滤波处理最后再用反傅里叶变换倒回到空间域内。到此已经可以开始空间域内的滤波处理了。但是还有一点需要注意的地方。使用某个一维信号来举例子一维信号的傅里叶变换是以2π为周期的函数。所以我们常常使用的范围[-π,π]来表示这个信号的傅里叶变换如下所示。这样做的好处是靠近0的成分就是低频靠近-π与π的成分就表示高频。而对于图像而言在Matlab中我们使用fft2()这个函数来求取图像的傅里叶变换。g fft2(f);上面这个代码求取的其实是范围[0,π]内的傅里叶变换。为了方便理解下图画出了本行代码所求取的图像的傅里叶变换的范围右和与其等效的一维傅里叶变换的范围左。很显然这并不是希望的范围下面这个代码可以求取[0,2π]内的傅里叶变换。P 2*M; Q 2*N; F fft2(f,P,Q);下图画出了本行代码所求取的图像的傅里叶变换的范围右和与其等效的一维傅里叶变换的范围左。所得到的图像F(u,v)的尺寸为PxQ。我们需要对其移动一下如下图所示我们需要的是粉色范围的区域。下面从数学上分析一下如何获得这个部分的频谱。对于傅里叶变换有如下性质。这个特性称为平移特性粉色部分的频谱将带入上式我们可以得到如下式子。为次我们已经得到了粉色范围的频谱。越靠近傅里叶频谱图像中间的成分代表了低频成分。其Matlab代码如下所示。[M,N] size(f); P 2*M; Q 2*N; fc zeros(M,N); for x 1:1:M for y 1:1:N fc(x,y) f(x,y) * (-1)^(xy); end end F fft2(fc,P,Q);代码所得到的结果如下图所示。接下来我们总结一下频域滤波的步骤①先将图像做频域内的水平移动然后求原图像f(x,y)的DFT得到其图像的傅里叶谱F(u,v)。②与频域滤波器做乘积③求取G(u,v)的IDFT然后再将图像做频域内的水平移动移动回去其结果可能存在寄生的虚数此时忽略即可。④这里使用ifft2函数进行IDFT变换得到的图像的尺寸为PxQ。切取左上角的MxN的图像就能得到结果了。2.低通滤波器2.1理想的低通滤波器其中D0表示通带的半径。D(u,v)的计算方式也就是两点间的距离很简单就能得到。使用低通滤波器所得到的结果如下所示。低通滤波器滤除了高频成分所以使得图像模糊。由于理想低通滤波器的过度特性过于急峻所以会产生了振铃现象。2.2巴特沃斯低通滤波器同样的D0表示通带的半径n表示的是巴特沃斯滤波器的次数。随着次数的增加振铃现象会越来越明显。2.3高斯低通滤波器D0表示通带的半径。高斯滤波器的过度特性非常平坦因此是不会产生振铃现象的。3.实现代码close all; clear all; %% ---------Ideal Lowpass Filters (Fre. Domain)------------ f imread(characters_test_pattern.tif); f mat2gray(f,[0 255]); [M,N] size(f); P 2*M; Q 2*N; fc zeros(M,N); for x 1:1:M for y 1:1:N fc(x,y) f(x,y) * (-1)^(xy); end end F fft2(fc,P,Q); H_1 zeros(P,Q); H_2 zeros(P,Q); for x (-P/2):1:(P/2)-1 for y (-Q/2):1:(Q/2)-1 D (x^2 y^2)^(0.5); if(D 60) H_1(x(P/2)1,y(Q/2)1) 1; end if(D 160) H_2(x(P/2)1,y(Q/2)1) 1; end end end G_1 H_1 .* F; G_2 H_2 .* F; g_1 real(ifft2(G_1)); g_1 g_1(1:1:M,1:1:N); g_2 real(ifft2(G_2)); g_2 g_2(1:1:M,1:1:N); for x 1:1:M for y 1:1:N g_1(x,y) g_1(x,y) * (-1)^(xy); g_2(x,y) g_2(x,y) * (-1)^(xy); end end %% -----show------- figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel(a).Original Image); subplot(1,2,2); imshow(log(1 abs(F)),[ ]); xlabel(b).Fourier spectrum of a); figure(); subplot(1,2,1); imshow(H_1,[0 1]); xlabel(c).Ideal Lowpass filter(D60)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_1(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_1)),[ ]); xlabel(d).Result of filtering using c); subplot(1,2,2); imshow(g_1,[0 1]); xlabel(e).Result image); figure(); subplot(1,2,1); imshow(H_2,[0 1]); xlabel(f).Ideal Lowpass filter(D160)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_2(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_2)),[ ]); xlabel(g).Result of filtering using e); subplot(1,2,2); imshow(g_2,[0 1]); xlabel(h).Result image); close all; clear all; %% ---------Butterworth Lowpass Filters (Fre. Domain)------------ f imread(characters_test_pattern.tif); f mat2gray(f,[0 255]); [M,N] size(f); P 2*M; Q 2*N; fc zeros(M,N); for x 1:1:M for y 1:1:N fc(x,y) f(x,y) * (-1)^(xy); end end F fft2(fc,P,Q); H_1 zeros(P,Q); H_2 zeros(P,Q); for x (-P/2):1:(P/2)-1 for y (-Q/2):1:(Q/2)-1 D (x^2 y^2)^(0.5); D_0 100; H_1(x(P/2)1,y(Q/2)1) 1/(1(D/D_0)^2); H_2(x(P/2)1,y(Q/2)1) 1/(1(D/D_0)^6); end end G_1 H_1 .* F; G_2 H_2 .* F; g_1 real(ifft2(G_1)); g_1 g_1(1:1:M,1:1:N); g_2 real(ifft2(G_2)); g_2 g_2(1:1:M,1:1:N); for x 1:1:M for y 1:1:N g_1(x,y) g_1(x,y) * (-1)^(xy); g_2(x,y) g_2(x,y) * (-1)^(xy); end end %% -----show------- figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel(a).Original Image); subplot(1,2,2); imshow(log(1 abs(F)),[ ]); xlabel(b).Fourier spectrum of a); figure(); subplot(1,2,1); imshow(H_1,[0 1]); xlabel(c)Butterworth Lowpass (D_{0}100,n1)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_1(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_1)),[ ]); xlabel(d).Result of filtering using c); subplot(1,2,2); imshow(g_1,[0 1]); xlabel(e).Result image); figure(); subplot(1,2,1); imshow(H_2,[0 1]); xlabel(f).Butterworth Lowpass (D_{0}100,n3)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_2(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_2)),[ ]); xlabel(g).Result of filtering using e); subplot(1,2,2); imshow(g_2,[0 1]); xlabel(h).Result image); close all; clear all; clc; %% ---------Gaussian Lowpass Filters (Fre. Domain)------------ f imread(characters_test_pattern.tif); f mat2gray(f,[0 255]); [M,N] size(f); P 2*M; Q 2*N; fc zeros(M,N); for x 1:1:M for y 1:1:N fc(x,y) f(x,y) * (-1)^(xy); end end F fft2(fc,P,Q); H_1 zeros(P,Q); H_2 zeros(P,Q); for x (-P/2):1:(P/2)-1 for y (-Q/2):1:(Q/2)-1 D (x^2 y^2)^(0.5); D_0 60; H_1(x(P/2)1,y(Q/2)1) exp(-(D*D)/(2*D_0*D_0)); D_0 160; H_2(x(P/2)1,y(Q/2)1) exp(-(D*D)/(2*D_0*D_0)); end end G_1 H_1 .* F; G_2 H_2 .* F; g_1 real(ifft2(G_1)); g_1 g_1(1:1:M,1:1:N); g_2 real(ifft2(G_2)); g_2 g_2(1:1:M,1:1:N); for x 1:1:M for y 1:1:N g_1(x,y) g_1(x,y) * (-1)^(xy); g_2(x,y) g_2(x,y) * (-1)^(xy); end end %% -----show------- close all; figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel(a).Original Image); subplot(1,2,2); imshow(log(1 abs(F)),[ ]); xlabel(b).Fourier spectrum of a); figure(); subplot(1,2,1); imshow(H_1,[0 1]); xlabel(c)Gaussian Lowpass (D_{0}60)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_1(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_1)),[ ]); xlabel(d).Result of filtering using c); subplot(1,2,2); imshow(g_1,[0 1]); xlabel(e).Result image); figure(); subplot(1,2,1); imshow(H_2,[0 1]); xlabel(f).Gaussian Lowpass (D_{0}160)); subplot(1,2,2); h mesh(1:20:P,1:20:Q,H_2(1:20:P,1:20:Q)); set(h,EdgeColor,k); axis([0 P 0 Q 0 1]); xlabel(u);ylabel(v); zlabel(|H(u,v)|); figure(); subplot(1,2,1); imshow(log(1 abs(G_2)),[ ]); xlabel(g).Result of filtering using e); subplot(1,2,2); imshow(g_2,[0 1]); xlabel(h).Result image);原文发于博客zhoufan900428-CSDN博客