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

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

如高斯半徑爲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

(5)Recursivity and PDE’s in Image Processing

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章