s1081540 作業 4

主題:影像還原練習

作業說明

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

開發環境

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

程式實作

  • 使用 imread(path, IMREAD_GRAYSCALE) 以灰階模式讀入圖像,再使用 empty() 判斷圖片是否存在,若圖像讀取失敗會輸出錯誤訊息並結束程式。
  •  Rect() :使原圖像保證有偶數的行與列。
  • 分析輸入圖像的頻譜後,可以看到頻譜中心外有6個峰值:
    ▲ 原圖像的頻譜大小
  • 使用MATLAB找出較正確的頻譜峰值座標。
    •  imread() :讀入頻譜大小圖像。
    •  meshc() :繪製三維的圖像,顯示灰度值的大小。

    •  view() :將三維圖像改變觀測角度以便查找峰值的座標。

  • 設計notch filter
    •  circle() :以3個峰值點座標為中心,畫出圓形(加上對稱點一共6個圓點),並將圓點的值設為0。
  • 對圖像象限進行重新排列,使原點位於圖像中心。
    • 將圖像分成4個象限。
    •  copyTo() :交換象限(左上與右下進行交換、右上與左下進行交換)。
      ▲ 設計完成的notch filter

  • 創建原圖像的圖像通道,用來儲存複數的實部與虛部,並使用 merge() 來合併圖像通道。
  •  dft() :對原圖像進行離散傅立葉轉換(DFT)
  • 創建notch filter的圖像通道,用來儲存複數的實部與虛部,並使用 merge() 來合併圖像通道。
  •  mulSpectrums() :將兩個(原圖像及notch filter)傅立葉頻譜中的每個element進行相乘。
    ▲ 經過notch filter的頻譜

  •  idft() :將經過notch filter的頻譜進行IDFT(重建圖像)。
  •  split() :分離圖像通道。
  •  normalize() :歸一化,將圖像轉換到可顯示範圍(0~1)。
  •  imshow() :顯示原圖像及經過notch filter處理(去除雜訊)後的圖像。
  •  waitKey(0) :透過使用者輸入0來中止程式。

執行結果

▲ 受到雜訊干擾的原圖像(灰階)

▲ 復原後的圖像(雜訊去除)

▲ 程式執行過程

參考資料

留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1091537 Homework #1