s1091444 作業4
同步發布於 titaliu1224.github.io
功課要求
圖片似乎受到某種頻域雜訊干擾,撰寫一個程式嘗試復原此圖像。
成果
開發環境
- Windows 10
- Visual Studio Code
- Python 3.9.16
- OpenCV 4.5.4
實作
使用的 libraries 如下:
import cv2
import matplotlib.pyplot as plt
import numpy as np
1/ 使用 DFT 取得頻域圖像與頻譜圖
這裡和作業3步驟都一樣。
2/ 用滑鼠點選 notch points
notch point 通常用來消除圖像上的特定頻率,這裡我們透過觀察,可以發現頻譜圖上有六個週期性出現的亮點,所以來進行手動選取。
建立一個 function def add_notch_point(event, x, y, flags, img) 將點擊處的值設為 0。
並使用 cv2.setMouseCallback() 建立一個可供點擊的視窗。
在這裡就能知道當時有平移 DFT 圖像的好處了,可以很快的發現哪些亮點是週期性的重複出現。
3/ 平移得到的 notch points 圖像
剛才我們都是看著平移過的頻譜圖進行點擊,但原先的 DFT 結果並非這樣,所以我們要反向的把 notch points 圖像給平移回來。
4/ 套用 notch filter
將原本的 DFT 圖像的兩個通道和平移過的 notch filter 相乘,消除滑鼠點過的黑點部分,週期性雜訊就會被去除掉。
# apply notch filter
planes[0] = planes[0] * notch_points_img
planes[1] = planes[1] * notch_points_img
dftB = cv2.merge(planes)
5/ 利用反向 DFT 還原圖片
最後使用 cv2.idft() 還原圖像,由於前面已經把刪除好雜訊的 dftB 做出來了,所以這邊只要還原就能得到去除雜訊後的圖像。
總結
將影像轉換至頻域後,透過觀察可以消除一些週期性出現的亮點,從而消除週期性雜訊。
留言
張貼留言