s1091536 作業4
1.題目說明:
附件中的 image4 似乎受到某種頻域雜訊干擾,撰寫一個程式嘗試復原此圖像(將圖中雜 訊去除)。
2.開發環境:
OS: Windows 11
Editor: PyCharm
Language: python 3.8
Package: OpenCV 4.7.0
3.操作:
“python .\hw4_1091536_noise-remove.py”啟動程式。
一次出現原始影像與還原影像
4.方法及實作:
(a)概念:
Step1. 計算輸入圖的離散傅立葉轉換結果
Step2. 將頻譜大小與相位角度個以灰階256色圖像方式呈現出
Step3.
對圖像進行gaussian low pass filter處理
使用子下兩條式子分別找到D(u,v)和H(u,v),再使已進行傅立葉轉換的相位角圖與H(u,v)相乘進行low pass的濾波。
Step4.
對濾波完成的圖像反傅立葉轉換
(b)程式:
Step0. 以灰階讀入影像
# Get image as gray
img = cv2.imread('image4.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Step1.
計算輸入圖的離散傅立葉轉換結果
# Opnecv2傅立葉變換函數
# 需要將影象進行一次float轉換
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
# 將頻譜低頻從左上角移動至中心位置
dft_shift =
np.fft.fftshift(dft)
# 正向結束
Step2.
將頻譜大小與相位角度個以灰階256色圖像方式呈現出
# 顯示傅立葉頻譜圖&相位圖
# 頻譜影象雙連結複數轉換為 0-255 區間
magnitude_spectrum
= 20*np.log(cv2.magnitude(...)
phase = cv2.normalize(cv2.phase(...).astype(np.uint8)
Step3. 對圖像進行gaussian low pass filter處理
# create filter
filter = gaussian(rows, cols, ...)
# filt the spectrum of img
blur = blur(dft_shift, rows, cols, filter)
Step4. 對濾波完成的圖像反傅立葉轉換
# 反向傅立葉變換開始
inv_shift = np.fft.ifftshift(blur)
invdft = cv2.idft(inv_shift)
invdft = cv2.magnitude(...)
Create Gaussian
low pass flitter
def gaussian(rows, cols, D0):
H = np.zeros((rows, cols), dtype = 'float32')
D = np.zeros((rows, cols), dtype = 'float32')
...
return H
Flit the
spectrum of img
def blur(img, rows, cols, filt):
r = np.zeros((rows, cols, 2), dtype = 'float32')
...
return r
留言
張貼留言