張 藝,匡 毅,王 梅,黃志遠(yuǎn),胡 松
(成都理工大學(xué) 信息科學(xué)與技術(shù)學(xué)院,四川 成都 610059)
近年來,隨著人工智能與計算機(jī)視覺不斷地融入人們的生活,與之相關(guān)的人體輪廓檢測技術(shù)變得越來越重要。人體輪廓檢測除了民用,還廣泛運(yùn)用于如機(jī)場社會安全以及軍事偵察掃描等領(lǐng)域。下面根據(jù)人體輪廓檢測在現(xiàn)實中的各個領(lǐng)域的應(yīng)用作簡要說明:
在自動駕駛方面,人體輪廓檢測可以運(yùn)用于實現(xiàn)車輛或駕駛?cè)藛T對于路況信息的實時精準(zhǔn)判斷,并對即將可能發(fā)生的危險進(jìn)行提前預(yù)警,以減少由于駕駛?cè)藛T注意力不集中或者疲勞駕駛等原因造成的車禍等安全隱患;在監(jiān)控系統(tǒng)方面,人體輪廓檢測可以運(yùn)用于家庭、學(xué)校、銀行、醫(yī)院等私人或公共領(lǐng)域場所,在遇到可疑人員靠近時可以通過人體輪廓檢測提前做出預(yù)警反應(yīng);在機(jī)場安全方面,人體輪廓檢測可以幫助機(jī)場安全監(jiān)管人員及時發(fā)現(xiàn)機(jī)場的安全隱患,對于機(jī)場的可疑人員或閑雜人等進(jìn)行提前預(yù)警,以減少不必要的安全事故;在軍事偵察方面,人體輪廓檢測可以幫助士兵或作戰(zhàn)指揮人員在戰(zhàn)場或演習(xí)過程中及時提早發(fā)現(xiàn)可疑人員或隱蔽的敵人。對于無人機(jī)偵察以及飛機(jī)障礙規(guī)避等方面都有較大的作用。
基于OpenCV(open computer vision library)的人體輪廓邊緣檢測算法就是在各種研究的基礎(chǔ)上逐步成型與發(fā)展并日趨成熟,對于人體輪廓檢測在線性與非線性濾波、形態(tài)學(xué)處理以及各種檢測算法方面奠定了基礎(chǔ)和重要的借鑒經(jīng)驗。
人體輪廓檢測是計算機(jī)視覺領(lǐng)域的研究熱點,但現(xiàn)如今相關(guān)的論文及文獻(xiàn)并不是很多,其中面臨的問題也還有很多。該研究圍繞基于OpenCV的人體輪廓檢測展開,利用OpenCV-3.1.0視覺庫和Visual Studio 2012組建實驗平臺,針對圖像的去噪處理、圖像的形態(tài)學(xué)處理、基于OpenCV的邊緣檢測、孔洞填充、尋找輪廓、繪制輪廓等重點和難點進(jìn)行了研究[1]。
主要研究內(nèi)容有以下幾點:
(1)對人體輪廓檢測的發(fā)展現(xiàn)狀及國內(nèi)外學(xué)者的相關(guān)研究內(nèi)容及研究現(xiàn)狀進(jìn)行調(diào)研。
(2)將搜尋獲取到的圖像進(jìn)行檢索,得到包含人體的圖像后進(jìn)行標(biāo)記與儲存。
(3)為了減少圖像上的噪點,以防圖像失真,要對標(biāo)記儲存的含有人體的圖像進(jìn)行高斯濾波。
(4)為了進(jìn)一步消除噪聲并且將圖像中獨立的元素分割出來,將去噪后的圖像進(jìn)行形態(tài)學(xué)處理,為了找出圖像中的局部最大值,對圖像進(jìn)行膨脹處理。
(5)為了更好地將圖像轉(zhuǎn)換為圖像數(shù)據(jù),進(jìn)行Sobel邊緣檢測處理。
(6)為了將人體更好地提取出來,在進(jìn)行邊緣檢測之后要對圖像進(jìn)行孔洞填充,之后進(jìn)行尋找人體輪廓以及繪制人體輪廓。
OpenCV和MATLAB都可對人體輪廓檢測進(jìn)行相關(guān)的處理[2],但OpenCV有大量優(yōu)化的代碼庫,而且可以在各種平臺上進(jìn)行圖像處理,而MATLAB的運(yùn)行較為緩慢,且計算機(jī)視覺方面的圖像處理工具箱成本較高,因此OpenCV應(yīng)用更普遍,因為其相關(guān)功能應(yīng)用完全免費,而且兩者的邊緣輪廓檢測效果差別不大。綜上所述,在計算機(jī)視覺及人體輪廓檢測方面,OpenCV更加適用。
圖像的去噪處理即是對圖像進(jìn)行濾波操作。目的在于抽出圖像的特征以及去掉數(shù)字化圖像中的噪聲成分。通過調(diào)研發(fā)現(xiàn)高斯濾波更適用于人體輪廓檢測,所以文中重點討論的對象為高斯濾波。
高斯濾波其實就是用高斯函數(shù)進(jìn)行濾波,是一種低通濾波[3]。高斯濾波是一種被廣泛使用的線性平滑濾波,雖然其效率比不上其他濾波,但在消除圖像方面一般被認(rèn)為是最有用的濾波。其原理的核心也是鄰域均值,不過和均值濾波不同的是,高斯濾波是首先設(shè)定一個模板(卷積、掩模等),然后將模塊確定的鄰域內(nèi)的像素點進(jìn)行加權(quán)平均,再將平均后的加權(quán)平均灰度值賦予模塊中心像素點。高斯濾波可以這樣掃描整個圖像的像素點然后各個進(jìn)行加權(quán)平均。
另外,高斯濾波的效果使得圖像就像半透明一樣,與鏡頭的焦外成像效果不太一樣,圖像與正態(tài)分布進(jìn)行卷積得到高斯模糊,由于高斯函數(shù)經(jīng)過傅里葉變換得到另一種不一樣的高斯函數(shù),所以高斯濾波是一種低通濾波,其不斷減弱了圖像邊緣的頻率變化,對于消除正態(tài)分布形狀的噪聲效果很好[4]。均值為零的一維高斯函數(shù)為:
G(x)=exp(-x2/(2sigma2))
(1)
可以看出在高斯濾波器中,像素的權(quán)重與距離其中心像素點的數(shù)值成正比。故而均值為零的二維高斯函數(shù)為:
(2)
高斯函數(shù)封裝在GaussianBlur函數(shù)中,其作用就是將圖像與高斯核函數(shù)進(jìn)行卷積,對支持這一運(yùn)算的就過濾掉。其函數(shù)原型為:C++:void GaussianBlur (InputArray src,OutputArray dst,Size ksize,double sigmaX,double sigmaY=0,int borderType=BORDER_DEFAULT)。
其中,第一個參數(shù)為輸入圖像,即InputArray為輸入函數(shù)接口,表示src的類型,輸入圖像后填入mat類的對象。這個函數(shù)可以操作任意通道數(shù)的圖像,所以函數(shù)針對通道是獨立的。第二個參數(shù)為目標(biāo)圖像,即輸出OutputArray類型的dst,將原圖像進(jìn)行克隆,輸出具有相同類型及尺寸的目標(biāo)圖。第三個參數(shù)為設(shè)置Size類型的內(nèi)核的大小,如Size(4,4)即表示4*4的內(nèi)核大小。第四個參數(shù)即為高斯核函數(shù)于X方向上的標(biāo)準(zhǔn)差。第五個參數(shù)即為高斯核函數(shù)于Y方向上的標(biāo)準(zhǔn)差。第六個參數(shù)為整型的borderType,一般也有默認(rèn)值BORDER_DEFAULT。
高斯濾波結(jié)果如圖1所示。
圖1 原圖像與高斯濾波后圖像對比
膨脹處理是一種經(jīng)典圖像形態(tài)學(xué)濾波,而圖像形態(tài)學(xué)即數(shù)學(xué)形態(tài)學(xué),形態(tài)學(xué)處理即針對離散圖片進(jìn)行的一種濾波模式,膨脹處理的原理與圖像腐蝕恰好相反[5]。圖像膨脹處理即首先確定一個任意形狀的結(jié)構(gòu)元素,此結(jié)構(gòu)元素一般較小且多為正多邊形及圓形。以中心像素點為錨點,將結(jié)構(gòu)元素與圖像進(jìn)行卷積,而后分析結(jié)構(gòu)元素與圖像的擊中點(即為結(jié)構(gòu)元素包含于圖像的部分),將錨點對圖像中的像素逐一掃描,并將結(jié)構(gòu)元素中像素點灰度最大值賦予錨點,又因為圖像中白色灰度值最高,即高亮度的部分會隨著灰度值賦予錨點的過程范圍逐漸變大。隨之而來低灰度值的部分則范圍變小,由此實現(xiàn)圖像膨脹處理。圖像膨脹處理的具體操作示意如圖2所示。
圖2 膨脹操作示意圖
膨脹的表達(dá)式如下:
src(x+x',y+y')
(3)
圖像膨脹效果如圖3所示。
圖3 原圖像與膨脹處理后圖像對比
圖像邊緣檢測在基于OpenCV的輪廓檢測中是極為重要的一環(huán),在圖像去噪與增強(qiáng)之后一般常用閾值化的方法進(jìn)行檢測。圖像的邊緣檢測是許多圖像分析的重要基礎(chǔ),比如在目標(biāo)區(qū)域識別領(lǐng)域、圖像分割領(lǐng)域以及區(qū)域形狀提取領(lǐng)域等等,也可以應(yīng)用到圖像識別領(lǐng)域來達(dá)到提取圖像的一般特征的目的[6-8]。圖像邊緣檢測在現(xiàn)如今的工程應(yīng)用中占有積極重要的地位,也是現(xiàn)如今的一個熱點問題,在許多圖像分析中都是首先要解決的問題。而基于OpenCV的邊緣檢測算子也有很多,比如最優(yōu)的Canny算子、Robert算子、Sobel算子、Laplacian算子、Prewitt算子、Krisch算子和Scharr濾波器等,該研究將以Canny算子、Sobel算子、Laplacian算子以及Scharr濾波器為例來講述數(shù)字圖像處理中的邊緣檢測。
Sobel算子是一種典型的高通線性濾波器,其實是一種離散微分算子且主要用于邊緣檢測,具有方向性,會根據(jù)核的不同而改變其圖像的垂直頻率或水平頻率。其通過微分求導(dǎo)與高斯函數(shù)結(jié)合可求出圖像任何一處灰度的法向量或梯度矢量。
通過設(shè)置坐標(biāo)零點的灰度值為128,而暗色則為負(fù)值,亮色為正值,然后這種基于方向的濾波器就會很容易地將核矩陣包含正負(fù)數(shù),然后保存到16位有符號的圖像中。而后再通過閾值化算法得到二值化圖像,從而獲得圖像的輪廓[9-10]。
Sobel算法求出的各個點的梯度公式為:
(4)
Sobel算子的邊緣檢測結(jié)果如圖4所示。
圖4 Sobel算子的邊緣檢測結(jié)果與原圖對比
孔洞填充是此研究基于OpenCV的人體輪廓檢測的一個十分重要的步驟,同樣在很多輪廓檢測與提取中此函數(shù)也發(fā)揮了非常重要的作用。然而OpenCV并沒有像漫水填充一樣將其封裝成函數(shù)。其作用即為進(jìn)行另一種方式和目的的重建膨脹處理[11]。通過形態(tài)學(xué)膨脹填充將圖像中做需要的輪廓進(jìn)行標(biāo)記和提取,并制作目標(biāo)圖像的掩膜。當(dāng)與種子點相連接的連通區(qū)域幾乎全被染成特定顏色時,即完成孔洞填充。
作為人體輪廓檢測的最后一個步驟,為了實現(xiàn)對圖像中的人體輪廓提取,最終要進(jìn)行尋找人體輪廓,即要用到cvfindContours()函數(shù)[12]。在二值圖像中,findContours()函數(shù)的第一個參數(shù)即為輸入源圖像[13-19],從而使得通過Canny或Sobel等邊緣檢測算子進(jìn)行邊緣檢測后的圖像既得到了圖像的輪廓邊緣檢測又使得圖像進(jìn)行了灰度及二值化處理。第二個參數(shù)即為將上一步檢測得到的人體輪廓及運(yùn)算結(jié)果(函數(shù)調(diào)用)存儲為有方向的點的形式。第三個參數(shù)即為將圖像經(jīng)過以上處理后得到的拓?fù)湫畔⑦M(jìn)行輸出,并將檢測到的圖像中的所有物體的輪廓表示成索引編號的方式。第四個參數(shù)即表示上一步中圖像輪廓索引編號后的檢索的模式。第五個參數(shù)即為各種函數(shù)中輪廓選取的各種可選的近似辦法。最后一個參數(shù)即為每個圖像中輪廓像素點的可選的偏移值[20-21]。
尋找輪廓之后,人體輪廓提取最重要的步驟即為繪制輪廓,即drawContours()函數(shù)。其中,繪制輪廓函數(shù)的第一個參數(shù)為目標(biāo)圖像,即Mat類的源圖像。第二個參數(shù)即為將所有輸入得到的圖像輪廓數(shù)據(jù)進(jìn)行存儲繼而存儲為有方向的點的形式。第三個參數(shù)即為是否繪制圖像輪廓的指示。第四個參數(shù)即為選擇及設(shè)置即將繪制出的輪廓的顏色。第五個參數(shù)即為表示所繪制圖像輪廓的邊緣粗細(xì)。第六個參數(shù)即為選擇線條的類型。第七個參數(shù)即為層次結(jié)構(gòu)信息。第八個參數(shù)即為表示在圖像輪廓的繪制中的最大的等級類型。最后一個參數(shù)即為表示即將繪制出的圖像輪廓的偏移參數(shù)[22]。
第一組如圖5所示(正確率:86.7%)。
第二組如圖6所示(正確率:95.5%)。
第三組如圖7所示(正確率:92.9%)。
(a)第一組測試原圖 (b)測試結(jié)果
(a)第二組測試原圖 (b)測試結(jié)果
(a)第三組測試原圖 (b)測試結(jié)果
平均人體輪廓檢測正確率為:91.7%,符合預(yù)期目標(biāo)。
通過該研究討論,得出較為清晰的結(jié)論,即人體輪廓檢測雖然可以有眾多研究方案,如除了OpenCV還有MATLAB及Delphi等平臺或軟件可進(jìn)行圖像處理及輪廓檢測,但通過對比與分析,OpenCV更加適合于人體輪廓檢測的研究。而后對于圖像的預(yù)處理的諸多方案進(jìn)行分析研究得出結(jié)論,高斯濾波更加適合于人體輪廓檢測。在圖像預(yù)處理之后進(jìn)行了Canny算子或濾波器為基礎(chǔ)的眾多邊緣檢測算法,通過對比分析得出結(jié)論,Sobel算子更加適合于進(jìn)行含有人體輪廓圖像的人體邊緣檢測。
然而此研究依然有許多問題與不足,比如此研究是基于人體輪廓做出的相關(guān)邊緣檢測,但各式各樣的圖像實在太多,所以各種各樣的人體輪廓背景的圖像也太多,當(dāng)圖像的灰度復(fù)雜度太大以及邊緣的閾值并不容易由二階微分或結(jié)構(gòu)元素掃描而得出的時候,對于人體輪廓的檢測則需要進(jìn)一步的優(yōu)化以提高人體檢測的正確率,且此研究的研究內(nèi)容在得出人體輪廓后的人數(shù)總結(jié)方面還有所欠缺,這些將會在今后加以完善。