天天看點

使用遞歸高斯濾波器實作快速高斯模糊

高斯窗常用于對圖像進行模糊或低通濾噪,但是随着高斯半徑的增加,時間消耗會逐級增加

如高斯半徑為N時,計算每個輸出采樣點需要計算的乘法次數為(2N+1)*模糊方向數,加法次數為2N*模糊方向數,這種情況下,當N=100時,甚至更大時,計算量是非常大的,即使進行SIMD指令集優化,在很多情況下仍然不能滿足要求,比如N=100時,優化後的彙編代碼的執行時間也通常在幾百毫秒以上,遠不能達到實時處理要求

上述的方法是使用高斯視窗對準的原理進行實作的,屬于FIR型濾波,因為對于半徑大于N的像素點,其權重取為0,即對目前點無貢獻,然而在實際中我們知道,即使在3倍标準差外的像素也應該對中心點有貢獻的,雖然很小

基于高斯濾波器的普通應用,對它的性能優化便變得很急迫,因而IIR型的高斯濾波器被研究了出來,以及被用于對邊緣檢測進行低能處理的IIR的高斯微分濾波器也同時被研究了出來,即前一個輸出采樣點對後一個輸出采樣點有貢獻,公式如下

第一遍,從左到右,或從上到下

w(n) = a0*x(n) + a1*x(n-1) - b1*w(n-1) - b2*w(n-2)

第二遍,從右到右,或從下到上

y(n) = a2*x(n) + a3*x(n+1) - b1*y(n+1) - b2*y(n+2)

其中,a0,a1,a2,a3,b1,b2為濾波系數

最後将兩遍的輸出相加之各便是最終結果

從上述兩個公式可以看出,每個輸出采樣點的計算與高斯半徑是沒有關系的,而6個濾波系數是高斯半徑的函數,隻被計算一次,這樣,對高斯半徑為50、100、300等的處理,每個輸出采樣點的計算量是相同的,都是乘法次數為8*模糊方向數,加法次數為7*模糊方向數,計算量大幅下降,在很多時候的圖像處理能滿足性能需求,并且品質不會下降,甚至CPU也能達到實時處理要求

上述的方法通常稱為并行,這是因為兩遍是分開計算的,最後将兩遍結果相加。

另一種方向稱為串行,即是将第一遍的w(n)作為第二遍的輸入

參考文獻:

(1)IIR Gaussian Blur Filter Implementation using Intel® Advanced Vector Extensions

(2)Recursively implementing the Gaussian and its derivatives

(3)Recursive Gaussian derivative Filters

(4)Recursive Gaussian Filters

繼續閱讀