4.1 二维离散傅里叶变换
定义与一维DFT相同,此处不再赘述。
在计算二维傅里叶变换之前,可将f(x,y)*(-1)^(x+y)次,可将原点的变换值移到频谱中心。
4.2 在MATLAB中计算并可视化二维DFT
下列函数返回M*N的傅里叶变换;数据原点在左上角,而两个四分之一周期交汇于频率矩形的中心。
F = fft2(f)
若需要进行0填充:
F = fft2(f,P,Q)
生成的矩阵大小为P*Q,多余的用0填充。
我们可以使用fftshift函数将变换的原点移到频率矩形的中心,也可用ifftshift将其复原:
Fc = fftshift(F)
F = ifftshift(Fc)
我们可以使用对数变换来使频谱的视觉增强:
S2 = log(1+abs(Fc));
可用如下函数计算频率矩形的中心点可不必考虑M,N的奇偶性:
[floor(M/2) + 1 , floor(N/2) + 1]
由于浮点计算的舍入误差,傅里叶逆变换的输出会有很小的虚数分量,因此需要计算后取实部:
f = real(ifft2(F));
4.3 频域滤波
4.3.1 基本概念
空间域和频域线性滤波的基础均为卷积定理。
频域滤波的目的是选择一个滤波器传递函数,以便按照指定的方式修改F(u,v)。例如,当乘一个低通滤波器时,高频分量会被衰减,而低频分量保持不变,此结果会出现模糊现象(平滑)。
注意:当我们使用DFT进行滤波时,图像及其变换都被看作是具有周期性的。若周期关于函数的非零部分的持续时间很近,则对周期函数执行卷积运算会导致相邻周期之间的干扰,称为折叠误差的干扰。我们可以通过使用0填充函数的方法来避免。
若函数f和h的大小分别为AB和CD,通过选择P>=A+C-1,Q>=B+D-1即可避免折叠误差。
paddedsize函数可计算满足P,Q的最小偶数值(加快FFT速度),还可填充输入图像,使其等于最接近的2的整数次幂。
function PQ = paddedsize(AB, CD, nargin)
% 计算填充尺寸以供基于FFT的滤波器
% nargin = 1 PQ = PADDEDSIZE(AB),AB = [A B], PQ = 2 * AB
%
% nargin = 2 PQ = PADDEDSIZE(AB, 'PWR2'), PQ(1) = PQ(2) = 2 ^ nextpow2(2 * m), m =
% MAX(AB).
%
% nargin = 3 PQ = PADDEDSIZE(AB, CD),AB = [A B], CD = [C D]
%
% nargin = 其它 PQ = PADDEDSIZE(AB, CD, 'PWR2'), PQ(1) = PQ(2) = 2 ^ nextpow2(2 * m), m =
% MAX([AB CD]).
if nargin == 1
PQ = 2 * AB;
else if nargin == 2 & ~ischar(CD)
PQ = AB + CD -1;
PQ = 2 * ceil(PQ / 2); % ceil(N)返回比N大的最小整数,避免出现奇数
else if nargin == 2
m = max(AB);
P = 2 ^ nextpow2(2 * m); % nextpow2(N)返回第一个P,使得2. ^ P> = abs(N)。
% 对于FFT运算,找到最接近两个序列长度的2 的幂次方通常很有用。
PQ = [P, P];
else if nargin == 3
m = max([AB CD]);
P = 2 ^ nextpow2(2 * m);
PQ = [P, P];
else
error('Wrong number of input')
end
填充滤波与非填充滤波对比:
4.2 DFT滤波的基本步骤
(1)使用函数paddedsize获取填充参数
PQ = paddedsize(size(f));
(2)得到使用填充的傅里叶变换
F = fft2(f,PQ(1),PQ(2));
(3)生成滤波函数H
滤波函数大小为PQ(1)*PQ(2) 格式必须如下图b所示
若是a格式,需用fftshift进行处理。
(4)将变换乘滤波函数
G = H.*F;
(5)获得G的傅里叶逆变换的实部
g = real(ifft2(G));
(6)将左上部的矩阵修剪为原始大小
g = g(1:size(f,1), 1:size(f,2));
4.3 频域滤波
dftfilt函数
g = real(ifft(H.*F));
g = g(1:size(f,1),1:size(f,2));
4.4 从空间滤波器获得频域滤波器
一般,当滤波器较小时,空间滤波比频域滤波更有效。
给定一个空间滤波器h,生成一个频域滤波器H的方法:
H = fft2(h,PQ(1),PQ(2));
但是,这种方法获得的频域滤波器与空间滤波器不等价(使用imfilter的空间滤波,imfilter使用了相关,且滤波原点在中心处)
H = freqz2(h,R,C);
此函数用于计算FIR滤波器的频率响应,结果是我们所希望的频域滤波器。其中,h是一个二维空间滤波器,R为h的行数(R=PQ(1)),C为列数(C=PQ(2))。
4.5 在频域中直接生成滤波器
4.5.1建立用于实现频域滤波器的网格数组
dftuv函数:
function [U, V] = dftuv(M, N)
% DFTUV Computes meshgrid frequency matrices.
% [U, V] = DFTUV(M, N) computes meshgrid frequency matrices U and V. U and
% V are useful for computing frequency-domain filter functions that can be
% used with DFTFILT. U and V are both M-by-N.
% more details to see the textbook Page 93
%
% [U,V] = DFTUV(M,N)计算网格频率矩阵U和V。 U和V对于计算可与DFTFILT一起使用的
% 频域滤波器函数很有用。 U和V都是M-by-N。更多细节见冈萨雷斯教材93页
% Set up range of variables.
% 设置变量范围
u = 0 : (M - 1);
v = 0 : (N - 1);
% Compute the indices for use in meshgrid.
% 计算网格的索引,即将网络的原点转移到左上角,因为FFT计算时变换的原点在左上角。
idx = find(u > M / 2);
u(idx) = u(idx) - M;
idy = find(v - N / 2);
v(idy) = v(idy) - N;
% Compute the meshgrid arrays.
% 计算网格矩阵
[V, U] = meshgrid(v, u);
4.5.2 低通频域滤波器
H(u,v)= 1 (若D(u,v)<= D0)
H(u,v)= 0 (若D(u,v)> D0)
D0为指定的非负数,D(u,v)为点(u,v)到滤波器中心的距离。D(u,v)=D0的点的轨迹为一个圆。若滤波器H乘一幅图像的傅里叶变换,则理想滤波器切断了圆外F所有的分量,圆内和圆上的值不变。
高斯低通滤波器:
PQ = paddedsize(size(f));
[U , V] = dftuv(PQ(1),PQ(2));
D0 = 0.05*PQ(2);
F = fft2(f,PQ(1),PQ(2));
H = exp(-(U.^2+V.^2)/(2*D0^2));
g = dftfilt(f,H);
#以图像形式查看该滤波器
figure(),imshow(fftshift(h),[])
#将频谱显示为一幅图像
figure(),imshow(log(1+abs(fftshift(F))),[])
#输出图像
figure(),imshow(g,[]);
高斯低通滤波后的图像与原图像相比要模糊一些。
生成滤波器函数lpfilter():
function [H, D] = lpfilter(type, M, N, D0, n)
% LPFILTER Computes frequency domain lowpass filters
% H = LPFILTER(TYPE, M, N, D0, n) creates the transfer function of a
% lowpass filter, H, of the specified TYPE and size (M-by-N). To view the
% filter as an image or mesh plot, it should be centered using H =
% fftshift(H)
% Valid value for TYPE, D0, and n are:
% 'ideal' Ideal lowpass filter with cutoff frequency D0. n need not be
% supplied. D0 must be positive.
% 'btw' Butterworth lowpass filter of order n, and cutoff D0. The
% default value for n is 1.0. D0 must be positive.
% 'gaussian'Gaussian lowpass filter with cutoff (standard deviation) D0.
% n need not be supplied. D0 must be positive.
%
% 得到指定类型的低通滤波器
[U, V] = dftuv(M, N);
% 计算距离 D(U, V)
D = sqrt(U.^2 + V.^2);
% 滤波计算
switch type
case 'ideal'
H = double(D <= D0);
case 'btw'
if nargin == 4
n =1;
end
H = 1 ./ (1 + (D ./ D0) .^ (2 * n));
case 'gaussian'
H = exp(-(D .^ 2) ./ (2 * (D0 ^ 2)));
otherwise
error('Unkown filter type.')
end
4.5.3 线框图与表面图
对于二维函数,使用函数mesh可以绘制线框图
mesh(H(1:k:end,1:k:end))
#默认颜色为彩色
colormap([0 0 0]) %设置为黑色
colormap(gray) %设置为灰色
#开启/关闭 网格/坐标轴
grid on grid off
axis on axis off
#调节方位角/仰角
view(az,el)
#将函数绘制成表面图来代替线框图
surf(H)
#插值,平滑小面描影并删除网格线
shading interp
4.6 锐化频域滤波器
高通滤波会使图像变得更清晰(锐化)。
4.6.1 基本的高通滤波器
hpfilter()
function H = hpfilter(type, M, N, D0, n)
% LPFILTER Computes frequency domain highpass filters
% H = HPFILTER(TYPE, M, N, D0, n) creates the transfer function of a
% highpass filter, H, of the specified TYPE and size (M-by-N). To view the
% filter as an image or mesh plot, it should be centered using H =
% fftshift(H)
% Valid value for TYPE, D0, and n are:
% 'ideal' Ideal highpass filter with cutoff frequency D0. n need not be
% supplied. D0 must be positive.
% 'btw' Butterworth highpass filter of order n, and cutoff D0. The
% default value for n is 1.0. D0 must be positive.
% 'gaussian'Gaussian highpass filter with cutoff (standard deviation) D0.
% n need not be supplied. D0 must be positive.
% The transfer function Hhp of highpass filter is 1 - Hlp, where Hlp is the
% transfer function of the corresponding lowpass filter. Thus, we can use
% function lpfilter to generate highpass filters.
%
% 计算给定类型(理想、巴特沃斯、高斯)的频域高通滤波器
% Use function dftuv to set up the meshgrid arrays needed for computing the
% required distances.
if nargin == 4
n = 1;
end
Hlp = lpfilter(type, M, N, D0, n);
H = 1 - Hlp;
高通滤波:
PQ = paddedsize(size(f));
D0 = 0.05*PQ(1);
H = hpfilter('gaussian',PQ(1),PQ(2),D0);
g = dftfilt(f,H);
figure,imshow(g,[])
4.6.2 高频强调滤波
普通的高通滤波器偏离直流项,从而把图像的平均值降到了0。一种补偿方法是给高通滤波器加上一个偏移量,若同时将滤波器乘一个大于1的常数,则称为高频强调滤波,因为该常数突出了高频部分。这个乘数也增加了低频部分的幅度,但是只要偏离量与乘数相比较小,低频增强的部分就弱于高频增强的影响。
传递函数为:
应用:X光片的增强。