s1082046 作業 3
主題: 離散傅立葉轉換 DFT 練習
撰寫傅利葉轉換程式(Forward Fourier Transform and Inverse Fourier Transform)將一張圖像轉換至頻域後,將頻譜大小與相位角度各以灰階256色圖像方式呈現出,再呈現還原後圖像。一、 開發環境:
- Windows 11
- Visual Studio 2022 C++
- OpenCV 4.7.0
二、 程式功能:
(一) 主程式
Step1: 利用imread()以IMREAD_GRAYSCALE讀入灰階原圖。
Step2: 將原圖resize成長寬皆原來一半的大小,以適當大小顯示。
原圖灰階結果
(二) 副程式(DFT)
1. 傅立葉轉換
Step1:
利用getOptimalDFTSize()分別獲取做DFT時適當的長、寬。
Step2:
擴展圖像矩陣,對input圖像做padding,邊界部分補0。
Step3: 建一個雙通道的矩陣planes,用來存放複數的實部和虛部。
Step4:
利用merge()將兩個通道合併成transform_array。
Step5:
利用dft(transform_array, transform_array)進行傅立葉轉換。
Step6: 用split()將兩個通道分開,一個表示實部,一表示虛部(planes[0]、planes[1])。
Step7:
magnitude(planes[0], planes[1], output) 計算複數的振幅(頻譜圖),並存於output內。
Step8: 利用phase(planes[0], planes[1], angle)來獲得相位圖,相位圖存於angle中。
Step9: 對頻譜圖取對數log
Step10: 將頻譜圖正規化至0~255
Step11: 為使原點位於頻譜圖中心,必須重新排列傅立葉轉換後圖像的象限,利用交換象限
中心化。
Step12: 顯示存於output中的頻譜圖。
2. 逆傅立葉轉換
將transform_array傅立葉轉換結果,利用idft()逆轉換回原圖像。
相位圖結果
頻譜圖結果
逆轉換回原圖之結果
留言
張貼留言