張 藝,匡 毅,王 梅,黃志遠,胡 松
(成都理工大學 信息科學與技術學院,四川 成都 610059)
近年來,隨著人工智能與計算機視覺不斷地融入人們的生活,與之相關的人體輪廓檢測技術變得越來越重要。人體輪廓檢測除了民用,還廣泛運用于如機場社會安全以及軍事偵察掃描等領域。下面根據人體輪廓檢測在現實中的各個領域的應用作簡要說明:
在自動駕駛方面,人體輪廓檢測可以運用于實現車輛或駕駛人員對于路況信息的實時精準判斷,并對即將可能發生的危險進行提前預警,以減少由于駕駛人員注意力不集中或者疲勞駕駛等原因造成的車禍等安全隱患;在監控系統方面,人體輪廓檢測可以運用于家庭、學校、銀行、醫院等私人或公共領域場所,在遇到可疑人員靠近時可以通過人體輪廓檢測提前做出預警反應;在機場安全方面,人體輪廓檢測可以幫助機場安全監管人員及時發現機場的安全隱患,對于機場的可疑人員或閑雜人等進行提前預警,以減少不必要的安全事故;在軍事偵察方面,人體輪廓檢測可以幫助士兵或作戰指揮人員在戰場或演習過程中及時提早發現可疑人員或隱蔽的敵人。對于無人機偵察以及飛機障礙規避等方面都有較大的作用。
基于OpenCV(open computer vision library)的人體輪廓邊緣檢測算法就是在各種研究的基礎上逐步成型與發展并日趨成熟,對于人體輪廓檢測在線性與非線性濾波、形態學處理以及各種檢測算法方面奠定了基礎和重要的借鑒經驗。
人體輪廓檢測是計算機視覺領域的研究熱點,但現如今相關的論文及文獻并不是很多,其中面臨的問題也還有很多。該研究圍繞基于OpenCV的人體輪廓檢測展開,利用OpenCV-3.1.0視覺庫和Visual Studio 2012組建實驗平臺,針對圖像的去噪處理、圖像的形態學處理、基于OpenCV的邊緣檢測、孔洞填充、尋找輪廓、繪制輪廓等重點和難點進行了研究[1]。
主要研究內容有以下幾點:
(1)對人體輪廓檢測的發展現狀及國內外學者的相關研究內容及研究現狀進行調研。
(2)將搜尋獲取到的圖像進行檢索,得到包含人體的圖像后進行標記與儲存。
(3)為了減少圖像上的噪點,以防圖像失真,要對標記儲存的含有人體的圖像進行高斯濾波。
(4)為了進一步消除噪聲并且將圖像中獨立的元素分割出來,將去噪后的圖像進行形態學處理,為了找出圖像中的局部最大值,對圖像進行膨脹處理。
(5)為了更好地將圖像轉換為圖像數據,進行Sobel邊緣檢測處理。
(6)為了將人體更好地提取出來,在進行邊緣檢測之后要對圖像進行孔洞填充,之后進行尋找人體輪廓以及繪制人體輪廓。
OpenCV和MATLAB都可對人體輪廓檢測進行相關的處理[2],但OpenCV有大量優化的代碼庫,而且可以在各種平臺上進行圖像處理,而MATLAB的運行較為緩慢,且計算機視覺方面的圖像處理工具箱成本較高,因此OpenCV應用更普遍,因為其相關功能應用完全免費,而且兩者的邊緣輪廓檢測效果差別不大。綜上所述,在計算機視覺及人體輪廓檢測方面,OpenCV更加適用。
圖像的去噪處理即是對圖像進行濾波操作。目的在于抽出圖像的特征以及去掉數字化圖像中的噪聲成分。通過調研發現高斯濾波更適用于人體輪廓檢測,所以文中重點討論的對象為高斯濾波。
高斯濾波其實就是用高斯函數進行濾波,是一種低通濾波[3]。高斯濾波是一種被廣泛使用的線性平滑濾波,雖然其效率比不上其他濾波,但在消除圖像方面一般被認為是最有用的濾波。其原理的核心也是鄰域均值,不過和均值濾波不同的是,高斯濾波是首先設定一個模板(卷積、掩模等),然后將模塊確定的鄰域內的像素點進行加權平均,再將平均后的加權平均灰度值賦予模塊中心像素點。高斯濾波可以這樣掃描整個圖像的像素點然后各個進行加權平均。
另外,高斯濾波的效果使得圖像就像半透明一樣,與鏡頭的焦外成像效果不太一樣,圖像與正態分布進行卷積得到高斯模糊,由于高斯函數經過傅里葉變換得到另一種不一樣的高斯函數,所以高斯濾波是一種低通濾波,其不斷減弱了圖像邊緣的頻率變化,對于消除正態分布形狀的噪聲效果很好[4]。均值為零的一維高斯函數為:
G(x)=exp(-x2/(2sigma2))
(1)
可以看出在高斯濾波器中,像素的權重與距離其中心像素點的數值成正比。故而均值為零的二維高斯函數為:
(2)
高斯函數封裝在GaussianBlur函數中,其作用就是將圖像與高斯核函數進行卷積,對支持這一運算的就過濾掉。其函數原型為:C++:void GaussianBlur (InputArray src,OutputArray dst,Size ksize,double sigmaX,double sigmaY=0,int borderType=BORDER_DEFAULT)。
其中,第一個參數為輸入圖像,即InputArray為輸入函數接口,表示src的類型,輸入圖像后填入mat類的對象。這個函數可以操作任意通道數的圖像,所以函數針對通道是獨立的。第二個參數為目標圖像,即輸出OutputArray類型的dst,將原圖像進行克隆,輸出具有相同類型及尺寸的目標圖。第三個參數為設置Size類型的內核的大小,如Size(4,4)即表示4*4的內核大小。第四個參數即為高斯核函數于X方向上的標準差。第五個參數即為高斯核函數于Y方向上的標準差。第六個參數為整型的borderType,一般也有默認值BORDER_DEFAULT。
高斯濾波結果如圖1所示。

圖1 原圖像與高斯濾波后圖像對比
膨脹處理是一種經典圖像形態學濾波,而圖像形態學即數學形態學,形態學處理即針對離散圖片進行的一種濾波模式,膨脹處理的原理與圖像腐蝕恰好相反[5]。圖像膨脹處理即首先確定一個任意形狀的結構元素,此結構元素一般較小且多為正多邊形及圓形。以中心像素點為錨點,將結構元素與圖像進行卷積,而后分析結構元素與圖像的擊中點(即為結構元素包含于圖像的部分),將錨點對圖像中的像素逐一掃描,并將結構元素中像素點灰度最大值賦予錨點,又因為圖像中白色灰度值最高,即高亮度的部分會隨著灰度值賦予錨點的過程范圍逐漸變大。隨之而來低灰度值的部分則范圍變小,由此實現圖像膨脹處理。圖像膨脹處理的具體操作示意如圖2所示。

圖2 膨脹操作示意圖
膨脹的表達式如下:
src(x+x',y+y')

(3)
圖像膨脹效果如圖3所示。

圖3 原圖像與膨脹處理后圖像對比
圖像邊緣檢測在基于OpenCV的輪廓檢測中是極為重要的一環,在圖像去噪與增強之后一般常用閾值化的方法進行檢測。圖像的邊緣檢測是許多圖像分析的重要基礎,比如在目標區域識別領域、圖像分割領域以及區域形狀提取領域等等,也可以應用到圖像識別領域來達到提取圖像的一般特征的目的[6-8]。圖像邊緣檢測在現如今的工程應用中占有積極重要的地位,也是現如今的一個熱點問題,在許多圖像分析中都是首先要解決的問題。而基于OpenCV的邊緣檢測算子也有很多,比如最優的Canny算子、Robert算子、Sobel算子、Laplacian算子、Prewitt算子、Krisch算子和Scharr濾波器等,該研究將以Canny算子、Sobel算子、Laplacian算子以及Scharr濾波器為例來講述數字圖像處理中的邊緣檢測。
Sobel算子是一種典型的高通線性濾波器,其實是一種離散微分算子且主要用于邊緣檢測,具有方向性,會根據核的不同而改變其圖像的垂直頻率或水平頻率。其通過微分求導與高斯函數結合可求出圖像任何一處灰度的法向量或梯度矢量。
通過設置坐標零點的灰度值為128,而暗色則為負值,亮色為正值,然后這種基于方向的濾波器就會很容易地將核矩陣包含正負數,然后保存到16位有符號的圖像中。而后再通過閾值化算法得到二值化圖像,從而獲得圖像的輪廓[9-10]。
Sobel算法求出的各個點的梯度公式為:

(4)
Sobel算子的邊緣檢測結果如圖4所示。

圖4 Sobel算子的邊緣檢測結果與原圖對比
孔洞填充是此研究基于OpenCV的人體輪廓檢測的一個十分重要的步驟,同樣在很多輪廓檢測與提取中此函數也發揮了非常重要的作用。然而OpenCV并沒有像漫水填充一樣將其封裝成函數。其作用即為進行另一種方式和目的的重建膨脹處理[11]。通過形態學膨脹填充將圖像中做需要的輪廓進行標記和提取,并制作目標圖像的掩膜。當與種子點相連接的連通區域幾乎全被染成特定顏色時,即完成孔洞填充。
作為人體輪廓檢測的最后一個步驟,為了實現對圖像中的人體輪廓提取,最終要進行尋找人體輪廓,即要用到cvfindContours()函數[12]。在二值圖像中,findContours()函數的第一個參數即為輸入源圖像[13-19],從而使得通過Canny或Sobel等邊緣檢測算子進行邊緣檢測后的圖像既得到了圖像的輪廓邊緣檢測又使得圖像進行了灰度及二值化處理。第二個參數即為將上一步檢測得到的人體輪廓及運算結果(函數調用)存儲為有方向的點的形式。第三個參數即為將圖像經過以上處理后得到的拓撲信息進行輸出,并將檢測到的圖像中的所有物體的輪廓表示成索引編號的方式。第四個參數即表示上一步中圖像輪廓索引編號后的檢索的模式。第五個參數即為各種函數中輪廓選取的各種可選的近似辦法。最后一個參數即為每個圖像中輪廓像素點的可選的偏移值[20-21]。
尋找輪廓之后,人體輪廓提取最重要的步驟即為繪制輪廓,即drawContours()函數。其中,繪制輪廓函數的第一個參數為目標圖像,即Mat類的源圖像。第二個參數即為將所有輸入得到的圖像輪廓數據進行存儲繼而存儲為有方向的點的形式。第三個參數即為是否繪制圖像輪廓的指示。第四個參數即為選擇及設置即將繪制出的輪廓的顏色。第五個參數即為表示所繪制圖像輪廓的邊緣粗細。第六個參數即為選擇線條的類型。第七個參數即為層次結構信息。第八個參數即為表示在圖像輪廓的繪制中的最大的等級類型。最后一個參數即為表示即將繪制出的圖像輪廓的偏移參數[22]。
第一組如圖5所示(正確率:86.7%)。
第二組如圖6所示(正確率:95.5%)。
第三組如圖7所示(正確率:92.9%)。

(a)第一組測試原圖 (b)測試結果

(a)第二組測試原圖 (b)測試結果

(a)第三組測試原圖 (b)測試結果
平均人體輪廓檢測正確率為:91.7%,符合預期目標。
通過該研究討論,得出較為清晰的結論,即人體輪廓檢測雖然可以有眾多研究方案,如除了OpenCV還有MATLAB及Delphi等平臺或軟件可進行圖像處理及輪廓檢測,但通過對比與分析,OpenCV更加適合于人體輪廓檢測的研究。而后對于圖像的預處理的諸多方案進行分析研究得出結論,高斯濾波更加適合于人體輪廓檢測。在圖像預處理之后進行了Canny算子或濾波器為基礎的眾多邊緣檢測算法,通過對比分析得出結論,Sobel算子更加適合于進行含有人體輪廓圖像的人體邊緣檢測。
然而此研究依然有許多問題與不足,比如此研究是基于人體輪廓做出的相關邊緣檢測,但各式各樣的圖像實在太多,所以各種各樣的人體輪廓背景的圖像也太多,當圖像的灰度復雜度太大以及邊緣的閾值并不容易由二階微分或結構元素掃描而得出的時候,對于人體輪廓的檢測則需要進一步的優化以提高人體檢測的正確率,且此研究的研究內容在得出人體輪廓后的人數總結方面還有所欠缺,這些將會在今后加以完善。