作業說明:
離散傅立葉轉換 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.fftshift將0頻率移到中間(有實部跟虛部)
·
用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
· 用np.fft.fft2函數作傅立葉轉換
· 用np.fft.fftshift將0頻率移到中間(有實部跟虛部)
(2)
· 做zero_paded把(M,N)的變成(2* M,2 * N)的圖片後乘上(-1)x+y
· 產生Gaussian Low-Pass filter, size = (2* M,2 * N), center = (M,N), D0 = 50
- Filter 在輸出圖片的時候有乘上255
·
把spectrum的部分和filter做np.multiply取得G(u,v)
·
用這三行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)
執行結果: Spectrum 的部分在輸出圖片時都有做20 * log (1 + Specrtum)
原圖
(1)
Spectrum Phase (輸出時做astype(np.uint8))
(2)
沒有留言:
張貼留言