s1093304 作業4

一、作業說明

主題: 影像還原練習

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

二、開發環境

  • Windows 10
  • Visual Studio Code 1.76.1
  • Python 3.9.15
  • OpenCV 4.6.0

三、實作過程

  • 首先使用cv2.imread('image4.png', 0),以灰階方式讀取圖像。
  • 圖一、以灰階方式讀取圖片

  • 使用np.fft.fft2()對輸入圖像執行二維傅立葉轉換,並將其結果藉由np.fft.fftshift()進行中心化處理
    圖二、進行傅立葉轉換
  • 使用20 * np.log(np.abs(fshift))計算頻譜大小,得到magnitude_spectrum
  • 使用cv2.normalize()將magnitude_spectrum進行正規化,轉成0~255 的灰階影像
    圖三、magnitude_spectrum (頻譜大小)
  • 接著執行cv2.imread('mask.png', 0)讀取名為mask的圖片
    1. 若沒有讀取到圖片,則會顯示剛剛得到的magnitude_spectrum,以設計notch filter
      • 可在magnitude_spectrum上透過點擊滑鼠左鍵在該位置點上黑點,同時點選的對稱位置也會被點上黑點,意味著可只點選頻譜的上半部分即可。
        圖四、用滑鼠在magnitude_spectrum點上黑點
      • 點選完成後,按下任意鍵就會接著進行二值化處理,將黑點以外的部分都設成白色以形成遮罩。
        圖五、形成遮罩mask
      • 顯示的同時儲存該遮罩為mask.png
      • 最後再按下任意鍵結束當前呈現視窗,並繼續執行之後的步驟。
    2. 反之則會詢問是否要重新建立mask,若選擇y則回到步驟1.,顯示剛剛得到的magnitude_spectrum,否則繼續執行之後的步驟。
  • 接著將傅立葉轉換出來的頻譜和遮罩相乘以去除noise
  • 進行傅立葉反轉換 (np.fft.ifftshift將頻譜移到原點附近 → np.fft.ifft2進行反傅立葉轉換 → np.real再取實數部分)
    圖六、進行反傅立葉轉換
  • 再透過cv2.normalize()將restored_image正規化
  • 最後藉由cv2.medianBlur(restored_image, 3)來去除圖像的噪聲後,使用cv2.imshow顯示復原後的圖像
    圖七、訊去除後的圖像

    影片Demo

留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1091537 Homework #1