1. 高斯函數與高斯濾波
一維高斯函數我們都熟悉,形式如下:
G ( x ) = 1 2 π σ exp ( − x 2 2 σ 2 ) G(x) = \frac{1}{\sqrt{2\pi}\sigma} \exp(-\frac{x^2}{2\sigma^2}) G(x)=2π
σ1exp(−2σ2x2)
計算機視覺中,高斯濾波使用的高斯核為x和y兩個一維高斯的乘積,兩個次元上的标準差σ通常相同,形式如下:
G ( x , y ) = 1 2 π σ 2 exp ( − x 2 + y 2 2 σ 2 ) G(x, y) = \frac{1}{2\pi\sigma^2}\exp(-\frac{x^2+y^2}{2\sigma^2}) G(x,y)=2πσ21exp(−2σ2x2+y2)
高斯濾波(平滑),即用某一尺寸的二維高斯核與圖像進行卷積。高斯核是對連續高斯函數的離散近似,通常對高斯曲面進行離散采樣和歸一化得出,這裡,歸一化指的是卷積核所有元素之和為1,下圖為标準高斯和σ=1.4大小為5×5的高斯核。
2. 标準差
當 μ = 0 μ=0 μ=0時,唯一需要控制的參數就是标準差 σ σ σ,多少合适呢?σ的确定十分依賴于問題背景,需要具體問題具體分析。但了解σ的作用,可以指導調整的方向。
高斯核可以看成是與中心距離負相關的權重。平滑時,調整σ實際是在調整周圍像素對目前像素的影響程度,調大σ即提高了遠處像素對中心像素的影響程度,濾波結果也就越平滑。高斯曲線随σ變化的曲線如下:
從頻域角度看,高斯函數的傅立葉變換仍是高斯,兩者标準差間的關系如下:
σ x = 1 2 π σ w \sigma_x = \frac{1}{2\pi \sigma_w} σx=2πσw1
其中, σ x σ_x σx為空域高斯的标準差, σ w σ_w σw為對應頻域高斯的标準差,在空域進行高斯平滑相當于頻域低通濾波, σ x σ_x σx越大, σ w σ_w σw越小,頻域高斯越集中,高頻成分削弱得越多,圖像越平滑。
從低通濾波角度考慮,可以對圖像做傅立葉變換進行頻譜分析,疊加上頻域高斯并調整檢視效果,找到适合的 σ w σ_w σw,再推算出空域高斯所需的 σ x σ_x σx。
3. 視窗大小
标準差 σ σ σ确定後,接下來需要确定視窗大小。上面講了高斯核是對連續高斯的離散近似,視窗越大自然近似越好,但高斯函數是鐘形曲線,距離中心越遠數值越小,足夠遠處可以忽略不計,但多遠算遠呢?
鐘型曲線在區間 ( μ − σ , μ + σ ) (μ−σ,μ+σ) (μ−σ,μ+σ)範圍内的面積占曲線下總面積的68%, ( μ − 2 σ , μ + 2 σ ) (μ−2σ,μ+2σ) (μ−2σ,μ+2σ)範圍占95%, ( μ − 3 σ , μ + 3 σ ) (μ−3σ,μ+3σ) (μ−3σ,μ+3σ)範圍占99.7%,一般 3 σ 3σ 3σ外的數值已接近于0,可忽略,半徑為 3 σ 3σ 3σ即視窗大小為 6 σ × 6 σ 6σ×6σ 6σ×6σ即可,通常取最近的奇數。上述3個範圍在一維和二維高斯中示意如下:
4. OpenCV中标準差與視窗大小的換算
在OpenCV函數createGaussianFilter中,若未指定視窗大小,通過σ推算視窗大小方式如下,半徑為σ的3或4倍:
若指定了視窗大小,但未指定σ大小,則通過視窗大小推算σ的方式如下:
σ = 0.3 × ( ( k s i z e − 1 ) × 0.5 − 1 ) + 0.8 \sigma = 0.3\times((ksize - 1)\times0.5 - 1) + 0.8 σ=0.3×((ksize−1)×0.5−1)+0.8
具體地,在函數getGaussianKernel中,當ksize不大于7時,直接從内部的small_gaussian_tab取對應大小的高斯核,若大于7,則使用上式計算出σ然後套用高斯公式,最後再歸一化。
在實際使用時,為了高效,卷積核通常取[0,255]範圍内的整數(1個Byte),是以高斯核中心最大取值為255時,視窗尺寸的選取隻需讓高斯核邊界值剛好大于0即可。令高斯核尺寸為n,半徑為r,r=n−12,高斯核x軸上邊界(r,0)處與中心(0,0)處數值之比如下:
G ( r , 0 ) G ( 0 , 0 ) = exp ( − r 2 2 × ( 0.3 ( r − 1 ) + 0.8 ) 2 ) \frac{G(r, 0)}{G(0, 0)} = \exp(-\frac{r^2}{2 \times (0.3(r-1)+0.8)^2}) G(0,0)G(r,0)=exp(−2×(0.3(r−1)+0.8)2r2)
當r足夠大,其極限為 exp ( − 1 2 × 0. 3 2 ) = 0.00386592 \exp(-\frac{1}{2\times0.3^2})=0.00386592 exp(−2×0.321)=0.00386592,若中心值為255,則邊界值為255∗0.00386592=0.9858096≈1,是合适的。但公式是如何設計出來的還不清楚,這裡隻是校驗了其性質。