周蘭鳳 李 玲 方 華* 章民融
1(上海應(yīng)用技術(shù)大學(xué)計算機科學(xué)與信息工程學(xué)院 上海 201418) 2(上海市計算技術(shù)研究所有限公司 上海 200040)
目前有許多目標(biāo)需要先進行迅速準(zhǔn)確的類圓形檢測,因此,從一幅圖片中快速準(zhǔn)確地檢測出類圓,是一個有必要的研究問題,但在圖片數(shù)據(jù)量日益增大的情況下,所有現(xiàn)有的圓形或橢圓形檢測方法在不同的方面均存在一些問題。
近些年來,人們致力于圓形、橢圓形等的識別,以便能快速從一幅圖片中快速、準(zhǔn)確地檢測出類圓,從而進一步進行目標(biāo)檢測。由于圖像的復(fù)雜性以及類圓形參數(shù)較多,至今沒有統(tǒng)一的方法來檢測和識別類圓形圖像。對于標(biāo)準(zhǔn)圓檢測,文獻[1]總結(jié)了在各種研究中圓檢測常用的幾種算法,如經(jīng)典Hough算法、隨機Hough算法和廣義Hough算法,并提出將其應(yīng)用到自動測試織物防水性能中。尚璐等[2]提出從橢圓的弧長著手,橢圓的一般方程及參數(shù)通過同一段弧長的邊緣點的位置信息和梯度信息確定,該算法的有效性和檢測時間均優(yōu)于一般的檢測算法。韋宏強等[3]結(jié)合邊界跟蹤算法與Hough變換能夠快速準(zhǔn)確地計算出橢圓參數(shù),并形成橢圓邊界鏈碼,消除噪聲及非閉合的數(shù)據(jù),達到較好的實驗效果。王艷芳[4]利用橢圓的閉合邊界的特點,給出了一種高效檢測橢圓的方法,提出橢圓邊界鏈碼的概念對橢圓進行邊緣檢測和跟蹤,并使用濾波消除噪聲及非閉合的數(shù)據(jù)使得邊緣檢測更加清晰,以形成橢圓邊界鏈碼,在鏈碼上尋找對偶點并進行Hough變換,從而精確檢測出橢圓。本文結(jié)合類圓形狀的具體特征,應(yīng)用幾何概念對所要識別的圖像進行灰度轉(zhuǎn)換及二值化,依次獲取圖像的邊緣,舍棄較為分散的點,構(gòu)成圖形邊緣,除此之外,使用Hough變換進行類圓參數(shù)的提取,得到該類圓形的中心。文獻[15]提出多圓檢測,通過區(qū)域生長沿水平和垂直方向搜索候選圓并用Helmholtz原則進行驗證??梢杂行z測重疊圓形輪廓。
Fourie[6]基于噪聲影響和大型復(fù)雜圖像,改善了在圓檢測中使用“和諧搜索”(HS),使算法能夠在較大的數(shù)據(jù)集中穩(wěn)健地找到多個圓圈。綜上,本文對Hough圓變換做出一系列改進,并對類圓形的具體輪廓進行分析,來對該類圓形進行檢測并識別出邊緣。
取二維圖像空間中任意圓,圓半徑為R、橫縱坐標(biāo)分別為x、y,轉(zhuǎn)換為三維參數(shù)空間中的一個點,該過程稱為Hough變換[7],即將二維圖像空間中的邊緣像素點對應(yīng)為極坐標(biāo)中的點,然后把三維參數(shù)空間中的坐標(biāo)點元素對應(yīng)的值依次累加,得到的累積最大值即圓心所在點[8]。
圓的一般方程如下:
(x-a)2+(y-b)2=R2
(1)
具體參數(shù)如圖1所示。
圖1 圓參數(shù)示意圖
由圖1可知,(a,b)為該圓圓心,R為該圓半徑。在直角坐標(biāo)系中,將圓上的點(x,y)轉(zhuǎn)換到三維空間中,對應(yīng)的公式如下:
x=a+Rcosθ
y=b+Rsinθ
(2)
在參數(shù)空間中任取一邊緣點(x0,y0),以半徑R0映射到參數(shù)空間。將這個邊緣點代入式(2),變換后可得:
(3)
式中:θ∈[0,2π)。由式(3)可得,對θ進行遍歷,圖像空間上的點(x0,y0)全部映射到參數(shù)空間即為一個圓。由此我們可以推出,在參數(shù)空間中的任意一個邊緣點對應(yīng)到參數(shù)空間相連后均生成一個圓[9]。
對原始圖像使用Hough變換進行圓檢測時,具體的檢測步驟如下:
(1) 首先原始圖像進行分析預(yù)處理,對圖像做灰度化和二值化操作。
(2) 對目標(biāo)圖像進行類圓形的邊緣檢測,發(fā)現(xiàn)可能的邊界。
(3) 在參數(shù)空間ρ-θ中建立一個累加數(shù)組,數(shù)組初值為0。
(4)
圖像中被檢測類圓形的參數(shù)ρ和θ由峰值檢測取得。
參數(shù)空間需等分成m行、n列,m為θ的等分?jǐn)?shù),n為ρ的等分?jǐn)?shù),并設(shè)置累加值矩陣。設(shè)置半徑最小刻度、角度最小刻度、半徑的最大值和最小值。遍歷所有的像素點,求出a和b的值。然后判斷(a,b)是否在矩陣(m,n)中,如果(a,b)在該范圍內(nèi),累加器加1,從而獲得Hough累積矩陣[10]。
在圓的檢測中需要設(shè)置閾值,使用最大累加值確定閾值。搜索超過閾值的點對應(yīng)的參數(shù)即圓的參數(shù)。使用不同的閾值將獲得不同的檢測效果,如果閾值設(shè)置為0.75,那么大于最大累加值的75%的累積矩陣對應(yīng)的圓都可以檢測出來[11]。具體圓形檢測原理如圖2所示。
圖2 Hough變換原理
具體算法功能流程如圖3所示。
圖3 系統(tǒng)功能流程
類圓圓心的獲取方式如下:首先,需要對已經(jīng)獲取的圖像邊界點進行過濾,以獲取一種連續(xù)邊界。假設(shè)類圓圓心為O點,在該圖像所在的平面建立一條水平掃描線,依次從該類圓形的邊緣向下掃描,在一維空間中,中點計數(shù)采用Hough變換的方法,計數(shù)最大值對應(yīng)的中點即可看作類圓心O[12]。
本文首先通過邊緣檢測查找出該目標(biāo)圖形的輪廓,依次遍歷輪廓上的每一個點,進行數(shù)值比對以獲得輪廓上最遠距離的兩個點,取圓上任意一點(除這兩點之外),最遠距離的兩點的連線視為該類圓形的直徑,判斷該直徑所對的角度范圍是否在80°~100°左右,若是,則對該邊緣進行描繪并給出中心點O。具體參數(shù)如圖4所示。
圖4 圓周角a
在該算法中,首先需要對原圖進行邊緣檢測,在保留原有圖像屬性的情況下,顯著減少圖像的數(shù)據(jù)規(guī)模,具體邊緣檢測步驟如下[13]:
(1) 使用高斯濾波去除噪聲達到平滑圖像的目的。
(2) 尋找該類圓形邊界的強度梯度,即根據(jù)不同像素值對圖像進行劃分。
(3) 用非最大抑制技術(shù)沿邊緣方向追蹤邊緣點來消除邊緣誤檢。
(4) 使用雙閾值的方法來決定可能的邊界,并繪出邊界。
在邊緣檢測成功之后查找圖片中所需要判斷點的輪廓,依次遍歷輪廓上的每一個點來得到輪廓上最遠的兩個點,如圖4所示的AB,在圓上任取一點(除這兩點之外),判斷AB邊所對應(yīng)的角a是否在80°~100°之間,若該角度在該范圍內(nèi),則可以對該圖形進行標(biāo)記,可用于進一步的識別。
下面給出該算法核心函數(shù)的具體實現(xiàn):
(1) 獲取類圓直徑的平方,和直徑與圓周的輪廓的兩個交點。
1. # 讀其中一個輪廓序列,開始提取,讀其中一個序列中的元
# 素點
2. # 對輪廓上的每一個點進行遍歷,找出最遠的兩個點,作為
# 直徑,中心點為圓心,
3. # 輪廓上任一點,該三點構(gòu)成圓周角進行判斷,若在90°左
# 右,則畫圓
4. def get_center_diam(data=np.ndarray):
5. max=0
# 直徑的平方
6. point_max=[]
# 輪廓上距離最遠點
7. points=data.tolist()
8. count=len(data.tolist()) # 一個輪廓序列的點個數(shù)
9. for i in range(count):
10. points[i][0][0]
11. # i是取第i個點,第一個0去除一層外括號,第二個0是取
# 第一個值
12. length=(points[i][0][0]-points[0][0][0])**2+(points[i][0][1]-points[0][0][1])**2
#判斷直徑
13. if length>max:
14. max=length
15. point_max=points[i][0]
16. return max,point_max,points[0][0]
17. # max為直徑的平方,point_max為距離最遠點,points[0][0]
# 為起始點
(2) 圓周角計算函數(shù)如下:
1. def get_angle(pointa=[],pointb=[],pointc=[]):
2. # 定義直徑所在的兩端點和圓上一點
3. a=pointa[0]
4. # 三點構(gòu)成的三角形,計算所需要余弦角的各個線段長度
5. dx1=pointa[0]-pointc[0]
6. dy1=pointa[1]-pointc[1]
7. dx2=pointb[0]-pointc[0]
8. dy2=pointb[1]-pointc[1]
9. angle_line=(dx1*dx2+dy1*dy2)/cmath.sqrt((dx1*dx1+dy1*dy1)*(dx2*dx2+dy2*dy2)+1e-10)
10. return cmath.acos(angle_line)*180/3.141592653
11. # 采用反余弦公式計算出該角度數(shù)
(3) 獲取直徑和具體角度判斷如下:
1. def get_result(max=0,point_max=[],data=np.ndarray):
2. if point_max==[]:
3. return False
4. max=cmath.sqrt(max*1.0)
5. # 獲取直徑長度
6. points=data.tolist()
7. # 轉(zhuǎn)化為列表形式
8. count=len(data.tolist())
9. # 一個輪廓序列的點個數(shù)
10. for i in range(count):
11. # 遍歷輪廓序列,調(diào)用角度函數(shù)計算該圓周角,判斷圓周#角是否在80°~100°之間
12. if i>0:
13. t=abs(get_angle(points[0][0],point_max,points[i][0]))
14. if t>80 and t<100 and points[i]!=point_max:
15. return True
16. return False
本文算法基于圓半徑的特點,從其中心到其周邊的任何線段都相等,提出若某一圖形上的任何一點到判定后的中點都在該半徑內(nèi)波動,則該圖形可近似看成圓形。
在此算法中,首先需要通過邊緣檢測識別出該圖像輪廓,依次遍歷該輪廓上的點,由此,可以得到輪廓上距離最遠的兩個點,如圖5所示,AB的中點O假定為圓心,則該兩點間距離可假設(shè)為直徑。若在識別出的邊緣上每個點到這個中點的距離在這個半徑數(shù)值附近波動,即m和n的長度可近似相等,在此還需對該半徑數(shù)據(jù)做歸一化處理,以解決直徑大的直徑小的波動范圍不一致問題,由此可近似判定該圖形類圓。
圖5 橢圓參數(shù)及點O到曲線邊緣的距離
本文算法使用Python語言實現(xiàn),采用Python 3.7、OpenCV 3.4.3.18。本文算法對于圖像的基礎(chǔ)處理步驟如下:代碼首先需要對原圖像進行邊緣檢測,二值化操作后確定該類圓形的邊緣。對于圖像邊緣的任意一個非零點都需要采用Sobel算子,對于參數(shù)指定的每一個像素都需要在累加器中疊加并做出標(biāo)記。累加器圖像的反比分辨為1,Canny邊緣函數(shù)的高閾值設(shè)置為60,圓心檢測閾值設(shè)置為26。圓心檢測閾值需要根據(jù)圖像中的圓大小設(shè)置,當(dāng)這幅圖片中的圓越小,那么此值就應(yīng)該被設(shè)置得越小,避免噪聲的產(chǎn)生。在實驗結(jié)果上,該類圓的邊緣檢測在實驗中達到了很好的實驗效果。
本實驗在Windows 10系統(tǒng),基于x64的處理器,具體處理器為Inter(R) Core(TM) i7-10510U CPU @ 1.80 GHz 2.30 GHz上實現(xiàn),內(nèi)存大小為12.0 GB。
與Hough圓變換相比,在某些情況下本實驗對于類圓形的檢測成功率較高,第一幅測試圖的具體參數(shù)為675×446(24-bit color),該測試圖僅用于測試該算法識別的精確度。第二幅測試圖的具體參數(shù)為309×163(24-bit color),該隕石坑測試圖來源于中國探月工程。第三幅數(shù)字高程圖(DEM)來源于月球探測軌道器(LRO)和Kaguya數(shù)字高程圖的隨機截圖。具體實驗結(jié)果如圖6-圖12所示。
圖6 原圖
圖7 Hough圓算法運行結(jié)果
圖8 改進算法運行結(jié)果
圖9 隕石坑測試
圖10 隕石坑測試結(jié)果
圖11 隕石坑DEM截圖
圖12 測試結(jié)果
可以發(fā)現(xiàn)該算法對于類似圓形的識別成功率較高,在邊緣清晰度較高的情況下可以準(zhǔn)確描繪出圖像的邊緣。但在邊緣清晰度不高的情況下,可以直接對該圖像邊緣進行描繪,對于數(shù)字高程圖而言,邊緣檢測的閾值范圍設(shè)置為(30,70),閾值分割后得到的圖像的檢測效果較好,如圖12所示。在本實驗中,Canny邊緣檢測算法發(fā)揮了很好的作用,對邊緣描繪的準(zhǔn)確度較高,但本實驗依舊存在一些不足,對于圓周角變化較大的圓形識別成功率較低且在實際應(yīng)用中需要對閾值參數(shù)進行調(diào)節(jié),才可以得到更好的實際應(yīng)用效果。
類圓形的識別與檢測的算法在工業(yè)檢測線、生物醫(yī)學(xué)監(jiān)測設(shè)備、自動化裝配線上,都有廣泛的應(yīng)用。文獻[4]將基于直徑累積的Hough變換檢測圓算法應(yīng)用到人頭輪廓統(tǒng)計和人數(shù)統(tǒng)計上。但是該算法在人數(shù)較多或人頭輪廓非圓形時,會出現(xiàn)漏檢等情況,且該算法對于直徑的判斷復(fù)雜度較高。文獻[15]中提出一種基于曲線擬合的圓形檢測算法,對公路上的交通信號燈進行識別。但該算法僅針對圓形曲線擬合情況來判斷該標(biāo)志是否是圓心,對圓形的檢測成功率不高。
本文提出的針對圓形基本特點的類圓形檢測算法,對于類圓形檢測成功率能達到90%,在檢測目標(biāo)數(shù)目較多時也能達到很好的識別效果且當(dāng)圓形重疊時也可以很好地對該類圓形的邊緣進行描繪,具有很好的魯棒性,可應(yīng)用于公交客流統(tǒng)計、自動識別棒材半徑、自動識別圓形汽車零件,可以滿足工業(yè)生產(chǎn)實時性的要求。
本文算法在隕石坑的識別上可以得到很好的應(yīng)用。在月球車的路徑規(guī)劃方面,對于隕石坑的識別與檢測可以給路徑規(guī)劃提供較好的數(shù)據(jù)依據(jù)以規(guī)避障礙,因此本文算法的提出是有必要的。下一步的研究重點是將深度學(xué)習(xí)與本文算法結(jié)合,期望能在隕石坑的識別中得到很好的效果。
Hough變換在各種形狀檢測方面取得了很好的成果,但在對橢圓以及類圓形的檢測上,由于參數(shù)的增多,Hough變換檢測成功率急劇降低。但在很多實際應(yīng)用中比如人流統(tǒng)計、對人頭輪廓進行檢測計數(shù),以及在月球地形中關(guān)于隕石坑的識別上均需要對類圓形進行邊緣檢測。本文結(jié)合類圓形的特點,提出兩種檢測方案,應(yīng)用Canny算法進行邊緣檢測,分別從圓周角和圓心距對該圖形進行判斷,并勾畫出該圖形的輪廓和中心,該實驗在某些時候可以取得較好的實驗效果,在類圓圓心的選取上與標(biāo)準(zhǔn)Hough變換相比,計算復(fù)雜度降低,因此具有更高的檢測精度且該算法對于圓形重疊也有很好的檢測效果。將該算法更精確地應(yīng)用到月球隕石坑的檢測中,將是進一步研究的重點。