Opencv Python 简明教程

OpenCV Python - Fourier Transform

傅里叶变换通过将其分解为正弦分量和余弦分量来将图像从其空间域转换到其频域。

在数字图像的情况下,基本的灰度图像值通常在 0 到 255 之间。因此,傅里叶变换也需要是 Discrete Fourier Transform (DFT) 。它用于找到频域。

从数学上讲,二维图像的傅里叶变换表示如下 −

\mathrm{F(k,l)=\displaystyle\sum\limits_{i=0}^{N-1}\: \displaystyle\sum\limits_{j=0}^{N-1} f(i,j)\:e^{-i2\pi (\frac{ki}{N},\frac{lj}{N})}}

如果幅值在短时间内变化很快,你可以说它是一个高频信号。如果变化缓慢,则它是一个低频信号。

在图像的情况下,幅值在边缘点或噪声处发生急剧变化。因此,边缘和噪声是图像中的高频内容。如果幅值没有太大变化,则它是一个低频分量。

OpenCV 为此目的提供了 cv.dft()cv.idft() 函数。

cv.dft() 执行一维或二维浮点数组的离散傅里叶变换。命令如下所示 −

cv.dft(src, dst, flags)

在此,

  1. src − 可能是实数或复数的输入数组。

  2. dst − 输出数组,其大小和类型取决于标志。

  3. flags − 转换标志,表示 DftFlags 的组合。

cv.idft() 计算一维或二维数组的离散傅里叶逆变换。命令如下所示 −

cv.idft(src, dst, flags)

为了获得离散傅里叶变换,将输入图像转换为 np.float32 数据类型。然后使用获得的变换将零频率分量移到频谱的中心,从中计算幅度谱。

Example

下面是使用 Matplotlib 的程序,我们绘制原始图像和幅度谱 −

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('lena.jpg',0)
dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

Output

fourier transform