胡 鑫,歐陽華,侯卓成,李厚樸
(海軍工程大學(xué) 電氣工程學(xué)院,武漢 430033)
在利用圖像處理的方法對指針式儀表讀數(shù)進(jìn)行識別時,為了得到更為準(zhǔn)確的讀數(shù)值,需要使得指針圖像的直線擬合的誤差減小。這其中對于指針的細(xì)化處理這一步驟十分關(guān)鍵,指針細(xì)化的質(zhì)量好壞直接影響著擬合直線的斜率。因此,對指針圖像進(jìn)行更好程度的細(xì)化具有重要意義[1-3]。
細(xì)化算法[4-5]根據(jù)迭代的方式可以將細(xì)化算法分成串行細(xì)化算法和并行細(xì)化算法。串行算法對于是否刪除像素是之前所有迭代的結(jié)果和本次迭代中已處理過像素點情況的綜合判定;并行算法當(dāng)前迭代階段像素點的刪除僅取決于上一次迭代的結(jié)果。
現(xiàn)存的較為普遍的算法中,Hilditch[6]算法是
串行細(xì)化算法的一種,通過多次反復(fù)遍歷圖像進(jìn)行迭代來刪除滿足條件的像素,此算法判斷依據(jù)不夠簡潔有效,十分費時;Pavlidis[7]算法屬于并行細(xì)化算法,通過兩個模板之間的匹配逐層刪除邊界像素,此算法最后會使得骨架的冗余像素較多,細(xì)化效果不好;基于索引表[8]的算法即利用判定條件生成一張表,然后進(jìn)行像素查詢。此算法運行速度快,但是依賴于索引表的便利,也受限于索引表的信息,結(jié)果多出現(xiàn)毛刺和圖像骨架畸變;ZS 細(xì)化算法[9-11]所代表的基于數(shù)學(xué)形態(tài)學(xué)的并行細(xì)化方法運行迭代少、速度快,骨架中直線、T 行交叉和拐角與原圖像一致,因此更易于實現(xiàn)且計算簡單。但是經(jīng)過ZS 細(xì)化算法細(xì)化之后,會出現(xiàn)2 個問題:①骨架中會出現(xiàn)冗余像素,不能保證骨架為單像素寬;②骨架中會出現(xiàn)毛刺,影響圖像整體的結(jié)構(gòu)。
本文針對ZS 細(xì)化算法提取儀表盤上的指針圖像骨架時出現(xiàn)的問題做出改進(jìn)。針對指針細(xì)化中斜線時產(chǎn)生冗余像素這一問題引入斜線消除模板使得經(jīng)過細(xì)化之后的骨架為單像素寬。并在此基礎(chǔ)上引入路徑規(guī)劃[12-14]的思想,將毛刺看作錯誤的路徑,將去毛刺問題轉(zhuǎn)化為尋找最優(yōu)路徑的問題。通過分析分叉點的8 鄰域,找到ZS 細(xì)化算法產(chǎn)生毛刺的原因,從而設(shè)置條件將錯誤路徑刪除,最后得到唯一一條最優(yōu)路徑,也就是沒有毛刺的指針骨架,正確地突出指針的結(jié)構(gòu)特征。
設(shè)一個二值圖像M,圖像M 中的任意一個目標(biāo)像素點為P0,為了更利于對算法過程進(jìn)行描述,先給出幾個基本概念:
1)8 鄰域:與目標(biāo)像素點P0相鄰的8 個像素點所構(gòu)成的1 個集合S={P1P2P3P4P5P6P7P8},8鄰域的像素點圍繞著P0以順時針順序依次排列,如圖1所示。
圖1 目標(biāo)像素8 鄰域Fig.1 Target pixel 8 neighborhood
2)目標(biāo)點和背景點:二值圖像中像素值為1 的像素點為目標(biāo)點,像素值為0 的像素點為背景點。
3)分叉點:當(dāng)P0的8 鄰域內(nèi)存在3 個及以上的目標(biāo)點時,P0為分叉點。
4)邊界點:8 鄰域中至少存在1 個背景點的目標(biāo)點。
ZS 細(xì)化算法是每次迭代分2 個子過程進(jìn)行,通過不斷執(zhí)行邏輯運算來刪除符合條件的非骨架點。其細(xì)化過程如下:
第1 步:設(shè)一目標(biāo)點為P0,當(dāng)其為邊界點時,依次判斷P0點是否滿足以下條件:
條件1 中的N(P0)指的是點P0的8 鄰域中屬于目標(biāo)點的個數(shù);條件2 中的S(P0)指的是點P0的8 鄰域按順時針的順序從P1到P8,這些像素點的值由0 跳變到1 的次數(shù)。
第2 步:
第2 步與第1 步的條件1 和2 都是一樣,首先是保證了目標(biāo)點P0的8 鄰域中存在連通的目標(biāo)點,在刪除目標(biāo)點P0后還依舊具備構(gòu)成骨架的基礎(chǔ)。這兩個步驟的后2 個條件一共4 個公式的目的是標(biāo)記8 鄰域4 個角的非骨架像素點。
經(jīng)典ZS 并行細(xì)化算法通過迭代這兩個步驟,不斷標(biāo)記滿足條件的像素點,最后將迭代過程中所標(biāo)記的像素點全部刪除,剩下的像素點構(gòu)成新的骨架圖像,從而達(dá)到細(xì)化的目的。
對于處于傾斜狀態(tài)的指針,ZS 細(xì)化算法并不能很好地徹底骨架化,會存在大量的冗余像素,使得細(xì)化的骨架達(dá)不到單像素寬,這也說明ZS 算法對斜線的細(xì)化能力還不夠好;另外,細(xì)化后的指針骨架上存在著一些毛刺無法消除。為了解決對指針圖像的細(xì)化過程中存在的問題,將對ZS 細(xì)化算法進(jìn)行針對性的改進(jìn)。
分析指針經(jīng)過ZS 細(xì)化算法細(xì)化之后還存在非單像素寬的現(xiàn)象,其根本原因是兩個步驟中的條件2:S(P0)=1 阻止了對這些像素點的刪除,結(jié)果便造成了像素的冗余。針對此問題,設(shè)置4 個傾斜方向的刪除模板,如圖2和圖3所示。對指針細(xì)化中可能會遇到的4 種傾斜情況時可刪除像素點進(jìn)行消除。
(1)引入8 鄰域的東西南北方向,當(dāng)像素直線為東北—西南走向時,其刪除模板如圖2所示的兩種情況。
圖2 刪除模板1Fig.2 Delete template 1
(2)當(dāng)像素直線為西北—東南走向時,其刪除模板又如圖3所示的兩種情況。
圖3 刪除模板2Fig.3 Delete template 2
刪除模板中的目標(biāo)點P0應(yīng)該滿足以下條件:
通過上述4 個模板來消除指針細(xì)化過程中出現(xiàn)的冗余像素的情況,當(dāng)目標(biāo)點P0滿足任意一種條件對應(yīng)的模板,則將此目標(biāo)點刪除,以達(dá)到將指針骨架細(xì)化成單像素寬。
細(xì)化產(chǎn)生毛刺的原因是儀表表盤上的標(biāo)志會與指針在二值化后形成連通區(qū)域,在跟隨指針一同細(xì)化后便形成了指針骨架的毛刺,一定程度上對指針的形狀特征造成影響。
在本文中,為了去除毛刺,引入了搜索最優(yōu)路徑的思想。將指針圖像的細(xì)化骨架認(rèn)為是唯一的最優(yōu)路徑,而毛刺則被認(rèn)為是不同的分支路徑。從而,去除毛刺的問題就被轉(zhuǎn)化成為如何在有分支路的情況下選擇出需要的那條最優(yōu)路徑的問題。
算法的核心思想是傳遞目標(biāo)像素點,經(jīng)過前面步驟的優(yōu)化,指針圖像被細(xì)化成單像素寬的骨架。將當(dāng)前骨架點通過條件的判斷傳遞至下一步,以此來搜索出最優(yōu)路徑。其判斷依據(jù)是8 鄰域的目標(biāo)像素點個數(shù)。根據(jù)當(dāng)前骨架點的8 鄰域中目標(biāo)點個數(shù),分為幾種情況展開討論:
1)當(dāng)8 鄰域的目標(biāo)點個數(shù)為1 時,可能為路徑搜索的起點,也可能是任一一條路徑的終點;
2)當(dāng)8 鄰域的目標(biāo)點個數(shù)為2 時,此時的2 個目標(biāo)像素點分別為當(dāng)前骨架點的上一步和下一步,即表明搜索到下一個骨架點,可以繼續(xù)傳遞;
3)當(dāng)8 鄰域的目標(biāo)點個數(shù)為3 個以上時,表明當(dāng)前骨架點為分叉點。
這里為了避免一次路徑搜索過程中像素點的重復(fù)遍歷,設(shè)定規(guī)則當(dāng)前骨架點進(jìn)行傳遞的下一步不得為上一個搜索骨架點。并且,為了解決在搜索到分叉點遇到的特殊情況,如圖4所示,導(dǎo)致路徑搜索陷入死循環(huán),設(shè)定規(guī)則:當(dāng)遇到分叉點時,當(dāng)前骨架點進(jìn)行傳遞的下一步也不得為上2 個搜索骨架點。
圖4 特殊分叉點Fig.4 Special bifurcation points
整個去除毛刺過程的具體步驟如下:
步驟1遍歷所得到的單像素寬指針細(xì)化圖像,檢測出指針骨架的起點和終點;
步驟2開始判斷當(dāng)前骨架點8 鄰域中目標(biāo)像素點的個數(shù)n,當(dāng)n=2 時,即傳遞方向只有1 個,路徑唯一,直接傳遞到下一步的目標(biāo)像素點;當(dāng)n>2時,即出現(xiàn)分支,傳遞方向不唯一,此時開始進(jìn)行分支的逐一搜索。當(dāng)被搜索的分支不為所需的主干骨架,則停止本次搜索,并將此分支去掉,然后開始新一輪的最優(yōu)路徑搜索;
步驟3重復(fù)執(zhí)行步驟2,最后逐一將其余分支去除,搜索到唯一一條滿足所有條件的路徑,即可得到去除毛刺的單像素寬指針圖像。
此次改進(jìn)算法主要分為3 個部分:①通過ZS細(xì)化算法得到指針的初步細(xì)化圖像;②利用增加的刪除模板,使得初步細(xì)化圖像實現(xiàn)骨架單像素寬;③通過最優(yōu)路徑搜索的方式去除毛刺。算法工作流程如圖5所示。
圖5 算法工作流程Fig.5 Algorithm work flow chart
為了驗證改進(jìn)算法的細(xì)化效果,實驗選取了50幅不同角度的儀表指針圖像進(jìn)行細(xì)化處理。將原圖、ZS 細(xì)化算法和兩次優(yōu)化得到的指針細(xì)化圖像進(jìn)行對比。實驗使用Matlab2017a 進(jìn)行圖像細(xì)化處理。部分圖像的細(xì)化效果如圖6所示。
圖6 ZS 細(xì)化算法Fig.6 ZS thinning algorithm
由圖6可知,經(jīng)過ZS 細(xì)化算法處理過后,指針骨架的大致結(jié)構(gòu)保持良好,但是從圖中2 個選定區(qū)域可以得知,骨架還是存在著一些冗余像素沒有去掉,無法實現(xiàn)單像素寬,并且存在著無法去除的毛刺。
骨架單像素化如圖7所示,經(jīng)過對ZS 細(xì)化算法的優(yōu)化,針對指針而設(shè)定的規(guī)則使得冗余像素被完全去除,指針骨架實現(xiàn)單像素寬。
圖7 骨架單像素化Fig.7 Skeleton single pixel
去除骨架毛刺如圖8所示,通過改進(jìn)算法的應(yīng)用,成功去除了骨架上的毛刺,使得指針圖像經(jīng)過細(xì)化之后的骨架結(jié)構(gòu)上更利于擬合成一條斜線。
圖8 去除毛刺Fig.8 Deburring
將經(jīng)過ZS 算法和兩步的改進(jìn)算法細(xì)化后得到的效果進(jìn)行對比,得到具體情況如表1所示。
表1 細(xì)化效果比較Tab.1 Comparison of refinement effects
由表1信息可知,通過本文的兩步改進(jìn),能夠使得指針的細(xì)化效果達(dá)到最好,既為單像素寬也沒有毛刺出現(xiàn)。當(dāng)利用Hough 直線檢測算法來進(jìn)行指針直線的獲取,能夠得到更為準(zhǔn)確的直線斜率值k,即擬合直線的偏轉(zhuǎn)角更為準(zhǔn)確,如圖9所示。
圖9 直線擬合Fig.9 Straight line fitting
設(shè)定指針式儀表的量程為a,擬合直線的偏轉(zhuǎn)角為θ,則其讀數(shù)的計算如式(13)所示:
實驗裝置如圖10所示。巡檢機(jī)器人探頭在吊軌上進(jìn)行移動,進(jìn)行指針式儀表圖像的抓取,并將捕獲的圖像實時傳給遠(yuǎn)程識別系統(tǒng)。并且根據(jù)識別出的讀數(shù)結(jié)果進(jìn)行分析。
圖10 實驗裝置Fig.10 Experimental device
選取識別為量程650 V 的電壓表,在實驗過程中將隨著電壓不斷增大,進(jìn)行多次識別,并進(jìn)行誤差分析,將分別利用ZS 細(xì)化算法和改進(jìn)的算法這兩種細(xì)化方式參與儀表讀數(shù)識別,從而驗證改進(jìn)算法的有效性,檢測結(jié)果如表2所示。
表2 算法識別結(jié)果誤差分析Tab.2 Error analysis of algorithm recognition results
從表2中可以得出,當(dāng)使用ZS 細(xì)化算法,指針式儀表的識別示數(shù)與實際值的誤差在-3.61~3.88 V之間,相對誤差在3.4%以內(nèi),平均相對誤差為1.21%;而當(dāng)使用本文提出的改進(jìn)算法,識別示數(shù)與實際值的誤差在-2.73~3.64 V 之間,相對誤差在2.47%以內(nèi),平均相對誤差為0.99%。
兩種算法的相對誤差對比如圖11所示,其中橫坐標(biāo)代表指針的角度,縱坐標(biāo)代表相對誤差,虛線代表運用ZS 細(xì)化算法,實線代表運用改進(jìn)細(xì)化算法。從圖中也能直觀地看出,運用改進(jìn)算法的讀數(shù)相對誤差在大體趨勢上也是低于運用ZS 細(xì)化算法得到的讀數(shù)相對誤差。
圖11 相對誤差對比Fig.11 Comparison of relative errors
因此,通過運用改進(jìn)的細(xì)化算法,指針讀數(shù)識別的平均相對誤差相比與ZS 并行細(xì)化算法降低了0.22%,有效提高了指針識別的精度。
本文針對ZS 并行細(xì)化算法進(jìn)行改進(jìn),以降低冗余像素和去毛刺為目的展開優(yōu)化。通過引入刪除模板得到單像素寬的細(xì)化骨架。改進(jìn)的細(xì)化算法中的去毛刺這個步驟,結(jié)合了搜索最優(yōu)路徑的思想,依次搜索每條路徑并判斷是否最優(yōu),因此最后的效果較好,不會漏刪毛刺。改進(jìn)細(xì)化算法為后續(xù)指針直線擬合提高了精度,實驗的驗證也進(jìn)一步表明了改進(jìn)算法的有效性,具有一定的應(yīng)用價值。