高斯核的FFT错误

时间:2018-09-21 05:15:25

标签: python opencv image-processing filtering fft

我正在尝试生成高斯内核的FFT,以用于以后的过滤。我的理解是,高斯核的FFT应该产生一个在视觉上类似于原始强度图像的幅度。这就是我要得到的,

Intensity and resultant fft

这是应该重现此图像的代码段。

import numpy as np
import cv2
from matplotlib import pyplot as plt

ksize       = 50
ksize       = ksize*2+1
sigma       = 15
fil         = cv2.getGaussianKernel(ksize,0)
fil         = fil * fil.T

fil_fft = cv2.dft(np.float32(fil),flags = cv2.DFT_COMPLEX_OUTPUT)
fil_shift = np.fft.fftshift(fil_fft)

magnitude_fil = 20*np.log(cv2.magnitude(fil_shift[:,:,0],fil_shift[:,:,1]))

plt.subplot(131),plt.imshow(fil)
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(magnitude_fil)
plt.title('FFT (Magnitude)'), plt.xticks([]), plt.yticks([])
plt.show()

关于我为什么得到这种T形响应的任何想法都很棒。

2 个答案:

答案 0 :(得分:2)

以“ t”形表示的结果是傅立叶域中的高斯核。当核在空间域中变宽时,它在傅立叶域中变小,因此沿轴被“压缩”了,因为不是显示 x y 轴,傅立叶变换显示的是颜色的变化率,即颜色渐变。

(1-D)高斯核的傅立叶变换为:
enter image description here

高斯函数的傅立叶变换还是高斯函数,但是现在是频率ω。在空间域中较小的内核在傅立叶域中提供较宽的内核,反之亦然。

diffusion.gaussian.kernel

(图片来源:www.stat.wisc.edu - The Gaussian kernel

高斯核的傅立叶变换充当频率的低通滤波器。截止频率取决于高斯核的尺度。傅立叶变换具有相同的高斯形状。高斯核是唯一具有相同傅立叶变换形状的核。

如果将相同的fft应用于图像的灰度版本,那么正在发生的事情可能会变得更加清晰。但实际上,ftf是一种可用于图像处理以实现不同结果的工具。这些功能大多数已预先打包到模糊滤镜,降噪功能,边缘检测等中。

如何使用fft的一个示例是一种自动旋转文本页面图像以使文本行在图像中水平的功能。

答案 1 :(得分:2)

您正确地计算了高斯的傅立叶变换,并得到了高斯返回。但是,您可以显示幅度的对数。这种对数变换使高斯看起来像抛物线,并增强了结果中非常低强度的噪声(来自数值精度问题)。

输出中的大十字叉是由于混叠造成的:此图中混叠很少,但是高斯无限大,因此即使缺少的部分非常低,也总是会被切除。强度-对数拉伸将其正确显示出来。

如果我重复您的实验并显示不带(左)和带对数拉伸(右)的FFT,您会发现差异:

enter image description here

我使用不同的软件,所以右边的图形与您的图形不同,它的噪音较小。

请注意,高斯的傅立叶变换是高斯,但是大小会不同,为explained by Mick in his answer