2017-03-18 76 views
1

最近我學會DM_Script的TEM圖像處理 我需要高斯模糊過程,我發現了一個名爲「高斯模糊」在http://www.dmscripting.com/recent_updates.htmlDM腳本,爲什麼傅立葉高斯kenel的變換需要模

此代碼通過將源圖像的快速傅里葉變換(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()'用於卷積?

它與高斯函數的傅里葉變換變成另一個高斯函數有關嗎? 或者它涉及到離散傅立葉變換的一種限制?

請回答我 感謝

回答

0

這涉及到任何浮點數字計算的精度一般限制。 (參見f.e. here或更深入here

stand.dev的旋轉(實值)高斯。西格瑪應轉化爲1 /西格瑪的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只是有意義的。

一般來說:將任何「數學」應用到程序代碼中時,它可以付出巨大的代價,在腦海中用數值計算極限來考慮它。儘可能減少實際計算量(即分析計算並使用結果而不是依賴強力數值計算),並嘗試在可能的情況下「重塑」方程f.e.避免在很多小數字上進行大額結算,小心檢查確切的數字值,儘量避免對小數字錯誤非常敏感的表達式等。