OpenCV Python - 傅里叶变换



傅里叶变换用于将图像从空间域转换到频域,方法是将其分解为正弦和余弦分量。

对于数字图像,基本的灰度图像值通常在0到255之间。因此,傅里叶变换也需要是**离散傅里叶变换 (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)

这里:

  • src - 可以是实数或复数的输入数组。
  • dst - 输出数组,其大小和类型取决于标志。
  • flags - 变换标志,表示 DftFlags 的组合。

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

cv.idft(src, dst, flags)

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

示例

以下是使用 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()

输出

Fourier Transform
广告