2014年5月11日 星期日

Discrete Fourier Transform & Gaussian low pass filter

Discrete Fourier Transform & Gaussian low pass filter




這次作業實作 
DFT 和 IDFT   接著在Frenquency domain 和 spatial domain上
實作 Gaussian low pass filter

由於DFT 和 IDFT 時間複雜度為 O(N^4),所以這邊讀進來的圖盡量不要太大,
否則會計算很久,這裡實驗時,讀進一張64*64的圖片做Demo

Discrete Fourier Transform 


1一開始先讀進一張M*N的圖片 (64*64)













2.對該圖片做ZERO-Padding ,pad成2M*2N的圖 ,並且讓原圖保持在左上方



















3.為了讓之後的頻譜可以置中,將基數點*(-1)

4對此圖的顏色值存入 f(u,v) 並且做 DFT 得到 F(u,v)
    DFT 的公式為









5將得到的實數存入一個陣列,虛數存入一個陣列,並且計算Spectrum的值和Phase angle的值










6 將 Spectrum和Phase angle 的值域調整到0~255 ,但是由於Spectrum不易觀察,所以經過log處理,公式為 log (1+sqrt(r*r+i*i))























Gaussian low pass filter

(一)在頻域實作

由第一題的傅立葉轉換可以得到F(u,v)

1.計算 D(u,v) 






2計算 H(u,v)







3G(u,v)=H(u,v)*F(u,v)



4對G(u,v)做inverse





5將圖片裁切左上角轉回原圖

       D0=65                 D0=30                  

*PS 若把D0調得太低會出現破圖的問題


(二)空間域實作

1計算Mask(或稱kernel)






2對原圖周圍做Padding

3用此Mask對原圖做Convolution即可

此為filter size=3*3
標準差為1.4之結果

 
















Conclusion:

若是單單要用filtering的話,在空間域使用比較容易且快速
但若是想做其他分析的時候,則需要轉為傅立業來做分析計算
Discrete Fourier Transform 一般為O(N^4) 
若做128*128的圖片,用我的電腦需跑約12分鐘......
若使用opencv的函式則不用幾秒鐘,所以還有很大的優化空間......