DM Script,为什么高斯 - kenel的傅里叶变换需要模数

时间:2017-03-18 09:29:56

标签: fft dm-script gaussianblur

最近我学习了用于TEM图像处理的DM_Script 我需要高斯模糊过程,我发现了一个名为“高斯模糊”的模型。在http://www.dmscripting.com/recent_updates.html

该代码通过将源图像的快速傅里叶变换(FFT)乘以高斯核图像的FFT并最终对其进行逆傅立叶变换来实现高斯模糊算法。

以下是代码的一部分,

// Carry out the convolution in Fourier space

compleximage fftkernelimg:=realFFT(kernelimg) (-> FFT of Gaussian-kernel image)
compleximage FFTSource:=realfft(warpimg) (-> FFT of source image)
compleximage FFTProduct:=FFTSource*fftkernelimg.modulus().sqrt()
realimage invFFT:=realIFFT(FFTProduct)

我想问的是这一点     compleximage FFTProduct:= FFTSource * fftkernelimg.modulus()。sqrt()

为什么高斯核的FFT需要' .modulus()。sqrt()'卷积?

与高斯函数的傅里叶变换成另一个高斯函数有关吗? 或者它与离散傅立叶变换的一种限制有关吗?

请回答我 感谢

1 个答案:

答案 0 :(得分:0)

这与任何浮点数值计算的一般精度限制有关。 (参见f {。here或更深入here

stand.dev的旋转(实值)高斯。 sigma应该转换成1 / sigma的100%实值旋转Gaussioan。但是,以数字方式执行此操作将显示偏差:请尝试以下操作:

number sigma = 30
number A0 = 1
realimage first := RealImage( "First", 8, 256, 256 )
first = A0 * exp( - (iradius**2/(2*sigma*sigma) ))
first.showimage()
complexImage second := FFT(first)
second.Showimage()

image nonZeroImaginaryMask = ( 0 != second.Imaginary() )
nonZeroImaginaryMask.Showimage()
nonZeroImaginaryMask.SetLimits(0,1)

然后,当您将这些复杂图像相乘时(在反向传输之前),您将引入更多错误。通过使用模数,可以确保正向变换核是纯实的,因此是更好的“阻尼”曲线。

更好地实现FFT滤波代码实际上会直接使用1 / sigma的std.dev创建FFT(高斯),因为这是分析正确的结果。如果内核(或其FFT)不是分析已知的,那么对内核进行FFT只是有意义的。

一般情况下:当在程序代码中实现任何“数学”时,它可以付出巨大的代价来考虑你脑后的数值计算限制。尽可能减少实际计算(即分析计算并使用结果而不是依赖强力数值计算)并尽可能地“重塑”方程,例如:避免对很多小数字进行大量求解,注意检查精确数值,尽量避免对小数字误差等非常敏感的表达式。