1. 作業說明:
- 離散傅立葉轉換(DFT)
撰寫程式讀取一張256色灰階圖像。
(1) 計算輸入圖的離散傅立葉轉換結果,並將頻譜大小與相位角度以灰階256色圖像 方式呈現出。
(2) 對圖像利用Gaussian Low-Pass filter處理,輸出平滑後圖像。
2. 開發環境:
- Windows 10
- Visual Studio 2017
- OpenCV 4.5.5
3. 程式流程:
- 首先,輸入圖片完整路徑及名稱。利用imread(path, IMREAD_GRAYSCALE)以灰階模式讀取圖片。
👉 若是讀取失敗,將跳出提示,並結束程式。
- 接著,將圖片進行零填充,圖片大小改為PxQ。P=2M, Q=2N(輸入原圖像f(x, y)大小為MxN)。利用copyMakerBroder()函數實現零填充。
- 進入自訂義函數calculateDFT(),計算圖像的DFT。
- 傳入的參數: 填充後的圖像、DFT結果圖像、實部圖像、虛部圖像。
- 定義圖像是由實數及複合數兩種圖像組合成的。
- dft()實現離散傅立葉轉換。
- 求得DFT圖像外,同時存取實部圖像-Re(F)、虛部圖像-Imag(F),以利後續求頻譜、相位角的計算。
- 呼叫自訂義get_spectrum(),求頻譜圖像。
- 傳入參數:Re(F)、Imag(F)。
- Spectrum公式
- 利用for迴圈,結合|F(u,v)| = sqrt[R^2(u,v) + I^2(u,v)],計算求得頻譜圖像。
- 因為傅立葉變換後的結果對於在顯示器來講範圍太大,對於一些小的變化或是高的變換值不能進行觀察,為了達到視覺化效果,將linear scale轉變為logarithmic scale => 公式 M1 = log(1 + M)
- 呼叫自訂義fftshift()函數,重新排列傅立葉影像中的象限,使得原點位於影像中心
- 歸一化處理,用0-1之間的浮點數將矩陣變換為可視的影象格式。
- 最後,得到頻譜圖像,並輸出顯示。
- 呼叫自訂義get_phase_angle(),求相位角圖像。
- 傳入參數:Re(F)、Imag(F)。
- Phase Angle公式
- 利用for迴圈,結合 atan(I(u,v)/R(u,v)),計算求得相位角圖像。
- 呼叫自訂義fftshift()函數,重新排列傅立葉影像中的象限,使得原點位於影像中心
- 歸一化處理
- 最後,得到相位角圖像,並輸出顯示。
- 呼叫自訂義get_gaussian_lowpass_filter(),求經Gaussian Low Pass Filter後的平滑圖像。
- 傳入參數:DFT圖像、零填充的圖像。
- Gaussian Low Pass Filter公式
- 依照公式結合for迴圈計算出H(u,v),部分程式碼如下:
- 接著算出積G(u,v) = F(u,v) * H(u,v)。
- IDFT及normalize來獲取處理後圖像。
- 最後,裁剪原尺寸MxN大小的圖像,並利用imshow()顯示。
沒有留言:
張貼留言