s1081540 作業 3

主題:離散傅立葉轉換 DFT 練習

作業說明

撰寫傅利葉轉換程式(Forward Fourier Transform and Inverse Fourier Transform)將一張圖像轉換至頻域後,將頻譜大小與相位角度各以灰階 256 色圖像方式呈現出,再呈現還原後圖像。

開發環境

  • Windows 10
  • OpenCV 4.2.0
  • Visual Studio 2019
  • C++

程式實作

  1. 使用 imread(path, IMREAD_GRAYSCALE) 以灰階模式讀入圖像,再使用 empty() 判斷圖片是否存在,若圖像讀取失敗會輸出錯誤訊息並結束程式。
  2.  getOptimalDFTSize() :獲得圖像的最佳尺寸大小(2的次方),如果在最佳尺寸的圖像上執行DFT可以更快地執行。
  3.  copyMakeBorder() :在圖像邊緣補0值。
  4. 創建圖像通道,儲存DFT後的實部與虛部。
  5.  dft() :進行離散傅立葉轉換(DFT)。
  6.  split() :分離圖像通道,planes[0]為實數部分,planes[1]為虛數部分。
  7.  magnitude() :將複數轉換爲magnitude(DFT的結果是複數)。
  8.  phase() :取得相位圖。
  9.  log() :因為magnitude的值範圍太大,所以換成對數的刻度(logarithmic scale),方便顯示結果。
  10. 使spectrum保證有偶數的行與列。
  11. 對DFT後的圖像象限進行重新排列,使原點位於圖像中心。
  12.  normalize() :歸一化,將圖像(magnitude、phase)轉換到可顯示範圍(0~1)。
  13.  imshow() :顯示頻譜大小、相位角度圖像。
  14.  idft() :進行IDFT(重建圖像)。
  15.  normalize() :歸一化,將圖像(IDFT)轉換到可顯示範圍(0~1)。
  16.  imshow() :顯示還原後圖像,若圖像出現黑色邊界是 copyMakeBorder() 的0值填充所形成的。
  17.  waitKey(0) :透過使用者輸入0來中止程式。

執行結果

▲ 原來的圖像(灰階)

▲ 頻譜大小

▲ 相位角度

▲ 還原後圖像

▲ 程式執行過程

參考資料

留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1091537 Homework #1