s1091438 作業4

  

影像還原練習

一、題目說明

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

二、開發環境

        OS : Windows 11
        Editor : Visual Studio Code
        Language : Python
        Package : OpenCV - 4.7.0

三、使用Function說明

       (a) 原圖

            1imread() 從檔案中讀取一張灰階圖像

       (b) 傅立葉

            1cv2.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獲得的新數組轉成去雜質後的原圖

             1np.fft.ifftshift() : 將中心化後的頻譜移回原位置
            2cv2.idft() : 逆傅立葉轉換,將頻域圖像轉換回時域圖像。
            3cv2.magnitude() : 此處用來計算逆變換後的圖像的大小。

       (e) 展示圖片

            1. 利用matplotlib繪圖函數plt.subplot展示四張圖片

四、實作例圖

(a)原圖片
(b)經傅立葉轉換後的圖片
(c)將有雜質的點在(b)圈起來
(d)反轉傅立葉,轉成去雜質後的原圖
(e)半徑 +- 10(效果較佳的(d)圖)

四、參考資料

五、實作影片






留言

這個網誌中的熱門文章

rzwang Homework #1

s1101438 Homework #1

s1093309 作業6