資源描述:
《深入剖析高斯濾波》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、高斯濾波(高斯平滑)是數(shù)字圖像處理和計(jì)算機(jī)視覺里面最常見的操作。平時(shí),我們都是用Matlab或者OpenCV的函數(shù)調(diào)用:imfilter或者cvSmooth,并不關(guān)心底層的實(shí)現(xiàn)。然而當(dāng)開發(fā)者要自己實(shí)現(xiàn)高斯濾波的時(shí)候,往往就會(huì)很迷惘,經(jīng)常會(huì)被下面幾個(gè)問題所困擾:1、給定sigma,即標(biāo)準(zhǔn)偏差,怎么確定離散化后的濾波器窗口大?。?、給定窗口大小,怎么計(jì)算高斯核的sigma,即標(biāo)準(zhǔn)偏差?3、怎么實(shí)現(xiàn)可分離濾波器?在網(wǎng)上搜了一下,還真沒幾個(gè)人把實(shí)現(xiàn)的細(xì)節(jié)講清楚了。這里,我嘗試結(jié)合三份源碼,做個(gè)小小的總結(jié)。三份源碼分別是:
2、1、OpenCV中的cvfilter.cpp2、autopano-sift-c中的GaussianConvolution.c3、GIMP中的blur-gauss.c和unsharp-mask.c在圖像處理中,高斯濾波一般有兩種實(shí)現(xiàn)方式,一種是用離散化的滑動(dòng)窗口進(jìn)行卷積運(yùn)算,另一種則是通過傅里葉變換來實(shí)現(xiàn)。最常見的就是第一種卷積核實(shí)現(xiàn),只有當(dāng)離散化的窗口非常大,計(jì)算非常耗時(shí)(這時(shí)可使用可分離濾波器)的情況下,可能會(huì)考慮基于傅里葉變換的實(shí)現(xiàn)方法。這里我們只討論第一種方法。二維高斯函數(shù)的形式是這樣的:有著如下的形狀:基
3、本上,離散化的主旨就是保留高斯函數(shù)中心能量最集中的中間部分,忽略四周能量很小的平坦區(qū)域。這只是個(gè)很感性的描述,具體實(shí)現(xiàn)起來,就會(huì)出現(xiàn)千奇百怪的版本。下面結(jié)合三份源碼,看看現(xiàn)實(shí)世界里的高斯平滑到底長(zhǎng)的什么樣子。首先是第一個(gè)問題:給定sigma,怎么計(jì)算窗口大小?直接上OpenCV的源碼,在cvFilter函數(shù)中:param1=cvRound(sigma1*(depth==CV_8U?3:4)*2+1)
4、1;OpenCV認(rèn)為半徑為3*sigma的窗口就是高斯函數(shù)的能量最集中的區(qū)域。(在圖像位深度不是8的時(shí)候,使用4*
5、sigma半徑的窗口?)autopan0-sift-c是圖像拼接軟件hugin里面的sift實(shí)現(xiàn),在實(shí)現(xiàn)DoG的時(shí)候需要做不同尺度的高斯平滑,在GaussianConvolution_new1函數(shù)中實(shí)現(xiàn)如下:dim=1+2*((int)(3.0*sigma));可見autopano也是實(shí)現(xiàn)的3*sigma半徑的窗口。在GIMP里,實(shí)現(xiàn)比較奇特,在blur_gauss.c的make_rle_curve函數(shù)里面,constgdoublesigma2=2*sigma*sigma;constgdoublel=sqrt(-
6、sigma2*log(1.0/255.0));intn=ceil(l)*2;if((n%2)==0)n+=1;從效果來看,這個(gè)實(shí)現(xiàn)的窗口半徑是約等于2.2*sigma。然后是第二個(gè)問題:給定窗口大小,怎么計(jì)算sigma?OpenCV的實(shí)現(xiàn),在cvFilter.cpp的init_gaussian_kernel函數(shù)中:sigmaX=sigma>0?sigma:(n/2–1)*0.3+0.8;sigma的大小約為窗口半徑的0.3倍再加上0.8。autopano沒有實(shí)現(xiàn)這個(gè)特性。GIMP的實(shí)現(xiàn):/*wewanttogen
7、erateamatrixthatgoesoutacertainradius*fromthecenter,sowehavetogooutceil(rad-0.5)pixels,*inlcudingthecenterpixel.Ofcourse,that’sonlyinonedirection,*sowehavetogothesameamountintheotherdirection,butnotcount*thecenterpixelagain.Sowedoublethepreviousresultandsubtr
8、act*one.*Theradiusparameterthatispassedtothisfunctionisusedas*thestandarddeviation,andtheradiusofeffectisthe*standarddeviation*2.It’salittleconfusing.*/radius=fabs(radius)+1.0;std_dev=radius;radius=std_dev*2;/*goout‘radius’ineachdirection*/matrix_length=2*cei
9、l(radius–0.5)+1;注釋講的很清楚了,基本上就是認(rèn)為sigma應(yīng)該等于窗口半徑的一半。看完這三份源碼,結(jié)論就是,關(guān)于sigma和窗口的大小,你愛怎么算都可以,這個(gè)由你的實(shí)際需要決定,別太離譜就行。(根據(jù)概率理論,高斯分布的樣本絕大部分集中在3倍標(biāo)準(zhǔn)差以內(nèi)的區(qū)域。)第三個(gè)問題是可分離濾波器:首先說明為什么要使用可分離濾波器。實(shí)際上,模板運(yùn)算(滑動(dòng)窗口卷積)在數(shù)字