s1072026 作業 3

作業說明

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

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

開發環境

l   Ubuntu 20.04.5 LTS

l   Visual Studio Code

l   OpenCV 3.4.16

l   C++

實作說明

1. getOptimalDFTSize():將圖片拓展成 2*3*5 的倍數,可以加速 DFT 的效率

2. copyMakeBorder():利用 getOptimalDFTSize() 拓展圖片大小後,用 copyMakeBorder() 填充拓展的範圍

3. planes:儲存 padded 的實數與虛數平面

4. complex:透過 merge() 合併實數與虛數平面

5. dft():計算離散傅立葉轉換

6. split():把轉換後的 complex 分離成實數與虛數平面

7. 計算 magnitude,並取 log 方便觀測

8. 調整轉換後的圖像,讓圖像中心對齊原點

9. normalize():將 magnitude 調整到 0 到 1 的範圍,方便視覺化

10. phase():算出相位角度

11. normalize():將 phase 調整到 0 到 1 的範圍,方便視覺化

12. 使用 idft() 還原圖像

執行結果

原圖

轉換成頻譜

轉換成相位

還原後圖像

環境設定

執行前需安裝以下套件

l   cmake

l   OpenCV 3.4.16

l   libgtk2.0-dev

l   pkg-config

n   xming

l   執行程式時需開啟

l   x11-xserver-utils

如果在 terminal 執行 xhost + 顯示 xhost: unable to open display "",需要設定 export DISPLAY=:0.0,之後執行程式就能顯示視窗。

執行方式

執行 cmake . 產生 makefile,該 makefile 用於編譯主程式時動態連結 OpenCV 函式庫與主程式,之後便可執行編譯好的程式。

參考資料

l   OpenCV: Discrete Fourier Transform

l   OpenCV: getOptimalDFTSize()

l   OpenCV: copyMakeBorder()

l   OpenCV: phase()

留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1061637 作業6