轉載:如何確定高斯濾波的標準差和窗口大小

原文地址如下:

高斯函數與高斯濾波

一維高斯函數我們都熟悉,形式如下:

 

G(x)=12π−−√σexp(−x22σ2)G(x)=12πσexp⁡(−x22σ2)

計算機視覺中,高斯濾波使用的高斯核爲xx和yy兩個一維高斯的乘積,兩個維度上的標準差σσ通常相同,形式如下:

 

G(x,y)=12πσ2exp(−x2+y22σ2)G(x,y)=12πσ2exp⁡(−x2+y22σ2)

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

高斯核

標準差

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

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

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

 

σx=12πσwσx=12πσw

其中,σxσx爲空域高斯的標準差,σwσw爲對應頻域高斯的標準差,在空域進行高斯平滑相當於頻域低通濾波,σxσx越大,σwσw越小,頻域高斯越集中,高頻成分削弱得越多,圖像越平滑。

從低通濾波角度考慮,可以對圖像做傅立葉變換進行頻譜分析,疊加上頻域高斯並調整查看效果,找到適合的σwσw,再推算出空域高斯所需的σxσx。

窗口大小

標準差σσ確定後,接下來需要確定窗口大小。上面講了高斯核是對連續高斯的離散近似,窗口越大自然近似越好,但高斯函數是鐘形曲線,距離中心越遠數值越小,足夠遠處可以忽略不計,但多遠算遠呢?

鍾型曲線在區間(μ−σ,μ+σ)(μ−σ,μ+σ)範圍內的面積佔曲線下總面積的68%68%,(μ−2σ,μ+2σ)(μ−2σ,μ+2σ)範圍佔95%95%,(μ−3σ,μ+3σ)(μ−3σ,μ+3σ)範圍佔99.7%99.7%,一般3σ3σ外的數值已接近於0,可忽略,半徑爲3σ3σ即窗口大小爲6σ×6σ6σ×6σ即可,通常取最近的奇數。上述3個範圍在一維和二維高斯中示意如下:

Gaussian n sigma 範圍

OpenCV中標準差與窗口大小的換算

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

Gaussian kernel size

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

 

σ=0.3×((ksize−1)×0.5−1)+0.8σ=0.3×((ksize−1)×0.5−1)+0.8

具體地,在函數getGaussianKernel中,當ksize不大於7時,直接從內部的small_gaussian_tab取對應大小的高斯核,若大於7,則使用上式計算出σσ然後套用高斯公式,最後再歸一化。

getGaussianKernel

在實際使用時,爲了高效,卷積核通常取[0,255][0,255]範圍內的整數(1個Byte),因此高斯核中心最大取值爲255時,窗口尺寸的選取只需讓高斯核邊界值剛好大於0即可。令高斯核尺寸爲nn,半徑爲rr,r=n−12r=n−12,高斯核xx軸上邊界(r,0)(r,0)處與中心(0,0)(0,0)處數值之比如下:

 

G(r,0)G(0,0)=exp(−r22×(0.3(r−1)+0.8)2)G(r,0)G(0,0)=exp⁡(−r22×(0.3(r−1)+0.8)2)

當rr足夠大,其極限爲exp(−12×0.32)=0.00386592exp⁡(−12×0.32)=0.00386592,若中心值爲255,則邊界值爲255∗0.00386592=0.9858096≈1255∗0.00386592=0.9858096≈1,是合適的。但公式是如何設計出來的還不清楚,這裏只是校驗了其性質,sigh。

參考

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