傅里叶变换

2019-04-14 19:45发布

官网原文

理论:

傅立叶变换用于分析各种滤波器的频率特性。对于图像,2D离散傅里叶变换(DFT)用于找到频域.快速傅里叶变换(FFT)用于计算DFT. 对于正弦信号,x(t)= Asin(2πft),我们可以说f是信号的频率,如果采用其频域,我们可以看到f处的尖峰。
如果对信号进行采样以形成离散信号,则得到相同的频域,但在[-π,π]或[0,2π]范围内是周期性的(对于N点DFT,则是[0,N]).您可以将图像视为在两个方向上采样的信号。因此,在X和Y方向上进行傅里叶变换可以得到图像的频率表示。 更直观地说,对于正弦信号,如果幅度在短时间内变化如此之快,则可以说它是高频信号。如果变化缓慢,则为低频信号。您可以将相同的想法扩展到图像.幅度在图像中的哪些地方幅度变化很大?在边缘点,或噪音.们可以说,边缘和噪声是图像中的高频内容。如果幅度没有太大变化,则它是低频分量.

Numpy中的傅里叶变换

np.fft.fft2()为我们提供了一个复杂数组的频率变换。它的第一个参数是输入图像,它是灰度图。第二个参数是可选的,它决定了输出数组的大小。如果它大于输入图像的大小,则在计算FFT之前用零填充输入图像。如果小于输入图像,则将裁剪输入图像。如果没有传递参数,则输出数组大小将与输入相同。 现在,一旦得到结果,零频率分量(DC分量)将位于左上角。 如果要将其置于中心位置,则需要在两个方向上将结果移动N/2。通过函数np.fft.fftshift()来完成。找到频率变换后,您可以找到幅度谱(the magnitude spectrum)。 具体例子请参考官网原文. 你可以在中心位置看到更多的白 {MOD}区域,显示更多的低频内容。 所以你找到了频率变换,现在你可以在频域做一些操作,比如高通滤波和重建图像,即找到逆DFT.为此,您只需通过使用尺寸为60x60的矩形窗口来移除低频信号.然后使用np.fft.ifftshift()应用反向移位,以便DC组件再次出现在左上角。然后使用np.ifft2()函数找到逆FFT.结果再次是一个复杂的数字。 你可以采取它的绝对值。 具体例子请参考官网原文. 结果显示高通滤波是边缘检测操作。这是我们在Image Gradients章节中看到的.这也表明大多数图像数据存在于光谱的低频区域.无论如何,我们已经看到如何在Numpy找到DFT,IDFT等。现在让我们看看如何在OpenCV中完成它。 如果你仔细观察结果,特别是JET颜 {MOD}的最后一个图像,你可以看到一些文物(我用红 {MOD}箭头标记的一个实例)。 它在那里显示出一些类似波纹的结构,它被称为振铃效应。它是由我们用于腌膜的矩形窗口引起的。 此腌膜转换为sinc形状,这会导致此问题。 因此矩形窗口不用于过滤。 更好的选择是高斯窗口

OpenCV中的傅里叶变换

OpenCV为此提供了cv.dft()cv.idft()函数。 它返回与之前相同的结果,但有两个通道。 第一个通道将具有结果的实部,第二个通道将具有结果的虚部。 输入图像应首先转换为np.float32。 注意: OpenCV函数cv.dft()和cv.idft()比Numpy函数更快。 但是Numpy功能更加用户友好。