Discrete Fourier Transform(DFT)
傅立葉轉換─在影像處理中可藉由這種方法,將空間域的影像轉換成頻域,藉以達到使用頻域濾波器修改的效果或是壓縮儲存。至於在程式中實作,由於沒有虛數型態的緣故,我們會用到上述的第二公式─尤拉公式,將實數和虛數分開,這樣就可以分別利用了!
在實做這個公式的過程當中,每一個F(k,l)都要用到整張圖的所有像素,所以效率會相當的差:共用到四層迴圈,前兩層跑k,l跑過整張圖的rows*cols,後兩層又再跑一次整張圖的rows*cols,共跑了rows^2*cols^2,假設原圖是512像素*512像素,F(k,l)的計算就要跑68719476736次,更不用說做轉換的運算之前還要padding成原圖的長寬更兩倍。所以說還有另外一種演算法FFT─Fast Fourier Transform可以使用,以提升整個程式的效率,在此就不多去著墨了。
直接來看結果,下圖是Lena經過dft後的樣子!
考慮效率的關係,在自己實做的轉換中使用24*24的圖片,左上角的小圖是原圖的spectrum(頻譜);右上角的是phase angle(相位角)。
Spectrum和phase angle是傅立葉轉換過後能讓人可以視覺化去辨識的圖形,因為一個複數所組成的圖片要怎麼顯示出來呢?看來是沒有辦法的,所以經過複數的實虛數運算後得到spectrum和phase angle,達到視覺化的效果。
複數運算過後,就可以將其顯示出來了,以下是拿openCV內建的dft函數計算Lena的spectrum和phase angle
Spectrum
Phase Angle
Gaussian Lowpass Filter - 高斯低通濾波器
什麼叫做低通濾波器(Lowpass Filter)呢?顧名思義,就是讓低頻的信號通過的濾波器。
而這次要實作的低通濾波器便是應用在影像處理中的「高斯低通濾波器」,又或者可以稱它叫做「平滑濾波器」,原因是我們都知道當一個影像以信號的方式表現時,其高頻的部分就是鄰近像素變化大的地方─輪廓;低頻的部分則是像素變化小的地方,所以當我們讓影像低頻部分通過而移除高頻的部分,就會將輪廓、細節的部分移除,使的影像更加平滑。
高斯平滑濾波器
由上圖可知,要轉換的圖片在頻域中,低頻(中間區域)通過,而高頻(外圍)則被過濾掉。
其原理其實就如同下面的方程式所表示:
其中x, y就是像素的位置,G(x, y)就是轉換後像素的灰階數值。
接下來,在程式實作的部分則是依照這個公式去製造filter,直接在空間域的地方執行過濾器─用兩層迴圈跑整張圖的row和column,再用兩個迴圈去跑filter,加總起來需要用的四層的迴圈才能跑完。而進行過濾之前也別忘了要依照filter的大小去進行padding。
最後來看跑過高斯低通濾波器的Lena吧!
原圖
高斯濾波器3*3
高斯濾波器5*5
這樣看起來的確是稍稍的模糊起來了,達到平滑的效果,放大後看細部可以更加明顯。
原圖和高斯濾波器3*3的比較
沒有留言:
張貼留言