主題:離散傅立葉轉換 DFT 練習
作業說明
撰寫傅利葉轉換程式(Forward Fourier Transform and Inverse Fourier Transform)將一張圖像轉換至頻域後,將頻譜大小與相位角度各以灰階 256 色圖像方式呈現出,再呈現還原後圖像。
開發環境
- Windows 10
- OpenCV 4.2.0
- Visual Studio 2019
- C++
程式實作
- 使用 imread(path, IMREAD_GRAYSCALE) 以灰階模式讀入圖像,再使用 empty() 判斷圖片是否存在,若圖像讀取失敗會輸出錯誤訊息並結束程式。
- getOptimalDFTSize() :獲得圖像的最佳尺寸大小(2的次方),如果在最佳尺寸的圖像上執行DFT可以更快地執行。
- copyMakeBorder() :在圖像邊緣補0值。
- 創建圖像通道,儲存DFT後的實部與虛部。
- dft() :進行離散傅立葉轉換(DFT)。
- split() :分離圖像通道,planes[0]為實數部分,planes[1]為虛數部分。
- magnitude() :將複數轉換爲magnitude(DFT的結果是複數)。
- phase() :取得相位圖。
- log() :因為magnitude的值範圍太大,所以換成對數的刻度(logarithmic scale),方便顯示結果。
- 使spectrum保證有偶數的行與列。
- 對DFT後的圖像象限進行重新排列,使原點位於圖像中心。
- normalize() :歸一化,將圖像(magnitude、phase)轉換到可顯示範圍(0~1)。
- imshow() :顯示頻譜大小、相位角度圖像。
- idft() :進行IDFT(重建圖像)。
- normalize() :歸一化,將圖像(IDFT)轉換到可顯示範圍(0~1)。
- imshow() :顯示還原後圖像,若圖像出現黑色邊界是 copyMakeBorder() 的0值填充所形成的。
- waitKey(0) :透過使用者輸入0來中止程式。
執行結果
 |
▲ 原來的圖像(灰階) |
 |
▲ 頻譜大小 |
 |
▲ 相位角度 |
 |
▲ 還原後圖像 |
▲ 程式執行過程
參考資料
留言
張貼留言