s1093345 作業4
作業說明
- 主題:圖像復原(去除雜訊)練習
- 附件中的 image4 似乎受到某種頻域雜訊干擾,撰寫一個程式嘗試復原此圖像(將圖中雜 訊去除)。
圖一、Input Image
開發環境
- macOS 13.2.1
- Visual Studio Code 1.77.3
- Python 3.8.3
- OpenCV 4.6.0
實作過程
- 傅立葉轉換(Forward Fourier Transform)
- 計算傅立葉轉換
- 使用 np.fft.ff2(img) 將計算原始圖片 img 的二維離散傅立葉轉換取得頻率域的訊號圖像img。
- 透過 np.fft.fftshift(img) ,將上述結果 img 之頻譜低頻從左上角移動至圖像中心位置,得到中心化的頻譜圖像 DFT_img。
- 頻譜大小圖片(Magnitude Spectrum)
- 透過 np.abs(DFT_img) 對先前的頻譜圖像 DFT_img 取絕對值以計算頻譜的大小,得到Abs_DFT_img。
- 使用 np.log(Abs_DFT_img) 將上述結果 Abs_DFT_img 取log,並乘以20,得到灰階256色圖像Magnitude_spectrum。
- 使用 cv2.normalize(src, dst, alpha, beta, normal_type) 在先前的結果Magnitude_spectrum 進行正規化,dst 沒有指定最終圖片設為 none,alpha 設為0,beta 設為255,normal_type 設為 cv2.NORM_MINMAX,使圖像的亮度值範圍從0至255進行正規化。
- 使用 cv2.threshold(src, alpha, beta, type) 在先前的結果Magnitude_spectrum 進行二值化,alpha 設為 180,beta 設為 255,type 設為 cv2.THRESH_BINARY,使圖像範圍從0至180轉為黑色,顯現較亮峰值的效果圖片 treash。
- Notch Filter
- 建立Mask畫布
- 透過 np.zero(height, width, dtype) 建立 mask 畫布,height 設為 img.shape[0],width 設為 img.shape[1],dtype 設為 np.unit8。
- 使用 np.bitwise(mask) 將原本黑色的 mask 轉為白底的 mask。
- 滑鼠點擊事件
- 根據treash的較亮峰值位置,透過滑鼠去點擊,使用 cv2.circle(src, center, radius, color, type) 在去紀錄每次點擊的位置 center,並在 treash 繪製 radius 為 10 且 color 為 (255, 255, 255) 的圓。另外在在 mask 繪製 radius 為 10 且 color 為 (0, 0, 0) 的圓,按下 Enter 退出繪畫模式。
- 反傅立葉轉換(Inverse Fourier Transform)
- 計算反傅立葉轉換
- 將先前中心化的傅立葉轉換的 DFT_img 乘上 mask,得到 DFT_img 。
- 使用 np.fft.fftshift(DFT_img) 將 DFT_img 頻域訊號的中心移到左上角。
- 透過 np.fft.ifft2(IDFT_img) 計算反傅立葉轉換。
- 透過 np.abs(IDFT_img) 計算複數的絕對值。
- 使用 cv2.normalize(src, dst, alpha, beta, normal_type) 在先前的結果 IDFT_img 進行正規化,dst 沒有指定最終圖片設為 none,alpha 設為0,beta 設為255,normal_type 設為 cv2.NORM_MINMAX,使圖像的亮度值範圍從0至255進行正規化。
- 高斯模糊(GaussianBlur)
- 使用cv2.GaussianBlur(img, (kernel_size, kernel_size), 0) 去噪、模糊化,img為輸入的原始圖片,kernel_size以 3 x 3 計算,,kernel_size越大會越模糊。標準差為0。
留言
張貼留言