本發(fā)明涉及計算機(jī)視覺與模式識別、移動機(jī)器人目標(biāo)檢測識別等,尤其涉及圓檢測方法。
背景技術(shù):
圖像檢測領(lǐng)域中,幾何特征是重要的圖像特征。其中圓形是在自然環(huán)境和人造環(huán)境中都極其常見的一種圖像幾何特征。圓檢測廣泛應(yīng)用于計算機(jī)視覺與模式識別、物體檢測、生物特征識別、道路標(biāo)志檢測等諸多領(lǐng)域。
目前圓檢測方法主要分為兩類:確定性方法和隨機(jī)性方法。其中,確定性方法大多是基于霍夫變換(HT,Hough Transform),利用邊緣檢測器獲取邊緣信息,再推斷出圓心和半徑。隨機(jī)性方法主要有隨機(jī)霍夫變換(RHT,Random Hough Transform)——對邊緣圖像中邊緣點進(jìn)行隨機(jī)采樣,采用多對一映射減少計算復(fù)雜度;基于遺傳算法(GA,Genetic Algorithm)的圓檢測——利用遺傳算法對自然圖像中多個圓(即使存在殘缺)同時檢測;基于隨機(jī)抽樣一致性(RANSAC,Random Sample Consensus)技術(shù)的圓檢測等。
傳統(tǒng)圓霍夫變換(CHT,Circle Hough Transform)方法應(yīng)用廣泛,但主要缺點是計算復(fù)雜度隨參數(shù)空間維數(shù)呈幾何級數(shù)增長,計算量和存儲量都較大,難以滿足實時性。雖然出現(xiàn)基于模板法(TM,Template Matching)、最小二乘法(LS,Least Square)等方法克服霍夫變換法的缺點,但沒有根本解決霍夫變換的重要缺陷。隨機(jī)性圓檢測方法增加了圓檢測的魯棒性,但復(fù)雜度仍然較大。
技術(shù)實現(xiàn)要素:
為了解決現(xiàn)有技術(shù)中問題,本發(fā)明提供了一種。
一種基于直線段的圓檢測方法,該方法包括如下步驟:
步驟S1,對輸入圖像進(jìn)行預(yù)處理;
步驟S2,提取圖像中包含的直線段,獲得由直線段組成的集合;
步驟S3,在直線段集合中搜索,檢測出候選圓,確定圓心和半徑;
步驟S4,驗證候選圓,輸出檢測到的真實圓。
作為本發(fā)明的進(jìn)一步改進(jìn),所述步驟S1,對輸入圖像進(jìn)行預(yù)處理的方法,具體包括:如果輸入圖像為三通道的RGB圖像,將之轉(zhuǎn)換成單通道的灰度圖;對灰度圖進(jìn)行二維高斯濾波,濾除圖像噪聲;根據(jù)尺度因子λ縮小圖像二維尺度,消除椒鹽噪聲引起的直線段誤檢,尺度因子λ為0.5~0.8。
作為本發(fā)明的進(jìn)一步改進(jìn),所述步驟S2,提取圖像中的直線段方法,具體包括以下步驟:
步驟S21,對圖像中的每個像素計算梯度和梯度角,根據(jù)梯度值的大小,將像素點排列成包含梯度角信息的有序點集PointSets,其中根據(jù)梯度閾值ρ,去除梯度過小的像素點;
步驟S22,對有序點集PointSets進(jìn)行搜索,對某一個標(biāo)記為未使用UNUSED的像素點,在其鄰域內(nèi)搜索將梯度角與主梯度角相差小于誤差角τ的像素點添加到直線段可能域LineRegion中,并標(biāo)記該點已經(jīng)被使用USED,更新主梯度角;然后遞歸地,對LineRegion中的每一個點,在其領(lǐng)域中搜索梯度角與主梯度角相差小于誤差角τ的像素點并加入到LineRegion中,直到無法再加入新的點到LineRegion中;
步驟S23,直線段可能域LineRegion中的所有點代表了提取的一條直線段Line,利用LineRegion中的所有點計算出直線段Line的起點Start、終點End、寬度Width以及方向角θline,將具有上述參數(shù)的有向直線段Line加入到提取出的直線段集合LineSets中;
步驟S24,重復(fù)步驟S22~S23,直到全部有序點集PointSets中都已搜索完畢,獲得直線段集合LineSets。
作為本發(fā)明的進(jìn)一步改進(jìn),
步驟S3,檢測候選圓的方法,具體包括以下步驟:
步驟S31,對直線段集合LineSets進(jìn)行搜索,對某一個標(biāo)記為未使用UNUSED的直線段Line[i],標(biāo)記Line[i]已被使用USED,在其終點End附近鄰域搜索一條滿足如下約束條件的直線段Line[i+1]:(1)該直線段Line[i+1]未被使用;(2)該直線段Line[i+1]的起點Start在直線段Line[i]的終點End的鄰域內(nèi);(3)直線段Line[i+1]的方向角減去Line[i]的方向角小于一定閾值γ;
若沒有搜索到滿足上述3條約束的直線段Line[i+1],返回重新開始搜索,若搜索到滿足約束的直線段Line[i+1],開始步驟S32;
步驟S32,在Line[i+1]的終點End附近鄰域搜索一條滿足如下約束條件的直線段Line[i+2]:(1)該直線段Line[i+2]未被使用;(2)該直線段Line[i+2]的起點Start在直線段Line[i+1]的終點End的鄰域內(nèi);(3)直線段Line[i+2]的方向角減去Line[i+1]的方向角的差值小于一定閾值A(chǔ)ngleThresh;(4)直線段Line[i+2]的方向角減去Line[i+1]的方向角的差值的符號與直線段Line[i+1]的方向角減去Line[i]的方向角的差值的符號相同;
若沒有滿足上述4條約束的直線段Line[i+2],返回重新開始搜索,若搜索到滿足上述4條約束的直線段Line[i+2],開始步驟S33;
步驟S33,類似步驟S32搜索Line[i+2]的方式,根據(jù)Line[i+2]找到第4條滿足約束的的直線段Line[i+3];
步驟S34,類似步驟S33搜索Line[i+3]的方式,根據(jù)Line[i+3]找到第5條滿足約束的的直線段Line[i+4];
步驟S35,利用5條直線段Line[i]~Line[i+4]的起點Start和終點End,共10個點,進(jìn)行最小二乘圓擬合,求出圓心和半徑,得到一個候選圓,標(biāo)記直線段Line[i+1]~Line[i+4]已被使用USED;
步驟S36,重新開始步驟S31~S35,直到直線段集合LineSets中的所有直線段都搜索完畢,標(biāo)記為已被使用,獲得候選圓的集合CircleSets。
作為本發(fā)明的進(jìn)一步改進(jìn),
步驟S4,驗證候選圓的方法,具體包括:
步驟S41,對于候選圓集合CircleSets進(jìn)行搜索,若某個候選圓的圓心與另一個候選圓的圓心的距離小于一個閾值CenterDistThresh,且它們的半徑的差值小于一個閾值RadiusDistThresh,則表明檢測到重復(fù)的圓,刪掉一個候選圓,更新候選圓集合CircleSets;
步驟S42,在更新的候選圓集合CircleSets中逐一進(jìn)行搜索,對某個候選圓Circle[i],根據(jù)其圓心(Ai,Bi)和半徑Ri大小,在半徑均值為Ri的圓環(huán)區(qū)域內(nèi)搜索,若在四個象限中的至少三個象限圓環(huán)區(qū)域內(nèi)都搜索到存在直線段,則表明該候選圓是一個真實圓,而不是一個圓弧段;
步驟S43,輸出檢測到的包含圓心位置和半徑大小的真實圓。
作為本發(fā)明的進(jìn)一步改進(jìn),設(shè)像素點p(x,y)的灰度值為I(x,y),其梯度值G(x,y)和梯度角θ按如下公式計算:
gx(x,y)=[I(x+1,y)-I(x,y)+I(x+1,y+1)-I(x,y+1)]/2,
gy(x,y)=[I(x,y+1)-I(x,y)+I(x+1,y+1)-I(x+1,y)]/2,
作為本發(fā)明的進(jìn)一步改進(jìn),
步驟S22,從有序的像素點集合PointSets中獲取一個種子像素點p(x,y),將其加入到直線段可能域LineRegion中,并將種子像素點p(x,y)的梯度角作為LineRegion的角度θreg,然后對LineRegion中的每個像素點,在其3×3鄰域中搜索滿足以下約束的點:(1)該點未被使用UNUSED,(2)該點的梯度角θi與θreg之差小于角度誤差角τ,即|θreg-θi|<τ;將滿足約束的點加入到LineRegion中,標(biāo)記該點被使用USED,按下面公式更新θreg:
angx=cos(θreg),
angy=sin(θreg),
angx=angx+cos(θi),
angy=angy+sin(θi),
θreg=arctan(angx/angy). (0.13)
按上述方式搜索,直到?jīng)]有新的點加入到LineRegion中,判斷LineRegion中的點數(shù),若點數(shù)小于閾值Nthresh則拋棄該LineRegion。
作為本發(fā)明的進(jìn)一步改進(jìn),
步驟S23,根據(jù)直線段可能域LineRegion計算直線段參數(shù),包括中心位置、起點、終點、方向角度和寬度,由LineRegion代表的直線段具有一定寬度,可以看成是一個小矩形區(qū)域,其中心位置為rec(cx,cy),計算方法是利用LineRegion中的所有點,根據(jù)所有點的梯度值進(jìn)行加權(quán)平均,如下公式:
直線段方向角θline由如下矩陣的最小特征值有關(guān)的特征值計算出來:
假設(shè)上述公式中矩陣M的兩個特征值為λ1≥λ2,則直線段方向角θline按一下公式計算:
θline=atan((λ2-mxx)/mxy) (0.16)
求得直線段方向角后,即知道直線段的方向,再對LineRegion中所有點遍歷,計算該點到中心點沿直線段兩個正交軸方向投影的距離,其中,最大距離lmax和最小的距離lmin的差即直線段的寬度width,起點Start和終點End的位置,通過如下公式計算:
xstart=cx+lmincos(θline),ystart=cy+lminsin(θline),
xend=cx+lmaxcos(θline),yend=cy+lmaxsin(θline). (0.17)。
作為本發(fā)明的進(jìn)一步改進(jìn),步驟S35,利用5條直線段Line[i]~Line[i+4]的起點和終點,共10個點,記為(xi,yi),i=1,2,...10,采用最小二乘法擬合圓的參數(shù),設(shè)圓的參數(shù)方程為:
(x-A)2+(y-B)2=R2 (0.18)
其中圓心(A,B),半徑R,令:
可將公式(1.7)化為:
x2+y2+ax+by+c=0(0.20)
然后利用最小二乘法,可計算得到參數(shù)a、b和c:
其中,相關(guān)參數(shù)值為:
N=10;
D=N∑xiyi-∑xi∑yi,
進(jìn)而可以擬合得到圓心和半徑,然后求點(xi,yi),i=1,2,...10與擬合得到的圓心(A,B)的距離以及偏差δi=|di-R|,若偏差δi大于一定閾值μd,則表明擬合結(jié)果不理想,所選取的5條直線段不屬于某個圓,返回步驟S34重新開始搜索,若偏差δi均小于一定閾值μd,則表明擬合結(jié)果合理,得到一個候選圓,標(biāo)記直線段Line[i]~Line[i+4]已被使用USED,立即進(jìn)入步驟S36。
本發(fā)明的有益效果是:
本發(fā)明采用基于直線段的方法檢測圓,避免直接利用邊緣點進(jìn)行檢測,克服已有技術(shù)計算復(fù)雜度高、存儲量大的缺點,具有檢測速度快、準(zhǔn)確性高等特點,可應(yīng)用于對實時性要求較高的應(yīng)用場景。
與現(xiàn)有技術(shù)相比,本發(fā)明提出的基于直線段的圓檢測方法的最大特點是不直接利用邊緣點集合進(jìn)行圓檢測,而是利用直線段集合來進(jìn)行圓檢測。前者的重要缺點是邊緣點的信息少,且邊緣點數(shù)量很大(尤其是自然圖像),對邊緣點集合進(jìn)行反復(fù)遍歷,導(dǎo)致復(fù)雜度高。本發(fā)明提出的方法是首先采用一種快速高效的方法提取出包含更多信息的直線段,再利用直線段集合,根據(jù)圓的幾何特性,通過最小二乘擬合得到圓的圓心和半徑。該方法極大減小了圓檢測的時間復(fù)雜度和空間復(fù)雜度,提高了檢測速度和準(zhǔn)確度,可應(yīng)用于實時圓檢測。
附圖說明
圖1是從圓形圖中提取邊緣直線段示例;
圖2是本發(fā)明所述的快速圓檢測方法的主要步驟;
圖3是本發(fā)明所述直線段提取主要步驟;
圖4是利用本發(fā)明的方法對示例圖像提取直線段的結(jié)果;
圖5是根據(jù)直線段集合檢測候選圓的具體步驟;
圖6是驗證候選圓并輸出候選圓的具體步驟;
圖7是驗證候選圓時直線段搜索域示意圖;
圖8是本發(fā)明對示例圖像進(jìn)行圓檢測的結(jié)果。
具體實施方式
下面結(jié)合附圖對本發(fā)明做進(jìn)一步說明。
本發(fā)明的基本前提是利用直線段來檢測圓。利用本發(fā)明的直線段檢測方法可將圓的邊緣提取為一系列的直線段。眾所周知,對于圓內(nèi)接正多邊形,當(dāng)正多邊形的邊數(shù)足夠大時,即可近似為該圓。因此,本發(fā)明對圓形物體圖像進(jìn)行直線段檢測時,相當(dāng)于是提取該圓的內(nèi)接正多邊形的各邊,再通過這些邊來恢復(fù)出圓。
下面結(jié)合一幅自然圖像作為示例圖像來進(jìn)一步闡述。
步驟S1:輸入圖像預(yù)處理。首先判斷輸入圖像是否為單通道的灰度圖像,若不是,則將輸入圖像轉(zhuǎn)換成單通道的灰度圖像。輸入圖像為三通道的RGB圖像,首先采用普通方法轉(zhuǎn)換成單通道的灰度圖像。然后,采用二維高斯濾波方法對灰度圖像進(jìn)行濾波,減小圖像噪聲。最后根據(jù)尺度因子λ(一般取0.5~0.8,大多數(shù)時候取0.8即可,無需調(diào)整此參數(shù))對濾波后的圖像進(jìn)行尺度變換,最后得到尺度變化后的灰度圖像。
步驟S2,提取圖像中的直線段,具體步驟如圖3所示。
步驟S21,對灰度圖像的每一個像素值計算梯度值和梯度角,采用2×2掩模計算。設(shè)像素點p(x,y)的灰度值為I(x,y),其梯度值G(x,y)和梯度角θ按如下公式計算:
gx(x,y)=[I(x+1,y)-I(x,y)+I(x+1,y+1)-I(x,y+1)]/2,
gy(x,y)=[I(x,y+1)-I(x,y)+I(x+1,y+1)-I(x+1,y)]/2,
根據(jù)梯度值G(x,y)從大到小對像素點進(jìn)行排序,其中,若G(x,y)<ρ,則將該像素點排除(ρ為梯度閾值),減少噪點和無意義的點。經(jīng)過排序的像素點集合為PointSets。
步驟S22,從有序的像素點集合PointSets中獲取一個種子像素點p(x,y),將其加入到直線段可能域LineRegion中,并將種子像素點p(x,y)的梯度角作為LineRegion的角度θreg,然后對LineRegion中的每個像素點,在其8鄰域中搜索滿足以下約束的點:(1)該點未被使用UNUSED,(2)該點的梯度角θi與θreg之差小于角度誤差角τ,即|θreg-θi|<τ。將滿足約束的點加入到LineRegion中,標(biāo)記該點被使用USED。按下面公式更新θreg:
angx=cos(θreg),
angy=sin(θreg),
angx=angx+cos(θi), (0.24)
angy=angy+sin(θi),
θreg=arctan(angx/angy).
按上述方式搜索,直到?jīng)]有新的點加入到LineRegion中。判斷LineRegion中的點數(shù),若點數(shù)小于閾值Nthresh則拋棄該LineRegion。
步驟S23,根據(jù)直線段可能域LineRegion計算直線段參數(shù),包括中心位置、起點、終點、方向角度和寬度。由LineRegion代表的直線段具有一定寬度,可以看成是一個小矩形區(qū)域,其中心位置為rec(cx,cy),計算方法是利用LineRegion中的所有點,根據(jù)所有點的梯度值進(jìn)行加權(quán)平均,如下公式:
直線段方向角θline由如下矩陣的最小特征值有關(guān)的特征值計算出來:
假設(shè)上述公式中矩陣M的兩個特征值為λ1≥λ2,則直線段方向角θline按一下公式計算:
θline=atan((λ2-mxx)/mxy) (0.27)
求得直線段方向角后,即知道直線段的方向,再對LineRegion中所有點遍歷,計算該點到中心點沿直線段兩個正交軸方向投影的距離。其中,最大距離lmax和最小的距離lmin的差即直線段的寬度width,起點Start和終點End的位置,可通過如下公式計算:
步驟S24,重復(fù)步驟S22-S23,得到包含參數(shù)信息的直線段集合LineSets。利用本發(fā)明的方法對示例圖像提取直線段的結(jié)果如圖4所示。
步驟S3,根據(jù)直線段集合檢測候選圓,具體步驟如圖5所示。
步驟S31,從直線段集合LineSets中選取一條標(biāo)記為未使用UNUSED的初始直線段Line[i],標(biāo)記Line[i]已被使用USED,在其終點End附近鄰域(如5×5)搜索是否存在一條直線段Line[i+1]滿足以下約束條件:(1)該直線段Line[i+1]未被使用,即標(biāo)記為UNUSED;(2)該直線段Line[i+1]的起點Start在直線段Line[i]的終點End的鄰域內(nèi);(3)直線段Line[i+1]的方向角θline[i+1]減去Line[i]的方向角θline[i]小于一定閾值γ,即|θline[i+1]-θline[i]|<γ。若沒有搜索到滿足上述3條約束的直線段Line[i+1],返回重新選取一條標(biāo)記為未使用UNUSED的初始直線段進(jìn)行搜索。若搜索到滿足約束的直線段Line[i+1],立即開始步驟S32。
步驟S32,在Line[i+1]的終點End附近鄰域搜索一條滿足如下約束條 件的直線段Line[i+2]:(1)該直線段Line[i+2]未被使用;(2)該直線段Line[i+2]的起點Start在直線段Line[i+1]的終點End的鄰域內(nèi);(3)直線段Line[i+2]的方向角減去Line[i+1]的方向角的差值小于一定閾值,即|θline[i+2]-θline[i+1]|<γ;(4)sign(θline[i+2]-θline[i+1])與sign(θline[i+1]-θline[i])符號相同。
若沒有滿足上述4條約束的直線段Line[i+2],返回步驟S31重新開始搜索。若搜索到一條滿足上述4條約束的直線段Line[i+2],立即開始步驟S33。
步驟S33,在Line[i+2]的終點End附近鄰域搜索一條滿足如下約束條件的直線段Line[i+3]:(1)該直線段Line[i+3]未被使用;(2)該直線段Line[i+3]的起點Start在直線段Line[i+2]的終點End的鄰域內(nèi);(3)直線段Line[i+3]的方向角減去Line[i+2]的方向角的差值小于一定閾值,即|θline[i+3]-θline[i+2]|<γ;(4)sign(θline[i+3]-θline[i+2])與sign(θline[i+2]-θline[i+1])符號相同。若沒有滿足上述4條約束的直線段Line[i+3],返回步驟S32重新開始搜索。若搜索到一條滿足上述4條約束的直線段Line[i+2],立即開始步驟S34。
步驟S34,在Line[i+3]的終點End附近鄰域搜索一條滿足如下約束條件的直線段Line[i+4]:(1)該直線段Line[i+4]未被使用;(2)該直線段Line[i+4]的起點Start在直線段Line[i+2]的終點End的鄰域內(nèi);(3)直線段Line[i+4]的方向角減去Line[i+3]的方向角的差值小于一定閾值,即|θline[i+4]-θline[i+3]|<γ;(4)sign(θline[i+4]-θline[i+3])與sign(θline[i+3]-θline[i+2])符號相同。
若沒有滿足上述4條約束的直線段Line[i+4],返回步驟S33重新開始搜索。若搜索到一條滿足上述4條約束的直線段Line[i+4],立即開始步驟S35。
步驟S35,利用5條直線段Line[i]~Line[i+4]的起點和終點,共10個點,記為(xi,yi),i=1,2,...10,采用最小二乘法擬合圓的參數(shù)。設(shè)圓的參數(shù)方程為:
(x-A)2+(y-B)2=R2 (0.29)
其中圓心(A,B),半徑R。令:
可將公式(1.7)化為:
x2+y2+ax+by+c=0(0.31)
然后利用最小二乘法,可計算得到參數(shù)a、b和c:
其中,相關(guān)參數(shù)值為:
N=10;
D=N∑xiyi-∑xi∑yi,
(0.33)
進(jìn)而可以擬合得到圓心和半徑。然后求點(xi,yi),i=1,2,...10與擬合得到的圓心(A,B)的距離以及偏差δi=|di-R|。若偏差δi大于一定閾值μd,則表明擬合結(jié)果不理想,所選取的5條直線段不屬于某個圓,返回步驟S34重新開始搜索。若偏差δi均小于一定閾值μd,則表明擬合結(jié)果合理,得到一個候選圓,標(biāo)記直線段Line[i]~Line[i+4]已被使用USED,立即進(jìn)入步驟S36。
步驟S36,重新開始步驟S31~S35,直到直線段集合LineSets中的所有標(biāo)記為UNUSED的直線段都搜索完畢。獲得候選圓的集合CircleSets。
步驟S4,驗證候選圓并輸出候選圓,具體步驟如圖6所示。
步驟S41,對候選圓集合CircleSets,選取一個候選圓,圓心(Ai,Bi)和半徑Ri,搜索,若存在另一個候選圓,圓心(Aj,Bj)和半徑Rj,滿足以下關(guān)系:(1)兩圓心距離小于一個閾值,dij<CenterDistThresh;(2)兩圓半徑之差小于一個閾值|Ri-Rj|<RadiusDistThresh;表明檢測到重復(fù)的圓,應(yīng)該刪掉。最后得到更新后的候選圓集合CircleSets。
步驟S42,遍歷更新后的候選圓集合CircleSets,對某個候選圓Circle[i],根據(jù)其圓心(Ai,Bi)和半徑Ri大小,在半徑均值為Ri的圓環(huán)區(qū)域內(nèi)搜索,如圖7所示,若在四個象限中的至少三個象限圓環(huán)區(qū)域內(nèi)都搜索到存在直線段, 則表明該候選圓是一個真實圓,而不是一個圓弧段,否則刪掉誤檢出的圓。更新候選圓集合CircleSets。
步驟S43,輸出最后更新的候選圓集合CircleSets,即檢測到的包含圓心位置和半徑大小的真實圓。采用本發(fā)明對示例圖像進(jìn)行圓檢測的結(jié)果如圖8所示,正確檢測出示例圖中的兩個圓,示例圖大小271×240,檢測運行時間為54ms(計算機(jī)內(nèi)存2G,頻率2.2GHz)。
以上內(nèi)容是結(jié)合具體的優(yōu)選實施方式對本發(fā)明所作的進(jìn)一步詳細(xì)說明,不能認(rèn)定本發(fā)明的具體實施只局限于這些說明。對于本發(fā)明所屬技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干簡單推演或替換,都應(yīng)當(dāng)視為屬于本發(fā)明的保護(hù)范圍。