一般来说,图像高频分量对应图像细节信息,图像低频分量对应图像轮廓信息。低通滤波能够用来滤除噪声影响,高通滤波则是强调图像的纹理信息。但通过查阅相关资料发现,截止频率的确定却很少进行相关说明。如果我们需要的是图像中某一个频带的信息,如何精确地通过频域滤波获得滤波后的结果?为此做了相关如下实验。
考虑如下图像:
Fig.1
从图中可看出,包括直流成分在内一共有5种频率成分。频谱关于原点对称。分别为:
Fig.2
在频域上分别为:
Fig.3
举个例子来说。如果我们想滤除第二个频率的成分。我们需要构造一个频域滤波器(或称作传递函数),其阻带要包括图3(b)种白点区域。我们通过一个matlab程序构造了如下传递函数。
Fig.4
其中蓝色部分为0,红色部分为1。(可理解为理想滤波器,如果是高斯或者巴特沃兹滤波器不能简单设置阈值决定0和1)。可见,蓝色部分对应图3(b)种白色部分,也就是频域集中位置。
下一步,就是通过求得的传递函数对图像进行滤波。具体步骤是对原图像进行fft变换(matlab函数fft2)。在频域直接与传递函数点乘。然后进行fft逆变换即可。图5为滤波前后的对比结果。可见第二个频率分量被滤除。
fig.5
相关程序代码如下:
生成传递函数矩阵:
function [ H,D ] = lixiang_brfilter(M, N, DL,DH)
% DL=[1,40]; 二维低频截止位置
% DH=[10,50];二维高频截止位置
% M=256;
% N=256;
DL_do=M-DL;
DH_do=M-DH;
H=ones(M,N);
A=[1:1:M];
V=repmat(A,N,1);%É生成距离网格
U=V';
for i=1:M
for j=1:N
if(U(i,j)>DL(1)&U(i,j)<DH(1))&(V(i,j)>DL(2)&V(i,j)<DH(2))
H(i,j)=0;
elseif(U(i,j)>DH_do(1)&U(i,j)<DL_do(1))&(V(i,j)>DH_do(2)&V(i,j)<DL_do(2))%对偶延展
H(i,j)=0;
end
end
end
滤波程序:
function g = dftfilt( f,H )
F=fft2(f,size(H,1),size(H,2));
% perform filtering.
g=real (ifft2(H.*F));
% Crop to original size.
g=g(1:size(f,1),1:size(f,2));