s1093306 作業3

 一.作業說明 :

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

二.開發環境 : 

  • 作業系統:    Windows10
  • 編譯器:     Visual Studio 2019
  • 程式語言:    C++
  • OpenCV版本:   4.7.0 

三.程式說明 :

  1. 依據作業說明前面步驟可以參考上課chapter04.PPT P.74的圖進行



  2.  (步驟a)先用 imread(path, 0)讀取灰階圖。(原因: 如果圖像是彩色的,將包含RGB三色道,每個色道都有自己的頻率成分。進行傅立葉轉換後,將得到三個不同的頻率域使分析變得更加複雜。而灰階只需讀取一個)
  3. (步驟b)使用copyMakeBorder()可以將圖像擴展到更大的尺寸,從而提供額外的像素來處理圖像邊緣並且避免在轉換過程中發生邊緣效應影響準確率。copyMakeBorder(src, top, bottom, left, right, borderType, value)(輸入圖像,top、bottom、left和right是指上下左右上分別增加的像素,控制邊緣的擴展方式(本次作業使用cv2.BORDER_CONSTANT: 添加一個固定值的常數邊緣),添加的像素值)
  4. getOptimalDFTSize() 可以幫我們取得長寬所要調整的最佳大小減去圖片的長寬大小即是
  5. copyMakeBorder()所需增加的值。



  6. (步驟c+d)顯示頻譜圖:
  • 先將圖像轉換為傅立葉轉換所需的浮點型,因為傅立葉變換頻率域範圍比空間域範圍要大,所以至少要用浮點的格式來存儲傅立葉變換的結果 。  img.convertTo(img, CV_32FC1);
(參考網址:https://kknews.cc/code/eq8zkoz.html)
  • 進行傅立葉轉換運算 dft(img,img,DFT_COMPLEX_OUTPUT)(輸入圖,輸出圖,輸出數字型態為複數) 。
  • 使用split(a,b)(輸入圖,輸出通道)將計算完的圖像複數分解成實部,虛部兩個通道,分別存在另外宣告的陣列(型態是Matrix)的通道裡。
  • magnitude(a,b,c)(mat通道, mat通道, 輸出圖)經過實部和虛部計算傅里葉改變後的頻譜像素變化大小,並存在圖中。傅立葉變換的結果在頻域中實部、虛部表圖的水平、垂直亮暗變化值。
  • 圖片進行取log(number+1)進行對數運算(加1是為了避免在對數運算時除以0的狀況因此設最小值為1。)
  • 因為頻譜圖像的性質,圖片的低頻分量分布在圖像的中心,而高頻分量位於圖像的四角落,為了讓頻譜圖結果顯示更明顯,對圖片進行中心化處理fftshift(img)(將頻譜圖分為左、右上以及左、右下,斜對角互換使得高頻分量在圖中央、低頻分量在四個角落)。
  • 對圖片使用正規化,將亮暗的變化值分成灰階256(格式:CV_8U)來可視化頻譜圖。
      5.顯示相位角度:
  • 使用phase()(x,y,outputimg)藉由提供實部和虛部來提取出相位資訊,它會返回一個與原始圖像大小相同的矩陣,裡面每個元素都代表對應頻率的相位角度。
  • 跟頻譜圖一樣對outputimg使用正規化將有角度元素的矩陣轉換成可視化的相位圖。
      6.還原圖像:
  • 使用逆傅立葉轉換idft()(輸入圖,輸出圖,輸出數字型態為實數)將轉換至頻域的圖換回圖像。
  • 將格式換回(格式:CV_8U)。
四.成品 :

頻譜圖
 
相位角度圖
還原圖像

五.影片 :
https://youtu.be/nbxDc-kvgps

留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1081444 Homework #7