s1091438 作業4
影像還原練習
一、題目說明
附件中的 image4 似乎受到某種頻域雜訊干擾,
撰寫一個程式嘗試復原此圖像(將圖中雜訊去除)。
二、開發環境
OS : Windows 11
Editor : Visual Studio Code
Language : Python
Package : OpenCV - 4.7.0
Editor : Visual Studio Code
Language : Python
Package : OpenCV - 4.7.0
三、使用Function說明
(a) 原圖
1. imread() : 從檔案中讀取一張灰階圖像
(b) 傅立葉
1. cv2.dft() : 傅立葉轉換,將圖像轉由時域換為頻域
2. np.fft.fftshift() : 將傅立葉轉換後的頻譜中心移至圖像中心位置,便於觀察
3. cv2.magnitude() : 計算向量的長度(幅度),用於計算傅立葉變換的實部和虛部之間的歐幾
里得距離(兩點之間的直線距離),進而得到每個頻率的振幅值
4. np.log() : 為了增強高頻的幅度及降低低頻的幅度,使表現更明顯
(c) 設計Notch Filter
1. 先找出有雜質的點的中心座標,並設計半徑大小(下圖C圈起來的地方)
2. np.ones() : 此處用來創建和原圖大小相同的二維數組,所有元素初始化為1
3. 接下來,透過將位於雜訊點半徑範圍內的所有值設為0,來削弱或抑制噪聲頻率分量。 4. np.meshgrid() : 計算此處用來產生大小分別為圖像的寬、高的矩陣
(包含了所有像素的座標)
(包含了所有像素的座標)
5. np.arange() : 根據圖像的寬和高創建連續的數字序列
6. np.sqrt() : 計算每個像素到雜訊點中心的距離
7. 經過以上處理後,將第1.創建的數組中,與距離在半徑範圍內的像素對應的元素設置為 0,
以去除這些雜訊點,此處的範圍設置半徑 +- 2,若將2改為更大的數字,像是10,則效果會更
佳,如下圖(e)。最後,將此數組擴展為三維矩陣後,與(b) - 2的結果按元素相乘,得到一個
新的數組
(d) 反轉傅立葉,將(c)-5獲得的新數組轉成去雜質後的原圖
1. np.fft.ifftshift() : 將中心化後的頻譜移回原位置
2. cv2.idft() : 逆傅立葉轉換,將頻域圖像轉換回時域圖像。
3. cv2.magnitude() : 此處用來計算逆變換後的圖像的大小。
(e) 展示圖片
1. 利用matplotlib繪圖函數plt.subplot展示四張圖片
四、實作例圖
(a)原圖片
(b)經傅立葉轉換後的圖片
(c)將有雜質的點在(b)圈起來
留言
張貼留言