到目前为止,我已经完全在空间域中实现了高斯模糊滤镜,利用了高斯的可分离性,即沿着行应用1D高斯核,然后沿着图像的列应用。这很好。
现在,仅给出空间域的NxN卷积矩阵的大小N,我想在频域上获得完全相同的模糊图像。这意味着我将图像加载到矩阵中(numpy,我正在使用python),对它应用FFT(然后我有G(x,y)),然后我还必须有一个滤波器H( u,v)在频域中,它也类似于某些2d高斯的形状,其中心值为1.0,然后值越来越偏离0离我的中心越远。然后我在频域中进行乘法(在我必须考虑进行H的中心偏移之前),然后应用iFFT。
我遇到的麻烦是找到导致相应H(u,v)的确切公式(即找到sigma,std-deviation)。从空间域,如果给出了掩码大小N,我知道std-dev sigma可以近似为sigma =(maskSize-1)/2/2.575,例如对于掩码大小N = 15,我得到std-dev = 2.71845对于e ^ - (x²/2sigma²),现在只考虑1D情况。
但是如何获得频域的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) - 高斯很多“更薄”。但是,它实际上应该在频域中比在空间域中宽得多!它没有任何意义......
答案 0 :(得分:7)
高斯的傅里叶变换是高斯的,你可以从
看到http://en.wikipedia.org/wiki/Fourier_transform
但请注意,标准。开发。反转!!!!你说这是假的,但事实并非如此。在某种意义上,频域是时域的反转。
freq = 1 /时间
给出的标准偏差是及时的,当你变换它时仍然是时间(常数不会被变换)。
假设您在时间方面使用某些s找到了高斯的时间版本。您将数据转换为频率空间。您可以使用它,它将完全按照它的方式运行。例如,如果你有一个小s,那么它将导致freq标准。开发。频率版本要大。
同样,这是因为频率是时间的反转(在某种意义上再次)。
假设你的高斯具有非常小的标准。开发。然后它近似于狄拉克δ函数。我们知道这是因为在freq域中转换为正弦曲线。即,跨越整个频域的东西。 (即,具有无限标准开发(如果它是高斯)。
想象一下:你想在频域中平滑。光滑什么?高频元件,对吧?通过高斯卷积,您可以在数据附近平滑。如果标准。开发。很小,你保持更高的频率。在频域中,这意味着您要保持更多频率。但转换是频域的倍增。如果我们在频域中使用薄高斯,我们将留下一小组频率。
G(t)的* F(T) G [W] * F [W]
第一个是卷积。对于平滑滤波器,我们希望G(t)为“大”(std.dev。为大)。这意味着我们需要更少的高频成分(一种低通滤波器)。在频率。域我们乘以G [w]。这意味着G [w]必须很薄(并且以原点为中心),以便我们阻挡高点。
我认为基本上你没有意识到在时域中我们有一个卷积和频域它是一个乘法。两者中的G不能相同。如果G在时域中很薄并且在频域中很薄,则它们将不会产生相同的效果。卷积中的G薄几乎没有效果,但频率中的G很薄。域几乎完全删除所有频率(只保留非常低的频率)。