2022年4月13日 星期三

s1081516 作業4

作業說明:

離散傅立葉轉換 DFT練習

請撰寫一個程式,讀取一張256色灰階圖像。

(1)    計算輸入圖的離散傅立葉轉換結果,並將頻譜大小與相位角度各以灰階256色圖像方式呈現出。

(2)    對圖像利用Gaussian Low-Pass filter處理,輸出平滑後圖像。

(程式利用課本的frequency filter步驟者可得滿分,在網頁中將每個步驟結果呈現出。直接套用opencv函數得一半分數。)

開發環境:

    Windows 11
    Anaconda 4.10.3
    Python 3.9.7
    numpy 1.20.3
    opencv-python 4.5.5.62

程式說明:

cv2.imread(inputFile,cv2.IMREAD_GRAYSCALE).astype(np.float32) 讀圖片
(1)
·     np.fft.fft2函數作傅立葉轉換
·     np.fft.fftshift0頻率移到中間(有實部跟虛部)
·     np.abs取得spectrum,np.angle取得Phase
(2)
·     zero_paded(M,N)的變成(2* M,2 * N)的圖片後乘上(-1)x+y
·     np.fft.fft2取得頻譜
·     產生Gaussian Low-Pass filter, size = (2* M,2 * N), center = (M,N), D0 = 50
        -  Filter 在輸出圖片的時候有乘上255
·    
spectrum的部分和filternp.multiply取得G(u,v)
·     combined =   np.multiply(G(u,v)spectrum, np.exp(1j * 原圖片的phase)
·     用這三行code還原成圖片
  • freq_filt_img = np.real(np.fft.ifft2(combined))
  • freq_filt_img = np.abs(freq_filt_img)
  • freq_filt_img = freq_filt_img.astype(np.uint8)
·     for loop從還原後的圖片的左上取M*N的值,截切成和原圖片相同大小

執行結果:    Spectrum 的部分在輸出圖片時都有做20 * log (1 + Specrtum) 

原圖

(1)

                     Spectrum                     Phase (輸出時做astype(np.uint8))

(2)    

        平滑後圖像

沒有留言:

張貼留言