2022年4月14日 星期四

s1081542 作業4

作業說明:

  • 計算輸入圖的離散傅立葉轉換結果,並將頻譜大小與相位角度各以灰階256色圖像方式呈現出。
  • 對圖像利用Gaussian Low-Pass filter處理,輸出平滑後圖像。
  • 程式利用課本的frequency filter步驟者可得滿分,在網頁中將每個步驟結果呈現出。直接套用opencv函數得一半分數。

使用環境/語言:

  • Windows11
  • Visual Studio 2019
  • Opencv-4.3.0
  • C++

實作方法:

  1. 輸入圖片路徑後,會檢查是否可讀取到圖片內容,若不行,則重新輸入圖片路徑。
  2. 輸入圖片欲模糊的程度。
  3. 讀取灰階圖片,並利用copyMakeBorder函式,將圖片的長、寬都調整為原圖兩倍。
  4. 新尺寸的圖片(padded image) 的型態換成CV_32FC1,因為要對圖片的每個像素乘上(-1)^(x+y),若沒轉型態的話會報錯,乘完後將型態轉回CV_8UC1,負數即會消失。
  5. 利用高斯低通濾波器的函數定義,求出高斯低通濾波器。
  6. 利用dft函式(傅立葉轉換函式),算出新尺寸的圖片(padded image) 的複數值,然後將複數值拆成實數和虛數
  7. 利用magnitude函式,將第6點的實數和虛數轉成振幅值,再將振幅值轉成對數,然後利用normalize函式,將對數做歸一化,如此即可求出原圖的頻譜大小
  8. 利用Phase函式,將第6點的實數和虛數轉成相位角度值,然後利用normalize函式,將相位角度值做歸一化,如此即可求出原圖的相位角度
  9. 利用multiply函式,將第5點求出的高斯低通濾波器第6點的實數和虛數 互相做卷積,卷積完會得到新的實數和虛數,再利用merge函式,將新的實數和虛數,組成一個新的複數
  10. 利用idft函式(反傅立葉轉換函式),將第9點的複數值轉換成新的複數值,再利用split函式,將新的複數值,拆成新的實數和虛數
  11. 利用magnitude函式,將第10點的實數和虛數轉換成新的振幅值,此部分不需要將振幅值轉成對數,因為此部分所用的實數和虛數是利用idft函式求得的值。
  12. 利用normalize函式,將第11點的振幅值做歸一化,然後再將此部分求出的圖片,轉換成原圖片的尺寸,如此即可求出Gaussian Low-Pass filter處理後的,平滑圖像
  13. 印完圖像後,可讓使用者選擇是否要繼續輸入圖片欲模糊的程度,觀察同張圖片不同的模糊效果,若輸入^z,則回到第一點的流程

執行方式/畫面:

原圖:

image

灰階圖:


image

zero-padded image:


image

zero-padded image multiply by (-1)^(x+y):

image

高斯濾波器函數:

image

原圖的頻譜大小:


image

原圖的相位角度:


image

原圖與濾波器函數相乘的頻譜大小:

image

Gaussian filter(未調整為原尺寸):

image

Gaussian filter(調整為原尺寸):image

影片:

 


參考資料:

 

沒有留言:

張貼留言