傅里叶变换及高通/低通滤波
目标
通过本篇文章的学习,你将学习到以下内容:
- 使用OpenCV查找图像的傅立叶变换
- 利用Numpy中可用的
FFT
函数 - 傅立叶变换的某些应用
- 学习到函数:
cv.dft()
,cv.idft()
前言
傅立叶变换用于分析各种滤波器的频率特性。对于图像,使用2D离散傅里叶变换(DFT)查找频域。一种称为快速傅立叶变换(FFT)的快速算法用于DFT的计算。
对于正弦信号 x ( t ) = A sin ( 2 π f t ) x(t) = A \sin(2 \pi ft) x(t)=Asin(2πft),我们可以说 f f f是信号的频率,如果采用其频域,则可以看到 f f f的尖峰。如果对信号进行采样以形成离散信号,我们将获相同的频域,但是在[-π,π]或[0,2π]范围内(对于N点DFT为[0,N])是周期性的,你可以将图像视为在两个方向上采样的信号。因此,在X 和Y方向都进行傅立叶变换,可以得到图像的频率表示。
更直观地说,对于正弦信号,如果幅度在短时间内变化如此之快,则可以说它是高频信号。如果变化缓慢,则为低频信号。你可以将相同的方式扩展到图像。图像中的振幅在哪里急剧变化?在边缘点或噪声。因此,可以说边缘和噪声是图像中的高频内容。如果幅度没有太大变化,则它是低频分量。(一些链接已添加到“其他资源”,其中通过示例直观地说明了频率变换)。
接下来,我们将学习如何找到傅立叶变换。
1. Numpy中的傅里叶变换
首先,我们将看到如何使用Numpy查找傅立叶变换。Numpy具有FFT软件包来执行此操作。np.fft.fft2()
为我们提供了频率转换,它将是一个复杂的数组。它的第一个参数是输入图像,即灰度图像。第二个参数是可选的,它决定输出数组的大小。如果它大于输入图像的大小,则在计算FFT之前用零填充输入图像。如果小于输入图像,将裁切输入图像。如果未传递任何参数,则输出数组的大小将与输入的大小相同。
现在,一旦获得结果,零频率分量(DC分量)将位于左上角。如果要使其居中,则需要在两个方向上将结果都移动 N 2 \frac{N}{2} 2N。只需通过函数np.fft.fftshift()
即可完成。(它更容易分析)。找到频率变换后,就可以找到幅度谱。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('./data/messi5.jpg', 0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Input image')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum