【图像处理】【计算机视觉】线性邻域滤波专场:方框滤波、均值滤波与高斯滤波...
首先注意點(diǎn):關(guān)于OpenCV中的函數(shù),有老的數(shù)據(jù)結(jié)構(gòu),還有新的opencv2的數(shù)據(jù)結(jié)構(gòu),一般地區(qū)別就是IplImage*與Mat的區(qū)別,兩者大致分別對(duì)應(yīng)著C和C++內(nèi)的兩個(gè)功能一樣,但是函數(shù)名稱有別。所以,在使用中最好的辦法就是盡量查看OpenCV的手冊(cè),因?yàn)樗鼘?duì)應(yīng)的C++,C和Python版本等都寫(xiě)了出來(lái),非常好的工具不能忘了。
下面是使一些比較熱門的圖像濾波操作,對(duì)應(yīng)的是基于C++的Mat數(shù)據(jù)類型(參考:http://blog.csdn.net/pi9nc/article/details/22977297):
本篇文章中,我們一起仔細(xì)探討了OpenCV圖像處理技術(shù)中比較熱門的圖像濾波操作。圖像濾波系列文章淺墨準(zhǔn)備花兩次更新的時(shí)間來(lái)講,此為上篇,為大家剖析了“方框?yàn)V波“,”均值濾波“和”高斯濾波“三種常見(jiàn)線性鄰域?yàn)V波操作。而作為非線性濾波的“中值濾波”和“雙邊濾波”,留待我們下次剖析。
先上一張精彩截圖:
淺墨其實(shí)很希望把這篇文章寫(xiě)得精簡(jiǎn)和簡(jiǎn)明扼要,發(fā)現(xiàn)越深入寫(xiě)進(jìn)去,需要講的周邊內(nèi)容越多,于是文章越寫(xiě)越長(zhǎng),最后在word中字?jǐn)?shù)統(tǒng)計(jì)突破了一萬(wàn)。。。。。。。
因?yàn)槲恼潞荛L(zhǎng),如果詳細(xì)啃的話,或許會(huì)消化不良。在這里給大家一個(gè)指引,如果是單單想要掌握這篇文章中講解的OpenCV線性濾波相關(guān)的三個(gè)函數(shù):boxFilter,blur和GaussianBlur的使用方法的話,直接看第三部分“淺出”和第四部分“實(shí)例”就行。
?
在以后寫(xiě)的OpenCV系列文章中,淺墨暫且準(zhǔn)備將每篇博文中知識(shí)點(diǎn)都分成原理、深入、淺出和實(shí)例四大部分來(lái)講解,
第一部分為和圖像處理中線性濾波相關(guān)的理論,第二部分“深入”部分主要深入OpenCV內(nèi)部,帶領(lǐng)大家領(lǐng)略O(shè)penCV的開(kāi)源魅力,進(jìn)行OpenCV相關(guān)源碼的剖析,做到對(duì)OpenCV理解深刻,做一個(gè)高端大氣的OpenCV使用者。 第三部分“淺出”主要教會(huì)大家如何快速上手當(dāng)前文章中介紹的相關(guān)OpenCV API函數(shù)。而在第四部分,淺墨會(huì)為大家準(zhǔn)備一個(gè)和本篇文章相關(guān)的詳細(xì)注釋的綜合實(shí)例程序。
這樣的話呢,文章既不失深度,也不失快速入門的良方。希望淺墨按這樣的新思路寫(xiě)出來(lái)的文章,無(wú)論是新手還是高手,看了都能有所收獲。
給出本篇萬(wàn)字文章的結(jié)構(gòu)脈絡(luò):
?
一、理論——相關(guān)圖像處理概念介紹
二、深入——OpenCV源碼講解
三、淺出——API函數(shù)講解
四、實(shí)例——詳細(xì)注釋的博文配套程序
?
OK,我們開(kāi)始吧。
一、理論與概念講解
<1>關(guān)于平滑處理
“平滑處理“(smoothing)也稱“模糊處理”(bluring),是一項(xiàng)簡(jiǎn)單且使用頻率很高的圖像處理方法。平滑處理的用途有很多,最常見(jiàn)的是用來(lái)減少圖像上的噪點(diǎn)或者失真。在涉及到降低圖像分辨率時(shí),平滑處理是非常好用的方法。
<2>圖像濾波與濾波器
首先我們看一下圖像濾波的概念。圖像濾波,即在盡量保留圖像細(xì)節(jié)特征的條件下對(duì)目標(biāo)圖像的噪聲進(jìn)行抑制,是圖像預(yù)處理中不可缺少的操作,其處理效果的好壞將直接影響到后續(xù)圖像處理和分析的有效性和可靠性。
消除圖像中的噪聲成分叫作圖像的平滑化或?yàn)V波操作。信號(hào)或圖像的能量大部分集中在幅度譜的低頻和中頻段是很常見(jiàn)的,而在較高頻段,感興趣的信息經(jīng)常被噪聲淹沒(méi)。因此一個(gè)能降低高頻成分幅度的濾波器就能夠減弱噪聲的影響。
圖像濾波的目的有兩個(gè):一是抽出對(duì)象的特征作為圖像識(shí)別的特征模式;另一個(gè)是為適應(yīng)圖像處理的要求,消除圖像數(shù)字化時(shí)所混入的噪聲。
而對(duì)濾波處理的要求也有兩條:一是不能損壞圖像的輪廓及邊緣等重要信息;二是使圖像清晰視覺(jué)效果好。
平滑濾波是低頻增強(qiáng)的空間域?yàn)V波技術(shù)。它的目的有兩類:一類是模糊;另一類是消除噪音。(各種“兩",:))
空間域的平滑濾波一般采用簡(jiǎn)單平均法進(jìn)行,就是求鄰近像元點(diǎn)的平均亮度值。鄰域的大小與平滑的效果直接相關(guān),鄰域越大平滑的效果越好,但鄰域過(guò)大,平滑會(huì)使邊緣信息損失的越大,從而使輸出的圖像變得模糊,因此需合理選擇鄰域的大小。
關(guān)于濾波器,一種形象的比喻法是:我們可以把濾波器想象成一個(gè)包含加權(quán)系數(shù)的窗口,當(dāng)使用這個(gè)濾波器平滑處理圖像時(shí),就把這個(gè)窗口放到圖像之上,透過(guò)這個(gè)窗口來(lái)看我們得到的圖像。
濾波器的種類有很多, 在新版本的OpenCV中,提供了如下五種常用的圖像平滑處理操作方法,且他們分別被封裝在單獨(dú)的函數(shù)中,使用起來(lái)非常方便:
?
- 方框?yàn)V波——boxblur函數(shù)
- 均值濾波(鄰域平均濾波)——blur函數(shù)
- 高斯濾波——GaussianBlur函數(shù)
- 中值濾波——medianBlur函數(shù)
- 雙邊濾波——bilateralFilter函數(shù)
?
今天我們要講解的是作為線性濾波的方框?yàn)V波,均值濾波和高斯濾波。兩種非線性濾波操作——中值濾波和雙邊濾波,我們留待下次講解。
?
<3>對(duì)線性濾波器的簡(jiǎn)介
?
線性濾波器:線性濾波器經(jīng)常用于剔除輸入信號(hào)中不想要的頻率或者從許多頻率中選擇一個(gè)想要的頻率。
幾種常見(jiàn)的線性濾波器:
- 允許低頻率通過(guò)的低通濾波器。
- 允許高頻率通過(guò)的高通濾波器。
- 允許一定范圍頻率通過(guò)的帶通濾波器。
- 阻止一定范圍頻率通過(guò)并且允許其它頻率通過(guò)的帶阻濾波器。
- 允許所有頻率通過(guò)、僅僅改變相位關(guān)系的全通濾波器。
- 阻止一個(gè)狹窄頻率范圍通過(guò)的特殊帶阻濾波器,陷波濾波器(Band-stop filter)。
<4>關(guān)于濾波和模糊
關(guān)于濾波和模糊,大家往往在初次接觸的時(shí)候會(huì)弄混淆,“一會(huì)兒說(shuō)濾波,一會(huì)兒又說(shuō)模糊,什么玩意兒啊”。
沒(méi)關(guān)系,在這里,我們就來(lái)辨別一下,為大家掃清障礙。
我們上文已經(jīng)提到過(guò),濾波是將信號(hào)中特定波段頻率濾除的操作,是抑制和防止干擾的一項(xiàng)重要措施。
為了方便說(shuō)明,就拿我們經(jīng)常用的高斯濾波來(lái)作例子吧。我們知道,濾波可分低通濾波和高通濾波兩種。而高斯濾波是指用高斯函數(shù)作為濾波函數(shù)的濾波操作,至于是不是模糊,要看是高斯低通還是高斯高通,低通就是模糊,高通就是銳化。
其實(shí)說(shuō)白了是很簡(jiǎn)單的,對(duì)吧:
高斯濾波是指用高斯函數(shù)作為濾波函數(shù)的濾波操作。
高斯模糊就是高斯低通濾波。
<5>鄰域算子與線性鄰域?yàn)V波
鄰域算子(局部算子)是利用給定像素周圍的像素值的決定此像素的最終輸出值的一種算子。而線性鄰域?yàn)V波是一種常用的鄰域算子,像素的輸出值取決于輸入像素的加權(quán)和,具體過(guò)程如下圖。
鄰域算子除了用于局部色調(diào)調(diào)整以外,還可以用于圖像濾波,實(shí)現(xiàn)圖像的平滑和銳化,圖像邊緣增強(qiáng)或者圖像噪聲的去除。本篇文章,我們介紹的主角是線性鄰域?yàn)V波算子,即用不同的權(quán)重去結(jié)合一個(gè)小鄰域內(nèi)的像素,來(lái)得到應(yīng)有的處理效果。
圖注:鄰域?yàn)V波(卷積):左邊圖像與中間圖像的卷積產(chǎn)生右邊圖像。目標(biāo)圖像中藍(lán)色標(biāo)記的像素是利用原圖像中紅色標(biāo)記的像素計(jì)算得到的。
?
線性濾波處理的輸出像素值是輸入像素值的加權(quán)和 :
?
其中的加權(quán)和為 ,我們稱其為“核”,濾波器的加權(quán)系數(shù),即濾波器的“濾波系數(shù)”。
?
上面的式子可以簡(jiǎn)單寫(xiě)作:
?
其中f表示輸入像素值,h表示加權(quán)系數(shù)“核“,g表示輸出像素值
在新版本的OpenCV中,提供了如下三種常用的線性濾波操作,他們分別被封裝在單獨(dú)的函數(shù)中,使用起來(lái)非常方便:
?
方框?yàn)V波——boxblur函數(shù)
均值濾波——blur函數(shù)
高斯濾波——GaussianBlur函數(shù)
?
下面我們來(lái)對(duì)他們進(jìn)行一一介紹。
<6>方框?yàn)V波(box Filter)
方框?yàn)V波(box Filter)被封裝在一個(gè)名為boxblur的函數(shù)中,即boxblur函數(shù)的作用是使用方框?yàn)V波器(box filter)來(lái)模糊一張圖片,從src輸入,從dst輸出。
函數(shù)原型如下:
C++:?void?boxFilter(InputArray?src,OutputArray?dst,?int?ddepth,?Size?ksize,?Point?anchor=Point(-1,-1),?boolnormalize=true,?int?borderType=BORDER_DEFAULT?)?
??
參數(shù)詳解:
- 第一個(gè)參數(shù),InputArray類型的src,輸入圖像,即源圖像,填Mat類的對(duì)象即可。該函數(shù)對(duì)通道是獨(dú)立處理的,且可以處理任意通道數(shù)的圖片,但需要注意,待處理的圖片深度應(yīng)該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
- 第二個(gè)參數(shù),OutputArray類型的dst,即目標(biāo)圖像,需要和源圖片有一樣的尺寸和類型。
- 第三個(gè)參數(shù),int類型的ddepth,輸出圖像的深度,-1代表使用原圖深度,即src.depth()。
- 第四個(gè)參數(shù),Size類型(對(duì)Size類型稍后有講解)的ksize,內(nèi)核的大小。一般這樣寫(xiě)Size( w,h )來(lái)表示內(nèi)核的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
- 第五個(gè)參數(shù),Point類型的anchor,表示錨點(diǎn)(即被平滑的那個(gè)點(diǎn)),注意他有默認(rèn)值Point(-1,-1)。如果這個(gè)點(diǎn)坐標(biāo)是負(fù)值的話,就表示取核的中心為錨點(diǎn),所以默認(rèn)值Point(-1,-1)表示這個(gè)錨點(diǎn)在核的中心。
- 第六個(gè)參數(shù),bool類型的normalize,默認(rèn)值為true,一個(gè)標(biāo)識(shí)符,表示內(nèi)核是否被其區(qū)域歸一化(normalized)了。
- 第七個(gè)參數(shù),int類型的borderType,用于推斷圖像外部像素的某種邊界模式。有默認(rèn)值BORDER_DEFAULT,我們一般不去管它。
boxFilter()函數(shù)方框?yàn)V波所用的核為:
?
?
其中:
?
?
其中f表示原圖,h表示核,g表示目標(biāo)圖,當(dāng)normalize=true的時(shí)候,方框?yàn)V波就變成了我們熟悉的均值濾波。也就是說(shuō),均值濾波是方框?yàn)V波歸一化(normalized)后的特殊情況。其中,歸一化就是把要處理的量都縮放到一個(gè)范圍內(nèi),比如(0,1),以便統(tǒng)一處理和直觀量化。
而非歸一化(Unnormalized)的方框?yàn)V波用于計(jì)算每個(gè)像素鄰域內(nèi)的積分特性,比如密集光流算法(dense optical flow algorithms)中用到的圖像倒數(shù)的協(xié)方差矩陣(covariance matrices of image derivatives)
如果我們要在可變的窗口中計(jì)算像素總和,可以使用integral()函數(shù)。
<7>均值濾波
均值濾波,是最簡(jiǎn)單的一種濾波操作,輸出圖像的每一個(gè)像素是核窗口內(nèi)輸入圖像對(duì)應(yīng)像素的像素的平均值( 所有像素加權(quán)系數(shù)相等),其實(shí)說(shuō)白了它就是歸一化后的方框?yàn)V波。
我們?cè)谙挛倪M(jìn)行源碼剖析時(shí)會(huì)發(fā)現(xiàn),blur函數(shù)內(nèi)部中其實(shí)就是調(diào)用了一下boxFilter。
下面開(kāi)始講均值濾波的內(nèi)容吧。
1)均值濾波的理論簡(jiǎn)析
均值濾波是典型的線性濾波算法,主要方法為鄰域平均法,即用一片圖像區(qū)域的各個(gè)像素的均值來(lái)代替原圖像中的各個(gè)像素值。一般需要在圖像上對(duì)目標(biāo)像素給出一個(gè)模板(內(nèi)核),該模板包括了其周圍的臨近像素(比如以目標(biāo)像素為中心的周圍8(3x3-1)個(gè)像素,構(gòu)成一個(gè)濾波模板,即去掉目標(biāo)像素本身)。再用模板中的全體像素的平均值來(lái)代替原來(lái)像素值。即對(duì)待處理的當(dāng)前像素點(diǎn)(x,y),選擇一個(gè)模板,該模板由其近鄰的若干像素組成,求模板中所有像素的均值,再把該均值賦予當(dāng)前像素點(diǎn)(x,y),作為處理后圖像在該點(diǎn)上的灰度個(gè)g(x,y),即個(gè)g(x,y)=1/m ∑f(x,y) ,其中m為該模板中包含當(dāng)前像素在內(nèi)的像素總個(gè)數(shù)。
?
2)均值濾波的缺陷
均值濾波本身存在著固有的缺陷,即它不能很好地保護(hù)圖像細(xì)節(jié),在圖像去噪的同時(shí)也破壞了圖像的細(xì)節(jié)部分,從而使圖像變得模糊,不能很好地去除噪聲點(diǎn)。
?
3)在OpenCV中使用均值濾波——blur函數(shù)
blur函數(shù)的作用是,對(duì)輸入的圖像src進(jìn)行均值濾波后用dst輸出。
blur函數(shù)文檔中,給出的其核是這樣的:
這個(gè)內(nèi)核一看就明了,就是在求均值,即blur函數(shù)封裝的就是均值濾波。
?blur函數(shù)的原型:C++:?void?blur(InputArray?src,?OutputArraydst,?Size?ksize,?Point?anchor=Point(-1,-1),?int?borderType=BORDER_DEFAULT?)?
[cpp]?view plaincopy
- 第一個(gè)參數(shù),InputArray類型的src,輸入圖像,即源圖像,填Mat類的對(duì)象即可。該函數(shù)對(duì)通道是獨(dú)立處理的,且可以處理任意通道數(shù)的圖片,但需要注意,待處理的圖片深度應(yīng)該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
- 第二個(gè)參數(shù),OutputArray類型的dst,即目標(biāo)圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來(lái)初始化得到如假包換的目標(biāo)圖。
- 第三個(gè)參數(shù),Size類型(對(duì)Size類型稍后有講解)的ksize,內(nèi)核的大小。一般這樣寫(xiě)Size( w,h )來(lái)表示內(nèi)核的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
- 第四個(gè)參數(shù),Point類型的anchor,表示錨點(diǎn)(即被平滑的那個(gè)點(diǎn)),注意他有默認(rèn)值Point(-1,-1)。如果這個(gè)點(diǎn)坐標(biāo)是負(fù)值的話,就表示取核的中心為錨點(diǎn),所以默認(rèn)值Point(-1,-1)表示這個(gè)錨點(diǎn)在核的中心。
- 第五個(gè)參數(shù),int類型的borderType,用于推斷圖像外部像素的某種邊界模式。有默認(rèn)值BORDER_DEFAULT,我們一般不去管它。
<8>高斯濾波
1)高斯濾波的理論簡(jiǎn)析
?
高斯濾波是一種線性平滑濾波,適用于消除高斯噪聲,廣泛應(yīng)用于圖像處理的減噪過(guò)程。通俗的講,高斯濾波就是對(duì)整幅圖像進(jìn)行加權(quán)平均的過(guò)程,每一個(gè)像素點(diǎn)的值,都由其本身和鄰域內(nèi)的其他像素值經(jīng)過(guò)加權(quán)平均后得到。高斯濾波的具體操作是:用一個(gè)模板(或稱卷積、掩模)掃描圖像中的每一個(gè)像素,用模板確定的鄰域內(nèi)像素的加權(quán)平均灰度值去替代模板中心像素點(diǎn)的值。
大家常常說(shuō)高斯濾波最有用的濾波操作,雖然它用起來(lái),效率往往不是最高的。
高斯模糊技術(shù)生成的圖像,其視覺(jué)效果就像是經(jīng)過(guò)一個(gè)半透明屏幕在觀察圖像,這與鏡頭焦外成像效果散景以及普通照明陰影中的效果都明顯不同。高斯平滑也用于計(jì)算機(jī)視覺(jué)算法中的預(yù)先處理階段,以增強(qiáng)圖像在不同比例大小下的圖像效果(參見(jiàn)尺度空間表示以及尺度空間實(shí)現(xiàn))。從數(shù)學(xué)的角度來(lái)看,圖像的高斯模糊過(guò)程就是圖像與正態(tài)分布做卷積。由于正態(tài)分布又叫作高斯分布,所以這項(xiàng)技術(shù)就叫作高斯模糊。
圖像與圓形方框模糊做卷積將會(huì)生成更加精確的焦外成像效果。由于高斯函數(shù)的傅立葉變換是另外一個(gè)高斯函數(shù),所以高斯模糊對(duì)于圖像來(lái)說(shuō)就是一個(gè)低通濾波操作。
?高斯濾波器是一類根據(jù)高斯函數(shù)的形狀來(lái)選擇權(quán)值的線性平滑濾波器。高斯平滑濾波器對(duì)于抑制服從正態(tài)分布的噪聲非常有效。一維零均值高斯函數(shù)為:
???
其中,高斯分布參數(shù)Sigma決定了高斯函數(shù)的寬度。對(duì)于圖像處理來(lái)說(shuō),常用二維零均值離散高斯函數(shù)作平滑濾波器。
二維高斯函數(shù)為:
?
?
2)在OpenCV中使用高斯濾波——GaussianBlur函數(shù)
?
GaussianBlur函數(shù)的作用是用高斯濾波器來(lái)模糊一張圖片,對(duì)輸入的圖像src進(jìn)行高斯濾波后用dst輸出。它將源圖像和指定的高斯核函數(shù)做卷積運(yùn)算,并且支持就地過(guò)濾(In-placefiltering)。
C++: void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT ) ?
- 第一個(gè)參數(shù),InputArray類型的src,輸入圖像,即源圖像,填Mat類的對(duì)象即可。它可以是單獨(dú)的任意通道數(shù)的圖片,但需要注意,圖片深度應(yīng)該為CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
- 第二個(gè)參數(shù),OutputArray類型的dst,即目標(biāo)圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來(lái)初始化得到如假包換的目標(biāo)圖。
- 第三個(gè)參數(shù),Size類型的ksize高斯內(nèi)核的大小。其中ksize.width和ksize.height可以不同,但他們都必須為正數(shù)和奇數(shù)?;蛘?#xff0c;它們可以是零的,它們都是由sigma計(jì)算而來(lái)。
- 第四個(gè)參數(shù),double類型的sigmaX,表示高斯核函數(shù)在X方向的的標(biāo)準(zhǔn)偏差。
- 第五個(gè)參數(shù),double類型的sigmaY,表示高斯核函數(shù)在Y方向的的標(biāo)準(zhǔn)偏差。若sigmaY為零,就將它設(shè)為sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height計(jì)算出來(lái)。
- 為了結(jié)果的正確性著想,最好是把第三個(gè)參數(shù)Size,第四個(gè)參數(shù)sigmaX和第五個(gè)參數(shù)sigmaY全部指定到。
- 第六個(gè)參數(shù),int類型的borderType,用于推斷圖像外部像素的某種邊界模式。有默認(rèn)值BORDER_DEFAULT,我們一般不去管它。
?嗯,第一部分的理論介紹大概就是這些了,我們接著進(jìn)入第二部分,OpenCV的源碼剖析。
二、深入——OpenCV源碼剖析
上一篇文章中我們已經(jīng)和當(dāng)前最新版的OpenCV的源碼親密接觸過(guò)。 在這一部分中,淺墨將帶領(lǐng)大家領(lǐng)略O(shè)penCV的開(kāi)源魅力,對(duì)OpenCV中本篇文章里講解到線性濾波函數(shù)——boxFilter,blur和GaussianBlur函數(shù)以及周邊的涉及到的源碼進(jìn)行適當(dāng)?shù)钠饰觥?/span>
這樣,我們就可以對(duì) OpenCV有一個(gè)更加深刻的理解,成為一個(gè)高端大氣的OpenCV使用者。
<1>OpenCV中boxFilter函數(shù)源碼解析
我們可以在OpenCV的安裝路徑的\sources\modules\imgproc\src下的smooth.cpp源文件的第711行找到boxFilter函數(shù)的源代碼。對(duì)應(yīng)于淺墨將OpenCV 2.4.8安裝在D:\Program Files\opencv的路徑下,那么,smooth.cpp文件就在D:\ProgramFiles\opencv\sources\modules\imgproc\src路徑下。
?//-----------------------------------【boxFilter()函數(shù)中文注釋版源代碼】---------------------------- ?
// ? ? 代碼作用:進(jìn)行box Filter濾波操作的函數(shù) ?
// ? ? 說(shuō)明:以下代碼為來(lái)自于計(jì)算機(jī)開(kāi)源視覺(jué)庫(kù)OpenCV的官方源代碼 ?
// ? ? OpenCV源代碼版本:2.4.8 ?
// ? ? 源碼路徑:…\opencv\sources\modules\imgproc\src\smooth.cpp ?
// ? ? 源文件中如下代碼的起始行數(shù):711行 ?
// ? ? 中文注釋by淺墨 ?
//-------------------------------------------------------------------------------------------------------- ?
void cv::boxFilter( InputArray _src,OutputArray _dst, int ddepth, ?
? ? ? ? ? ? ? ? Size ksize, Point anchor, ?
? ? ? ? ? ? ? ? bool normalize, int borderType) ?
{ ?
? ?Mat src = _src.getMat();//拷貝源圖的形參Mat數(shù)據(jù)到臨時(shí)變量,用于稍后的操作 ?
int sdepth =src.depth(), cn = src.channels();//定義int型臨時(shí)變量,代表源圖深度的sdepth,源圖通道的引用cn ?
? ?
//處理ddepth小于零的情況 ?
? ?if( ddepth < 0 ) ?
? ? ? ?ddepth = sdepth; ?
? ?_dst.create( src.size(), CV_MAKETYPE(ddepth, cn) );//初始化目標(biāo)圖 ?
Mat dst =_dst.getMat();//拷貝目標(biāo)圖的形參Mat數(shù)據(jù)到臨時(shí)變量,用于稍后的操作 ?
? ?
//處理 borderType不為 BORDER_CONSTANT 且normalize為真的情況 ?
? ?if( borderType != BORDER_CONSTANT && normalize ) ? ?{ ?
? ? ? ?if( src.rows == 1 ) ?
? ? ? ? ? ?ksize.height = 1; ?
? ? ? ?if( src.cols == 1 ) ?
? ? ? ? ? ?ksize.width = 1; ?
} ?
? ?
//若之前有過(guò)HAVE_TEGRA_OPTIMIZATION優(yōu)化選項(xiàng)的定義,則執(zhí)行宏體中的tegra優(yōu)化版函數(shù)并返回 ?
#ifdef HAVE_TEGRA_OPTIMIZATION ?
? ?if ( tegra::box(src, dst, ksize, anchor, normalize, borderType) ) ?
? ? ? ?return; ?
#endif ?
? ?
? ? ? ?//調(diào)用FilterEngine濾波引擎,正式開(kāi)始濾波操作 ?
? ?Ptr<FilterEngine> f = createBoxFilter( src.type(), dst.type(), ?
? ? ? ? ? ? ? ? ? ? ? ? ksize, anchor,normalize, borderType ); ?
? ?f->apply( src, dst ); ?
} ?
轉(zhuǎn)載于:https://www.cnblogs.com/huty/p/8518168.html
總結(jié)
以上是生活随笔為你收集整理的【图像处理】【计算机视觉】线性邻域滤波专场:方框滤波、均值滤波与高斯滤波...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 足球队
- 下一篇: 搭建Python+Django开发环境