python - 高斯核的 FFT 不正确

标签 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 形响应的任何想法都很好。

最佳答案

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

输出中的大交叉是由于混叠:该图中的混叠很少,但高斯无限大,因此总是会被切断,即使缺失的部分非常非常低强度 - 对数拉伸(stretch)恰好将其表现出来。

如果我重复您的实验并显示没有(左)和有对数拉伸(stretch)(右)的 FFT,您会看到不同之处:

enter image description here

我用的是不同的软件,所以我右边的图和你的不一样,噪音小一些。

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

关于python - 高斯核的 FFT 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52437002/

相关文章:

python - 将特定行插入数据框中的其他组

python - 您可以使用组对象提取 hdf5 的文件对象吗?

python - Python 列表推导式中的 Lambda 表达式

python - 使用 NetworkX 计算 SimRank?

c++ - 视频稳定的最佳算法

c++ - 如何在 OpenCV 中使用高斯过滤单列垫

c - 使用opencv分割图像中的对象

opencv - 使用离散傅立叶变换 [OpenCV] 查找高频

python - OpenCV(4.2.0) (-206 :Bad flag (parameter or structure field)) Unrecognized or unsupported array type in function 'cvGetMat'

python - 使用 Python/PIL 检测 HSV 颜色空间(来自 RGB)中的阈值