s1093340 作業4

 一、作業說明

附件中的 image4 似乎受到某種頻域雜訊干擾,撰寫一個程式嘗試復原此圖像(將圖中雜 訊去除)。

 二、開發環境

OS: Windows 11
Editor: Visual Studio Code
Compiler: GCC-12.2.0(MinGW-W64)
Language: C++
Package: OpenCV-4.6.0 

 三、程式功能

  1. 執行方式
    • 使用argv將要旋轉之圖片路徑傳入,可使用cmd執行或者直接將圖片拖曳至exe檔上面執行
      圖片拖曳執行
      使用cmd執行
  2. 查看執行結果
    • input視窗為輸入圖片
    • notch filter視窗為轉換後頻譜大小灰階圖像
    • recover視窗為還原後圖像
      input視窗

      notch filter視窗
      recover視窗
  3. 結束程式
    • 要離開程式時,按下鍵盤上任意鍵結束執行

 四、實作過程

  1. 整張圖像讀入
  2. 使用getOptimalDFTSize()取得最佳化的圖片大小
  3. 使用copyMakeBorder()將不圖片不足最佳化的邊緣處填上0
  4. 建立一個雙通道的矩陣 planes,用來存放傅立葉轉換後複數的實部及虛部
  5. 使用dft()進行離散傅立葉轉換
  6. 使用split()將轉換結果拆解成實部及虛部存放至planes
  7. 轉換頻譜
    1. 使用magnitude()將離散傅立葉轉換後的結果轉換成振幅值
    2. 換後振幅值不適合直接顯示,因此將原本的線性尺度替換成對數尺度
    3. 將奇數行及奇數列裁切掉
    4. 將圖片分為四塊,左上右下交換、右上左下交換,重新排列四個象限,使原點位於圖片中心,方便操作
  8. 轉換相位角
    1. 使用phase()將離散傅立葉轉換後的結果轉換成相位角
  9. 使用notch filter將頻譜中的雜訊消除
    notch filter

  10. 將頻譜分為四塊,左上右下交換、右上左下交換,重新排列四個象限,還原成原始的頻譜
  11. 使用polarToCart()將頻譜與相位角合併為複數的實部及虛部
  12. 使用merge()將複數的實部及虛部合併
  13. 使用idft()將合併的結果還原成圖片
  14. 正規化圖片
  15. 建立一個3*3的遮罩
    3*3的遮罩

  16. 使用filter2D()將圖片依據遮罩進行邊緣強化
  17. 使用medianBlur()濾除雜訊
  18. 輸出結果
    結果

留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1061637 作業6