代維康,雷 斌,2,蔣 林,2
(1.武漢科技大學(xué) 機(jī)械自動化學(xué)院,武漢 430081;2.武漢科技大學(xué) 機(jī)器人與智能系統(tǒng)研究院,武漢 430081)
截至2018年年底,我國公路通車?yán)锍踢_(dá)484.65萬公里,其中高速公路14.25萬公里,規(guī)模居世界第一[1]。隨著使用年限的提升,大量道路開始出現(xiàn)破損,如果不及早檢測,將會給國家和人民帶來巨大的財產(chǎn)損失。因此,自動化路面檢測系統(tǒng)的開發(fā)尤為重要。
裂紋(指路面裂紋)最大寬度是裂紋最具代表性的特征。在計算裂紋最大像素寬度方面,國內(nèi)外相關(guān)專家學(xué)者提出了大量方法。王中宇等[2]針對表面裂紋邊緣輪廓的不規(guī)則性,提出了一種分段寬度評定方法。該方法在獲得裂紋的表面圖像后,對圖像沿縱向進(jìn)行分段,然后用Ferret算法分別對每段裂紋的寬度進(jìn)行評定。方志等[3]將裂紋邊緣擬合成兩條曲線,然后再計算每個邊緣點(diǎn)對應(yīng)的裂紋寬度,得出最大寬度點(diǎn)。JIN等[4]提出一種柔性核來計算裂紋寬度,首先提取裂紋骨架,將裂紋骨架作為內(nèi)切圓圓心,以此來計算裂紋的最大寬度。曹梅麗[5]運(yùn)用數(shù)字散斑相關(guān)原理進(jìn)行像素標(biāo)定與裂紋長度的像素搜索計算,進(jìn)而用亞像素原理解決了測量裂紋寬度時,整像素分辨率不夠的技術(shù)難點(diǎn)。程豐[6]在提取出裂紋對象后,用裂紋的像素點(diǎn)總數(shù)與裂紋骨架的像素點(diǎn)數(shù)的比值來作為裂紋嚴(yán)重程度的標(biāo)準(zhǔn)。丁寧等[7]采用K-means聚類算法將網(wǎng)狀裂紋分成多個單分支裂紋,然后再分別計算單分支裂紋的最大寬度,這種方法能有效檢測網(wǎng)狀裂紋的寬度,相對誤差為2.968%。王鵬[8]用裂紋對象的最小外包矩形的長寬比來衡量裂紋的伸展情況,該方法雖簡潔高效,但測量精度較低。
計算得到裂紋的像素寬度后,需要將像素寬度轉(zhuǎn)換為實際寬度。傳統(tǒng)方法采用單目攝像頭進(jìn)行定高垂直拍攝,根據(jù)針孔成像模型將像素寬度轉(zhuǎn)換為實際尺寸[9];也有一些裂紋檢測系統(tǒng)采用標(biāo)記物標(biāo)定法,即在圖像中放置一個定長標(biāo)記物,通過比例換算計算出每個像素的實際寬度。
傳統(tǒng)的像素寬度計算法更適用于單分支裂紋,需要將多分支裂紋分割為單分支裂紋后逐個計算像素寬度,計算流程過于復(fù)雜,且分割過程易引入誤差,同時,傳統(tǒng)的標(biāo)定方法在實際應(yīng)用中存在一定的難度,其標(biāo)定條件要求的應(yīng)用環(huán)境過于理想,嚴(yán)重影響檢測速度和精度,很難滿足應(yīng)用需求。
筆者設(shè)計了一套雙目視覺采集系統(tǒng),以樹莓派連接USB雙目攝像頭作為圖像采集設(shè)備,利用socket編程將拍攝到的圖片傳輸?shù)接嬎銠C(jī),通過圖像處理技術(shù)獲取裂紋對象。為了高度適應(yīng)各形態(tài)的裂紋,筆者提出了一種基于骨架的邊緣腐蝕算法,用于計算裂紋的最大像素寬度,并通過雙目標(biāo)定,將獲取的最大寬度像素坐標(biāo)轉(zhuǎn)換為世界坐標(biāo),從而計算出裂紋的實際最大寬度。
在實際工程應(yīng)用中,路面裂紋的形狀呈現(xiàn)無規(guī)律性、復(fù)雜性的特點(diǎn)[10]。常見裂紋種類及其形狀如圖1所示。
圖1 常見裂紋種類及其形狀示意
由于骨架能夠反映裂紋的拓?fù)浣Y(jié)構(gòu)[11],首先利用ZHANG等[12]的骨架化算法對裂紋進(jìn)行迭代細(xì)化,在進(jìn)行一次完整的骨架提取后,記錄下迭代刪除次數(shù)N,將其作為第二次細(xì)化操作的種子,再對原裂紋對象進(jìn)行N-1次細(xì)化。將兩次骨架化的差集記為M,然后對差集M進(jìn)行基于距離的閾值濾波,去除孤立點(diǎn),得到點(diǎn)集P。利用最小二乘法,將點(diǎn)集P擬合成一條相切于骨架的直線L,L的正交線與裂紋對象邊緣的兩個交點(diǎn)就是最大裂紋寬度點(diǎn)。在得到裂紋最大像素寬度所在的位置后,通過標(biāo)定雙目相機(jī),將像素坐標(biāo)轉(zhuǎn)換為世界坐標(biāo),得到裂紋的實際最大寬度。整個計算流程如圖2所示。
圖2 邊緣腐蝕算法計算像素寬度的流程
1.1.1 圖形預(yù)處理
裂紋檢測系統(tǒng)拍攝得到的原始圖像存在很多噪聲[見圖3(a)],需要對圖像進(jìn)行一系列預(yù)處理,去除噪點(diǎn),以獲取裂紋對象。具體步驟如下所述。
(1) 對原始圖像進(jìn)行灰度化、中值濾波,并利用自適應(yīng)閾值分割法對圖像進(jìn)行二值化,得到具有白色前景、黑色背景的二值圖像[見圖3(b)]。
(2) 利用形態(tài)學(xué)開操作,去除二值圖像中細(xì)小的前景噪聲[開操作是對圖像進(jìn)行基本的形態(tài)學(xué)組合操作(先腐蝕后膨脹),見圖3(c)]。
(3) 遍歷所有連通域,并計算出所有連通域的面積,設(shè)置一個面積閾值,利用面積剔除法,保留閾值以上的部分作為裂紋對象[見圖3(d)]。
圖3 裂紋預(yù)處理各階段獲得的圖像
1.1.2 獲取裂紋最大寬度位置
提取出完整的裂紋對象后,需要對裂紋進(jìn)行迭代細(xì)化處理。每一次迭代細(xì)化就是對滿足式(1),(2)的像素點(diǎn)進(jìn)行刪除的過程。
(1)
(2)
(3)
[f(p9)=0&&f(p2)=1]
(4)
式中:pi(i=1,2,…,9)為卷積窗口中的9個像素點(diǎn),f(pi)為pi處的像素值,S(p1)為像素鄰域連續(xù)兩個像素值為0,1的次數(shù)。
裂紋骨架化的過程可以理解為對裂紋進(jìn)行邊緣腐蝕剝離的過程,每迭代一次會刪除邊緣上滿足刪除條件的像素點(diǎn),直到所有像素點(diǎn)不滿足刪除條件時,循環(huán)停止。當(dāng)裂紋剝離循環(huán)到最后一次時,仍然滿足細(xì)化條件的像素位置為裂紋最大寬度所在位置。裂紋分步細(xì)化過程得到的圖像如圖4所示,圖中白色為分割出來的裂紋,黑色為背景,紅色為當(dāng)前條件下迭代骨架后的結(jié)果。隨著迭代次數(shù)的增加,可以明顯發(fā)現(xiàn)裂紋較細(xì)位置優(yōu)先實現(xiàn)了骨架化。
算法的整個過程需要進(jìn)行兩次骨架化操作,第一次骨架化是全骨架化,對裂紋對象不斷迭代細(xì)化,直到?jīng)]有滿足刪除條件的像素點(diǎn)為止,圖片記為TN,并將細(xì)化次數(shù)N作為第二次骨架化的迭代種子數(shù)。第二次骨架化是對裂紋進(jìn)行N-1次細(xì)化,細(xì)化得到裂紋骨架和一些非骨架像素點(diǎn)(見圖5,紅色為骨架),這些像素點(diǎn)稱為最大凸點(diǎn)m,最大凸點(diǎn)的集合為最大凸點(diǎn)集(即兩次骨架化的差集),記為M(m1,m2,m3,…)。將完成上述兩次細(xì)化操作后得到的圖片記為TN-1。為了更好地可視化凸點(diǎn),筆者放大了最大凸點(diǎn)位置,如圖5中藍(lán)色點(diǎn)所示。最大凸點(diǎn)集M表示為
圖5 第二次骨架化得到的裂紋圖像
M(m1,m2,m3,…)=TN-TN-1
(5)
1.1.3 獲取裂紋最大寬度所在方向
獲取裂紋最大凸點(diǎn)集M(m1,m2,m3,…)后, 便可以得到裂紋最大寬度所在位置[mi為第i個凸點(diǎn)的坐標(biāo)(xi,yi)]。利用最小二乘法對M擬合出一條切于TN的直線l1。最大凸點(diǎn)擬合及獲取最大寬度方向如圖6所示,取M上一點(diǎn)作l1的正交線l2,l2與裂紋邊緣的交點(diǎn)a,b即為最大寬度所在點(diǎn),由這兩個點(diǎn)可以計算裂紋的寬度。
圖6 最大凸點(diǎn)擬合及獲取最大寬度方向示意
利用文章的方法分別對單分支裂紋和多分支裂紋進(jìn)行寬度計算,將最大凸點(diǎn)擬合線的正交線與裂紋邊緣相交的線段用紅色直線標(biāo)出,線段長度即為裂紋的最大像素寬度。裂紋像素最大寬度計算的效果圖如圖7所示。
圖7 裂紋像素最大寬度計算的效果圖
1.1.4 最大凸點(diǎn)集去噪
上述操作成功獲取到裂紋的最大像素寬度,但在對最大凸點(diǎn)集進(jìn)行方向擬合時,會因為一些非連續(xù)點(diǎn)的存在,最終擬合精度受到影響。造成這種情況的原因是同一裂紋存在多個最大寬度處,即同一裂紋存在多個位置寬度相同且均為最大寬度。由于孤立點(diǎn)的存在會嚴(yán)重影響擬合后直線的方向,降低了最大寬度方向的準(zhǔn)確性。文章采取了一種基于距離閾值的M點(diǎn)集濾波法,去除孤立點(diǎn),得到點(diǎn)集P,再利用最小二乘法擬合出正確的切線。
距離濾波過程采用一個大小為3的核h(見圖8)與M進(jìn)行卷積計算,在實際應(yīng)用中利用M創(chuàng)建一個圖像掩膜,其中凸點(diǎn)位置像素值為1,其他點(diǎn)像素值為0,為了避免浪費(fèi)算力,僅對像素值為1的像素進(jìn)行卷積運(yùn)算。卷積計算結(jié)果D可表示為
圖8 大小為3的卷積核h
D=h*M
(6)
對D進(jìn)行閾值分割,得到濾波后的結(jié)果P,表示為
(7)
利用非連續(xù)點(diǎn)濾波法對圖5(a)中的裂紋進(jìn)行寬度測量,濾波前后的效果如圖9所示,圖中綠線表示擬合最大寬度所在方向,藍(lán)色點(diǎn)為獲取的最大寬度點(diǎn)。由于裂紋最后產(chǎn)生的最大凸點(diǎn)集中像素點(diǎn)的數(shù)量較少,當(dāng)存在一些偏差較大的點(diǎn)(孤立噪聲點(diǎn))時,會對擬合結(jié)果產(chǎn)生非常顯著的影響,所以必須對最大凸點(diǎn)集進(jìn)行去噪。
圖9 濾波前后裂紋寬度測量效果對比
為了得到相機(jī)世界坐標(biāo)系與像素坐標(biāo)系的關(guān)系,采用張正友雙目標(biāo)定法對雙目相機(jī)進(jìn)行標(biāo)定[13]。標(biāo)定使用的圖片對如圖10所示。
圖10 標(biāo)定使用的圖片對
使用MATLAB軟件的雙目標(biāo)定工具箱,利用上述圖片進(jìn)行相機(jī)標(biāo)記,得到相關(guān)的相機(jī)標(biāo)定參數(shù)。其標(biāo)定平均誤差低于0.35,標(biāo)定誤差計算結(jié)果如圖11所示。
圖11 標(biāo)定誤差計算結(jié)果
利用裂紋邊緣腐蝕的最大寬度計算算法,得到了左攝像頭中裂縫最大像素寬度對應(yīng)的兩個像素點(diǎn)的坐標(biāo),為了進(jìn)一步通過雙目攝像機(jī)還原裂紋實際的世界坐標(biāo),計算實際距離,通過對極限約束找到右相機(jī)上對應(yīng)的最大像素寬度點(diǎn)所在的直線。與此同時,由于最大像素寬度點(diǎn)都在邊緣上,通過邊緣點(diǎn)匹配,便可以匹配到右相機(jī)上的最大寬度像素點(diǎn),根據(jù)張正友雙目標(biāo)定結(jié)果計算最后的真實世界坐標(biāo),并利用歐式距離公式得到最后的實際裂紋寬度。
為了驗證在計算裂紋像素寬度時,基于骨架的邊緣腐蝕算法提高檢測效率和檢測精度的效果,通過雙目相機(jī)拍攝200組裂紋圖片并測量出實際裂紋的最大寬度(其中橫向、縱向、斜向、網(wǎng)狀、塊狀裂紋各200張,圖片大小為1280 像素×960像素)。分別采用基于裂紋骨架的內(nèi)切圓計算法[4](方法一)、基于K-means聚類劃分的像素寬度計算法[7](方法二)以及基于骨架的邊緣腐蝕算法(方法三,文章方法)計算出裂紋像素的最大寬度,并還原世界坐標(biāo)計算裂紋的實際寬度。3種方法的檢測相對誤差如表1所示,平均運(yùn)行時長如表2所示。
表1 3種方法的檢測相對誤差 %
表2 3種方法的平均運(yùn)行時長 s
由表中數(shù)據(jù)可知,方法一計算裂紋像素寬度時,多向裂紋和單向裂紋的檢測精度相差0.48%,該方法對裂紋形狀不敏感,整體平均誤差為9.03%,但由于基于骨架作為圓心進(jìn)行內(nèi)切圓繪制會消耗大量算力,所以算法耗時較長。方法二使用邊緣擬合法[3]計算單向裂紋像素的最大寬度,對于多向裂紋,則采用K-means聚類算法將裂紋劃分為多個單向裂紋,聚類過程耗時較長,且對多向裂紋進(jìn)行聚類分割時會產(chǎn)生分割誤差,使得該方法在幾種方法中誤差最大。
文章采用的基于骨架的邊緣腐蝕算法平均相對誤差為4.1%,平均耗時為0.57 s。能夠在保證裂紋檢測精度的同時,快速計算出裂紋的實際最大寬度,其相比于方法一,精度提高4.93%;相比于方法二,速度提升了3.2倍。試驗結(jié)果表明,該算法極大地提高了裂紋檢測系統(tǒng)的檢測效率和精度,更加符合實際應(yīng)用需求。
文章提出了一種基于骨架的路面裂紋最大寬度的檢測算法。該方法主要有3個優(yōu)點(diǎn):① 結(jié)合裂紋骨架計算裂紋方向,避免了傳統(tǒng)方法難以識別復(fù)雜裂紋的問題;② 對最大凸點(diǎn)集進(jìn)行濾波處理去除孤點(diǎn),降低在極端情況下的誤差率;③ 利用雙目攝像頭獲取圖像,避免了傳統(tǒng)方法中復(fù)雜的標(biāo)注過程,極大地提升了整個裂紋檢測系統(tǒng)的效率和準(zhǔn)確率。文章所采用的拍攝裝置在進(jìn)行戶外作業(yè)時仍然存在一定的難度,樹莓派作為邊緣設(shè)備,算力較低,很難實現(xiàn)實時檢測,現(xiàn)階段只能實現(xiàn)圖片采集和識別的分開處理。因此,如何提高整個系統(tǒng)的檢測速度將是接下來的研究重點(diǎn)。