Advertisement

数字图像处理与Python实现-图像变换-傅立叶变换

阅读量:

数字图像处理中,傅立叶变换是一种将图像从空间域转换到频域的重要工具。它通过将图像分解为不同频率的正弦和余弦波,揭示图像的频率特性,便于进行图像增强、去噪、压缩等操作。快速傅立叶变换(FFT)通过减少计算量,显著提高了傅立叶变换的效率。二维傅立叶变换将图像扩展到两个维度,广泛应用于图像频域滤波,能够增强或抑制特定频率的成分,从而实现图像增强或去噪。Python代码展示了如何利用FFT对图像进行变换,并通过频谱移位和显示技术,直观展示了傅立叶变换的应用效果。

数字图像处理与Python实现-图像变换-傅立叶变换

  • 数字图像处理与Python实现-图像变换-傅立叶变换
    • 1. 前言

    • 2. 傅立叶变换定义及基本概念

    • 3. 傅立叶变换的特性

    • 3. 离散傅立叶变换

      • 3.1 离散傅立变换的定义
      • 3.2 离散傅立叶变换的性质
    • 4. 快速傅立叶变换(FFT)

    • 5.二维离散傅立叶变换

    • 6. 图像处理FFT实现

1. 前言

傅立叶变换被公认为强大的数学工具,它归类于正交变换。傅立叶变换在一维信号处理中得到了广泛应用。傅立叶变换在图像处理中同样也是非常有效的工具。

2. 傅立叶变换定义及基本概念

在数学领域,傅立叶变换具有明确的定义。定义为f(x)的函数,其中f(x)满足狄里赫莱条件:

(1) 包含有有限个不连续点;
(2) 包含有有限个极限点;
(3) 如果函数绝对可积,则可得出以下两式成立:

F(u) = \int_{-\infty}^{+\infty}{f(x)e^{-j2\pi ux}}dx \tag{2-1}

f(x) = \int_{+\infty}^{-\infty}{F(u)e^{j2\pi ux}}du \tag{2-2}

在时域和频域之间进行转换时,设\omega=2\pi u,从而将上述两个公式转化为:F(u) = \int_{-\infty}^{+\infty}{f(x)e^{-j\omega x}}dx \tag{2-3}

f(x) = \int_{+\infty}^{-\infty}{F(u)e^{j\omega x}}du \tag{2-4}

这些公式(2-3)和(2-4)通常被称为傅立叶变换对。函数f(x)的傅立叶变换通常是一个复量,其表达式如下:F(\omega) = R(\omega) + jI(\omega) \tag{2-5}

或写成指数形式:

F(\omega) = |F(\omega)|e^{\phi(\omega)} \tag{2-6}

|F(\omega)| = \sqrt{R^2(\omega) + I^2(\omega)} \tag{2-7}

\phi(\omega) = \arctan{\frac{I(\omega)}{R(\omega)}} \tag{2-8}

其中,|F(\omega)|f(x)的傅立叶幅度谱,\phi(\omega)为相位谱。

该变换可轻易扩展至二维函数。满足狄利克雷条件的f(x,y)的二维傅立叶变换可表示为:

其中,F(u,v)表示变换后的函数。

F(u,v) = \int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}{f(x,y)e^{-j2\pi(ux+vy)}}dxdy \tag{2-9}

f(x,y) = \int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}{F(u,v)e^{j2\pi(ux+vy)}}dudv \tag{2-10}

二维傅立叶变换的幅度和相位如下:

|F(u,v)| = \sqrt{R^2(u,v) + I^2(u,v)} \tag{2-11}

\phi(u,v) = \arctan{\frac{I(u,v)}{R(u,v)}} \tag{2-12}

E(u,v) = R^2(u,v) + I^2(u,v) \tag{2-13}

其中,F(u,v)为幅度谱,\phi(u,v)为相伴谱,E(u,v)为能量谱。

3. 傅立叶变换的特性

(1). 具有可分离性
F(u,v)可以表示为:
\begin{aligned} F(u,v) &= \int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}{f(x,y)e^{-j2\pi(ux+vy)}}dxdy \\ &=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}{f(x,y)e^{-j2\pi(ux)} \cdot e^{-j2\pi(vx)} }dxdy \\ & = \int_{-\infty}^{+\infty} \lbrack \int_{-\infty}^{+\infty}{f(x,y)e^{-j2\pi ux}}\rbrack \cdot e^{-j2\pi(vx)} \\ & = \int_{-\infty}^{+\infty} \left\{ \mathcal{F}_x[f(x,y)] \right\} \cdot e^{-j2\pi(vx)} dy \\ & = \mathcal{F}_y \{ \mathcal{F}_x[f(x,y)]\} \end{aligned}
该二维傅里叶变换F(u,v)可以表示为两个一维傅里叶变换的组合。

(2). 线性
\mathcal{F}[a_1f_1(x,y) + a_2f_2(x,y)] = a_1\mathcal{F}[f_1(x,y)] + a_2\mathcal{F}[f_2(x,y)]

共轭对称性质:其傅立叶变换为F(u,v),其共轭函数为F^{*}(-u,-v),则有:F(u,v) = F^*(-u,-v)

旋转特性:当空间域函数绕原点旋转θ₀角时,其傅里叶变换在变换域中也绕原点旋转了θ₀角,即:f(r, \theta + \theta_0) \iff F(k, \phi + \theta_0)

(5). 比例变换性质
对于傅里叶变换F(u,v)及其缩放因子a和b,有以下性质:
其傅里叶变换为aF(u,v);
缩放后的函数f(ax,by)的傅里叶变换为1/(|ab|)F(u/a,v/b)。

(6).帕塞瓦尔(Parseval)定理
这一性质也被称为能量守恒定理。当F(u,v)为f(x,y)的傅里叶变换时,
\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}{|f(x,y)|^2}dxdy = \int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}{|F(u,v)|^2}dudv
这表明变换前后系统的能量保持不变。

(7).相关定理
f(x)g(x)分别表示一维时域中的函数,而f(x,y)g(x,y)则为二维空域中的函数,那么,我们定义以下表达式为相关运算:
f(x) \circ g(x) = \int_{-\infty}^{+\infty}{f(\alpha)g(x+\alpha)}d\alpha
f(x,y) \circ g(x,y) = \int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}{f(\alpha,\beta)g(x+\alpha,y+\beta)}d\alpha d\beta
其中,运算\circ代表相关运算,由此可导出傅里叶变换的一个关键性质,即相关定理:
f(x,y) \circ g(x,y) \iff F(u,v) \cdot G^*(u,v)
f(x,y) \cdot g^*(x,y) \iff F(u,v) \circ G(u,v)
此处,F(u,v)表示f(x,y)的傅里叶变换,G(u,v)表示g(x,y)的傅里叶变换,G^*(u,v)G(u,v)的共轭复数,g^*则表示g(x,y)的共轭复数。

(8).卷积定理
对于一维时域函数f(x)g(x),以及二维空域函数f(x,y)g(x,y),我们定义卷积运算的数学表达式为:
f(x) * g(x) = \int_{-\infty}^{+\infty}{f(\alpha)g(x-\alpha)}d\alpha,其中,\alpha为积分变量。

在公式中,卷积操作由*符号表示。基于此,我们可得,傅里叶域中的卷积定理如下:f(x,y) * g(x,y) \iff F(u,v) \cdot G(u,v)

f(x,y) \cdot g(x,u) \iff F(u,v) * G(u,v)
式中,F(u,v)G(u,v)分别是f(x,y)g(x,y)的傅立叶变换。

3. 离散傅立叶变换

3.1 离散傅立变换的定义

假设x(n)为一离散时间序列,则其DFT正变换定义式如下:
X(m) = \sum_{n=0}^{N-1}{x(n)e^{-j \frac{2\pi mn}{N}}}
其反变换定义式如下:
x(n) = \frac{1}{N}\sum_{m=0}^{N-1}{e^{j\frac{2\pi mn}{N}}}
由此可见,DFT是一种直接处理离散时间信号的傅立叶变换工具。由此可知,

  • (1)、连续时间周期信号:处理时间连续并且具有周期性的信号,其频域上离散,非周期。
  • (2)、连续时间非周期信号:处理时间连续但是不具有周期性的信号,其频域上连续,非周期。
  • (3)、离散时间非周期信号:处理时间离散,不具有周期性的信号,其频域上连续,有周期性。
  • (4)、离散时间周期信号:处理时间离散,具有周期性的信号,其频域上离散,有周期性。
    离散傅立叶变换也可以使用如下公式表示:
    如果x(t)是连续的非周期函数,其频谱X(f)就是连续的非周期谱,对周期函数来说,其傅立叶变换可以写成:
    X(m) = \frac{1}{T}\int_{-\frac{T}{2}}^{+\frac{T}{2}}{x(t)e^{-j2\pi mt}}dt

x(t)的表示式为X(m)乘以指数函数的总和。
x(t)为离散函数时,其频谱分析结果表现为一个周期性的连续频谱。
可以表示为:X(f) = \sum_{n=-\infty}^{\infty}{x(n)e^{-j2\pi nf}}

x(n) = \frac{1}{f}\int_{-\frac{f}{2}}^{+\frac{f}{2}}{X(f)e^{j2\pi nf}}df

基于以上两种情况,若函数x(n)既为离散型又为周期型,则其傅里叶变换必然表现为离散型周期频谱,具体表达式如下:
对于连续时间函数的傅里叶变换,我们采用求和运算来代替积分运算,从而得到离散傅里叶变换(DFT)公式:
X(k) = \sum_{n=0}^{N-1}{x(n)e^{-j2\pi kn/N}}
通过逆变换可以恢复原信号,其表达式为:
x(n) = \frac{1}{N}\sum_{k=0}^{N-1}{X(k)e^{j2\pi kn/N}}
这一过程表明,函数由连续向离散方向转变,使得傅里叶变换从积分运算转化为求和运算。

3.2 离散傅立叶变换的性质

  • (1). 线性
    如果时间序列x(n)y(n)各有傅立叶变换X(m)Y(m),则
    ax(n) + by(n) \iff aX(m) + bY(m)

  • (2) 对称性
    如果:x(n) \iff X(m)
    \frac{1}{N}X(n) \iff x(-m)

  • (3). 时间移位
    如果x(n) \iff X(m),序列向左或向右移动k位,则
    x(n-k) \iff X(m) \cdot W^{km}

  • (4). 频率移位
    如果x(n) \iff X(m)
    x(n) \cdot W^{-km} \iff X(m-k)

  • (5). 周期性
    如果x(n) \iff X(m)
    x(n\pm rN) = x(n)

  • (6). 偶函数
    如果x_e(n) = x_e(-n)
    X_e(m) = \sum_{n=0}^{N-1}{x_e(n)[\cos(\frac{2\pi}{N}mn)^{-jsin(\frac{2\pi}{N}mn)}]}

  • (7). 奇函数
    当满足x₀(n) = -x₀(-n)时,
    复数形式的傅里叶系数X₀(m)可表示为:
    X₀(m) = -jΣₙ₌₀^{N-1} x₀(n)·sin(2πmn/N)。
    考虑到x₀(n)为奇函数,而cos(2πmn/N)为偶函数,
    由此可知,实部之和为零,因此:
    X₀(m) = -jΣₙ₌₀^{N-1} x₀(n)·sin(2πmn/N)。

(8).卷积定理
根据卷积的定义可知:
x(n) * y(n) = \sum_{h=0}^{N-1}{x(h)y(n-h)} 则,
x(n)与y(n)的傅里叶变换的乘积等于X(m)与Y(m)的卷积。
x(n)与y(n)的乘积的傅里叶变换等于X(m)与Y(m)的卷积。

  • (9). 相关定理
    如果x(n) \iff X(m),y(n) \iff Y(m) 则,
    x(n) \circ y(n) \iff X^*(m) \cdot Y^*(m)

  • (10). 帕斯维尔定理
    如果x(n) \iff X(m),则,
    \sum_{n=0}^{N-1}{x^2(n)} = \frac{1}{N}\sum_{m=0}^{N-1}|X(m)|^2

4. 快速傅立叶变换(FFT)

离散傅立叶变换已经成为数字信号处理的重要工具,然而,它的计算量比较大,运算时间长。快速傅立叶变换(FFT)并不是一种新的变换,它是离散傅立叶变换的一种算法
对于一个有限长序列{x(n)}(0 \leq n \leq N - 1),它的傅立叶变换表示如下:
X(m) = \sum_{n=0}^{N-1}{x(n)e^{\frac{-j2\pi nm}{N}}} (其中,m=0,1,...,N-1)
因此,傅立叶变换对可以写成:
X(m) = \sum_{n=0}^{N-1}{x(n)W^{nm}}
x(n) = \frac{1}{N}\sum_{m=0}^{N-1}{X(m)W^{-nm}}
以上式子就不再做展开,展开后可以知道,离散傅立叶变换中的乘法运算有许多重复内容,因此离散傅立叶变换可以写成:
X(m) = \sum_{n=0}^{N-1}{x(n)W_{N}^{nm}}
由周期性可以得到:
X(m) = X_1(m) + W_{N}^{m}X_2(m),m=0,1,...,N-1

通过分析可知,一个N点的离散傅立叶变换可通过两个N/2点的傅立叶变换实现。离散傅立叶变换的计算时间主要取决于乘法操作,其分解后的乘法运算次数将大幅减少。快速傅立叶变换(FFT)主要分为两类:一类是基于时间域的分解方法,另一类是基于频率域的分解方法。FFT的具体实现细节在此不做深入讨论,若对此感兴趣,建议查阅相关专业文献。

5.二维离散傅立叶变换

一幅静止的图像可以看成是二维数据阵列。数字图像处理主要是二维数据处理。二维离散傅立叶变换的定义如下:
正变换为:
F(u,v) = \sum_{x=0}^{M-1}\sum_{y=0}^{N-1}{f(x,y)\exp[-j2\pi(\frac{ux}{M}+\frac{uy}{N})]} (u=0,1,2,...,M-1,v=0,1,2,...,N-1)
反变换为:
F(x,y) = \frac{1}{MN}\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}{F(u,v)\exp[j2\pi(\frac{ux}{M} + \frac{vy}{N})]}(x=0,1,2,...,M-1,y=0,1,2,...,N-1)
式中,符号F(u,v)可称为空间频率。

二维离散傅立叶变换具有以下性质:

  • 平移性
  • 旋转性

6. 图像处理FFT实现

复制代码
    import numpy as np
    import scipy
    import cv2
    
    src = np.zeros((256,256),np.uint8);
    
    src[124:132,120:136] = 255
    
    # src = cv2.imread('resources/images/circle3.jpg',0)
    
    srcf = src.astype(np.float32) / 255.0
    
    # 二维FFT变换
    srcfft = np.fft.fft2(srcf)
    
    # 转换成可以显示的数据
    srcabs = np.log( np.abs(srcfft))
    srcabs = np.clip(srcabs * 255,0,255).astype(np.uint8)
     
    # 频谱移到中心
    srcfftshift = np.fft.fftshift(srcfft)
    
    srcfftshiftabs = np.log(np.abs(srcfftshift))
    srcfftshiftabs = np.clip(srcfftshiftabs * 255,0,255).astype(np.uint8)
    
    cv2.imshow('src',src);
    cv2.imshow('srcfft',srcabs)
    cv2.imshow('srcfftshift',srcfftshiftabs)
    
    cv2.waitKey();
    cv2.destroyAllWindows()

程序运行结果:

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~