本章主要介绍傅里叶变换的基本原理,并在基本的图像滤波中使用傅里叶变换。
很多情况下,频率域滤波和空间域滤波可视为对于同一图像增强问题的殊途同归的两种解决方式。一些在空间域困难的增强任务,在频率域中变得非常普通。
傅里叶级数:任何周期函数可表示为不同频域的正弦和/或余弦之和的形式,每个正弦项和/或余弦项乘以不同的系数,这个和的形式称为傅里叶级数。
傅里叶变换:非周期函数(但该曲线下的面积是有限的)也可以用正弦和/或余弦乘以加权函数的积分表示。
傅里叶级数或傅里叶变换表示的函数特征完全可以通过傅里叶反变换来重建,且不丢失任何信息。故傅里叶变换可以使我们工作在频率域,而在转换回空间域时不丢失任何信息。
一、傅里叶变换基础知识
1.1 复数
R和I是实数,j是一个等于-1的平方根的虚数。R表示实部,I表示虚部。
复数C的共轭复数(实部相等,虚部相反):
欧拉公式
1.2 傅里叶级数
具有周期T的连续变量t的周期函数f(t)可描述为乘以适当系数的正弦和余弦之和,这个和即为傅里叶级数,形式如下:
其中
1.3 一维连续函数傅里叶变换对
f(t)为非周期函数。
正变换
f(x)表示原函数,F(u)表示变换之后的函数。u为频率域变量。
反变换
1.4 一维离散傅里叶变换对(DFT)
一维函数f(x) (其中x = 0,1,2,……,M-1)。
- 在频域下变换F(u)也是离散的,其定义域仍为0~M-1 ,因为F(u)是周期性的,周期为M。
- 1/M的系数也可以位于正变换前。更一般的情况是保证正变换和反变换前的系数乘积为1/M即可。
1.5 二维连续傅里叶变换对
1.6 二维离散傅里叶变换对
f(x,y)是大小为M x N的数字图像。(x,y)表示空间域坐标,(u,v)表示频率域坐标。
同样,1/MN的位置并不重要,也可放在正变换前面。正反变换前的系数乘积为1/MN即可。
1.7 卷积定理
在频率域中,我们感兴趣的是具有连续变量t的两个连续函数的卷积。
空间域中两个函数的卷积的傅里叶变换,等于两个函数的傅里叶变换在频率域的乘积。反之,有频率域两个变换的乘积,可通过计算傅里叶反变换得到空间域的卷积。
空间域中两个函数的乘积的傅里叶变换,等于两个函数的傅里叶变换在频率域的卷积;反之,有频率域两个变换的卷积,可以通过计算傅里叶反变换得到空间域的乘积。
卷积的离散等价表示:
x = 0,1,2……M-1
星号算子表示卷积。t所在的域为空间域,u所在的域为频率域。
卷积定理是频率域滤波的基础。
1.8 二维卷积定理
第一个公式:
两个空间函数的卷积可以通过计算两个傅立叶变换函数的乘积的逆变换得到;相反,两个空间函数卷积的傅立叶变换恰好等于两个函数的傅立叶变换的乘积
第二个公式同理。
1.9 二维离散傅里叶变换的性质
周期性
二维傅里叶变换及其反变换在u方向和v方向是无限周期的。
其中k1和k2是整数。
傅里叶谱和相角
二维DFT通常是复函数,可用极坐标形式表示:
傅里叶谱(频谱)
频谱是图像增强中最关心的主要对象,频域下每一点(u,v)的|F(u,v)|可用来表示该频率的正弦(余弦)平面波在叠加中所占的比例。频谱直接反应频率信息,是频率域滤波的一个主要依据。
相位角
相位角表面上看并不那么直观,但它隐含着实部与虚部之间的某种比例关系,因此与图像结构息息相关。
功率谱(谱密度)
R和I分别为F(u,v)的实部和虚部。
对称性
实函数f(x,y)的傅里叶变换是共轭对称的。
虚函数f(x,y)的傅里叶变换是共轭反对称的。
傅里叶谱关于原点偶对称。
相位角关于原点奇对称。
均值
二维傅里叶正变换如下
若将系数1/MN放在正变换前,则:
故:
又因为
所以,F(0,0),即原点处的傅里叶变换值为原图像f(x,y)的平均灰度级。
小结
DFT定义及相应表达式
DFT对小结
其中第12项和第13项中的闭合表达式仅对连续变量有效。通过对闭合形式的连续表达式取样后,它们也可用于离散变量。
二、快速傅里叶变换
DFT的直接实现效率很低。一种计算离散傅里叶变换的高效算法应运而生,即为快速傅里叶变换(FFT)。
matlab中提供了fft2和ifft2函数分别计算二维傅里叶变换和反变换。它们都经过了优化,运算速度非常快;使用fftshift函数,将傅里叶频谱图中的零频点移动到频谱图的中心位置。
2.1 fft2函数
用于执行二维快速傅里叶操作,可直接用于数字图像处理。调用语法为:
Y = fft2(X)
Y = fft2(X,m,n)
其中,X为输入图像;
m和n分别用于将X的第一和第二维规整到指定的长度。当m和n均为2的整数次幂时,算法的执行速度要比m和n均为素数时更快;
Y是计算得到的傅里叶变换,是一个复数矩阵。
计算abs(Y)可得到频谱,计算angle(Y)可得到相位角
I1 = imread('C:\Users\win\Desktop\fence-climbing.jpg');
I2 = imread('C:\Users\win\Desktop\city-street.jpg');
img1 = rgb2gray(I1);
img2 = rgb2gray(I2);
F1 = fft2(img1); % 对图像进行快速傅里叶变换
temp = fftshift(F1); % 将零点移到中心
final1 = lo