首页 > 解决方案 > 高斯核的 FFT 不正确

问题描述

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

强度和合成 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 形响应的任何想法都会很棒。

标签: pythonopencvimage-processingfilteringfft

解决方案


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

输出中的大交叉是由于混叠造成的:这个图中混叠非常少,但是高斯是无限大的,所以总是会被截断,即使丢失的部分强度非常非常低——对数拉伸只是把它拿出来。

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

在此处输入图像描述

我使用不同的软件,所以我在右边的数字看起来和你的不一样,它有更少的噪音。

请注意,高斯的傅里叶变换是高斯的,但大小会有所不同,正如Mick 在他的回答中所解释的那样。


推荐阅读