天天看點

圖像處理之高斯濾波1. 高斯函數與高斯濾波2. 标準差3. 視窗大小4. OpenCV中标準差與視窗大小的換算5. 最後

圖像處理之高斯濾波1. 高斯函數與高斯濾波2. 标準差3. 視窗大小4. OpenCV中标準差與視窗大小的換算5. 最後

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π

​σ1​exp(−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πσ21​exp(−2σ2x2+y2​)

高斯濾波(平滑),即用某一尺寸的二維高斯核與圖像進行卷積。高斯核是對連續高斯函數的離散近似,通常對高斯曲面進行離散采樣和歸一化得出,這裡,歸一化指的是卷積核所有元素之和為1,下圖為标準高斯和σ=1.4大小為5×5的高斯核。

圖像處理之高斯濾波1. 高斯函數與高斯濾波2. 标準差3. 視窗大小4. OpenCV中标準差與視窗大小的換算5. 最後

2. 标準差

當 μ = 0 μ=0 μ=0時,唯一需要控制的參數就是标準差 σ σ σ,多少合适呢?σ的确定十分依賴于問題背景,需要具體問題具體分析。但了解σ的作用,可以指導調整的方向。

高斯核可以看成是與中心距離負相關的權重。平滑時,調整σ實際是在調整周圍像素對目前像素的影響程度,調大σ即提高了遠處像素對中心像素的影響程度,濾波結果也就越平滑。高斯曲線随σ變化的曲線如下:

圖像處理之高斯濾波1. 高斯函數與高斯濾波2. 标準差3. 視窗大小4. OpenCV中标準差與視窗大小的換算5. 最後

從頻域角度看,高斯函數的傅立葉變換仍是高斯,兩者标準差間的關系如下:

σ x = 1 2 π σ w \sigma_x = \frac{1}{2\pi \sigma_w} σx​=2πσw​1​

其中, σ 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個範圍在一維和二維高斯中示意如下:

圖像處理之高斯濾波1. 高斯函數與高斯濾波2. 标準差3. 視窗大小4. OpenCV中标準差與視窗大小的換算5. 最後

4. OpenCV中标準差與視窗大小的換算

在OpenCV函數createGaussianFilter中,若未指定視窗大小,通過σ推算視窗大小方式如下,半徑為σ的3或4倍:

圖像處理之高斯濾波1. 高斯函數與高斯濾波2. 标準差3. 視窗大小4. OpenCV中标準差與視窗大小的換算5. 最後

若指定了視窗大小,但未指定σ大小,則通過視窗大小推算σ的方式如下:

σ = 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,則使用上式計算出σ然後套用高斯公式,最後再歸一化。

圖像處理之高斯濾波1. 高斯函數與高斯濾波2. 标準差3. 視窗大小4. OpenCV中标準差與視窗大小的換算5. 最後

在實際使用時,為了高效,卷積核通常取[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,是合适的。但公式是如何設計出來的還不清楚,這裡隻是校驗了其性質。

5. 最後

圖像處理之高斯濾波1. 高斯函數與高斯濾波2. 标準差3. 視窗大小4. OpenCV中标準差與視窗大小的換算5. 最後

繼續閱讀