2021年5月1日 星期六

s1071546 影像處理作業 3

作業說明:

請撰寫一個程式,讀取一張 256 色灰階圖像。

 (1)計算輸入圖的離散傅立葉轉換結果,並將頻譜大小與相位角度各以灰階 256 色圖像 方式呈現出。

 (2)對圖像利用 Gaussian Low-Pass filter 處理,輸出平滑後圖像。(程式利用課本的 frequency filter 步驟者可得滿分!)

Coding環境:

  • Windows 10 20H2
  • Anaconda 3.18.11
  • Python 3.9.1
  • OpenCV 4.5.1

程式說明:

    第一部分:
  1. 使用者在呼叫此程式時使用參數呼叫s1071546_hw3.py -i <要處理的檔案檔名> -d <高斯低通濾波器截止頻率> 來使用
  2. 使用cv2.imread將檔案載入並存成變數img
  3. 使用cv2.dft取得傅立葉轉換後的結果
  4. 呼叫np.fft.fftshift函式將zero-frequency分量移到頻譜中心
  5. 使用cv2.magnitude算出頻譜大小,並使用20*np.log換算成分貝單位
  6. 使用cv2.phase算出相位角
  7. 使用matplotlib套件將剛剛得到的頻譜大小與相位角輸出成圖表
    第二部分(與第一部分同一個檔案):
  1. 使用np.pad將原圖(MxN)變成兩倍(2Mx2N)大,並在延伸的地方都填入0
  2. 使用np.fromfunction生成(-1)^x+y操作的矩陣
  3. 將np.pad完的圖使用cv2.dft取得傅立葉轉換後的結果,存為F
  4. 用GLPF的公式製作出高斯低通濾波器,大小為(2Mx2N),存為H
  5. 將F與H相乘,存為G
  6. 使用cv2.idft反轉換,並保留實部
  7. 將cv2.idft反轉換的實部乘上(-1)^x+y操作矩陣還原
  8. 將圖的大小還原為MxN
處理結果:

原圖使用傅立葉轉換出的頻譜大小與相位角

將原圖padding成兩倍大的結果


將padding完的圖乘(-1)^x+y的結果
















padding完乘(-1)^x+y的圖傅立葉轉換完的結果,存為F




使用公式算出不同截止頻率的高斯低通濾波器,存為H




F與H相乘得到的結果,存為G
上圖為與D0=5的高斯低通濾波器相乘的結果
上圖為與D0=30的高斯低通濾波器相乘的結果
上圖為與D0=80的高斯低通濾波器相乘的結果

上圖為與D0=130的高斯低通濾波器相乘的結果



將G用IDFT反轉換後留實部並乘與(-1)^x+y的結果

D0=5
D0=30
D0=80
D0=130

將大小還原後的結果
D0=5
D0=30
D0=80
D0=130








沒有留言:

張貼留言