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()对1D或2D浮点数组执行离散傅里叶变换。其命令如下:
cv.dft(src, dst, flags)
在这里,
- src – 输入数组,可以是实数或复数。
- dst – 输出数组,其大小和类型取决于标记。
- flags – 变换标记,表示一组DftFlags的组合。
cv.idft()计算1D或2D数组的反离散傅里叶变换。相同的命令如下:
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()