到目前为止,我已经完全在空间域中实现了一个高斯模糊过滤器,利用高斯的可分离性,即沿图像的行和列应用一维高斯核。那工作得很好。
现在,仅给定空间域的 NxN 卷积矩阵的大小 N,我想在频域上实现完全相同的模糊图像。这意味着我会将图像加载到矩阵中(numpy,我正在使用 python),对其应用 FFT(然后我有 G(x,y)),然后我还必须有一个过滤器 H( u,v) 在频域中也类似于一些 2d 高斯的形状,其中心值为 1.0,然后随着离中心 I 越远,值下降到 0。然后我在频域中进行乘法(在我必须考虑对 H 进行中心偏移之前),然后应用 iFFT。
我遇到的麻烦是找到将导致相应H(u,v)的确切公式(即找到sigma,std-deviation)。从空间域中,如果给我一个掩码大小 N,我知道 std-dev sigma 可以近似为 sigma=(maskSize-1)/2/2.575,例如对于掩码大小 N=15,我得到对于 e^-(x²/2sigma²),std-dev=2.71845,现在只考虑一维情况。
但是如何获得频域的 sigma?
有趣的是,理论上我知道如何使用 Mathematica 获得 sigma,但结果是纯粹的假的,正如我可以在这里演示的那样:
gauss1d[x_, sigma_] := Exp[-(x^2)/(2 sigma^2)]
Simplify[FourierTransform[gauss1d[x, sigma], x, omega], sigma > 0]
结果是 E^(-(1/2) omega^2 sigma^2) * sigma
这是假的,因为它在 E 函数的指数中将 1/sigma² 变成了 sigma²。因此,如果你画这个,你会看到标准偏差变得更小了,因为 H(u,v)-gaussian 更“薄”了。但是,它实际上在频域中应该比在空间域中宽得多!!这没有任何意义...