使用遞迴高斯濾波器實現快速高斯模糊
高斯窗常用於對影象進行模糊或低通濾噪,但是隨著高斯半徑的增加,時間消耗會逐級增加
如高斯半徑為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