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調得太低會出現破圖的問題
(二)空間域實作
2對原圖周圍做Padding
3用此Mask對原圖做Convolution即可
此為filter size=3*3
標準差為1.4之結果
Conclusion:
若是單單要用filtering的話,在空間域使用比較容易且快速
但若是想做其他分析的時候,則需要轉為傅立業來做分析計算
Discrete Fourier Transform 一般為O(N^4)
若做128*128的圖片,用我的電腦需跑約12分鐘......
若使用opencv的函式則不用幾秒鐘,所以還有很大的優化空間......