梅啟升,王 敏,梁秀玲
(福建師范大學(xué) 醫(yī)學(xué)光電科學(xué)與技術(shù)教育部重點(diǎn)實(shí)驗(yàn)室 福建省光子技術(shù)重點(diǎn)實(shí)驗(yàn)室,福建 福州 350007)
毛刺去除是將骨架的主干保留,去除骨架中的毛刺部分,在圖像處理領(lǐng)域應(yīng)用廣泛,常用于干涉條紋檢測(cè)、指紋識(shí)別、字符檢測(cè)等多個(gè)領(lǐng)域。干涉條紋骨架記錄了干涉場(chǎng)的所有干涉條紋的分布特征與狀態(tài)特征。傳統(tǒng)的骨架去除算法[1-2]需要設(shè)定閾值來判斷毛刺去除條件,但是對(duì)于部分毛刺可能會(huì)出現(xiàn)不滿足閾值設(shè)定的條件,無法消除干涉條紋骨架的毛刺部分,且毛刺可能出現(xiàn)較為復(fù)雜的情況,傳統(tǒng)算法也可能無法解決這些情況的干涉條紋骨架圖像處理問題[3]。
干涉條紋圖像是兩束相干性較強(qiáng)的光波(多用于激光)進(jìn)行干涉行為產(chǎn)生的現(xiàn)象,而干涉條紋骨架最大程度細(xì)化了干涉條紋,保留了干涉條紋最基礎(chǔ)的信息:分布與狀態(tài)。骨架分布表示干涉條紋的分布情況,骨架狀態(tài)表示干涉條紋的長(zhǎng)度、拓?fù)湫訹4]等特征。在圖像分割算法正確的前提下,大部分的毛刺是由于背景噪聲的干擾而產(chǎn)生的,而且毛刺的長(zhǎng)度是無法確定的。另外,主干、毛刺的頂端也有可能存在其他毛刺,這種情況使得傳統(tǒng)的去除毛刺方案非常不理想,甚至出現(xiàn)方案錯(cuò)誤處理的情況。因此,本文針對(duì)單像素骨架圖像提出一種基于骨架結(jié)構(gòu)的毛刺去除算法,以適應(yīng)各種不同狀態(tài)、特征的毛刺,并在去除毛刺的同時(shí)保留骨架主干部分。本文提出的算法包含2 個(gè)方面:1)通過干涉條紋骨架圖,利用骨架特征點(diǎn)對(duì)圖像區(qū)域進(jìn)行分類;2)利用骨架特征點(diǎn)追蹤出所有毛刺點(diǎn)并予以刪除處理,當(dāng)出現(xiàn)較為復(fù)雜的骨架特征時(shí),利用多種類型綜合定義該特征并予以區(qū)分。毛刺去除的難點(diǎn)在于需要保留主干部分、去除毛刺部分,這里需要考慮到多種復(fù)雜類型毛刺的層次關(guān)系,避免出現(xiàn)毛刺處理錯(cuò)誤的情況。本文利用迭代算法逐次去除某一層次毛刺,確保復(fù)雜情況下的干涉條紋骨架毛刺能夠通過正確的順序進(jìn)行去除。最后基于OpenCV 庫對(duì)多個(gè)毛刺樣本進(jìn)行同時(shí)仿真處理,并依據(jù)最終處理的結(jié)果提出合理的改進(jìn)意見。
本文算法主要框架:分析拓?fù)涮卣?、毛刺分組、去除毛刺、迭代判斷。第1 步,對(duì)圖像進(jìn)行預(yù)處理并根據(jù)預(yù)處理后的骨架毛刺特征選取出端點(diǎn)、節(jié)點(diǎn)。第2 步,通過端點(diǎn)與方向鏈碼遍歷出所有毛刺點(diǎn),并根據(jù)節(jié)點(diǎn)對(duì)毛刺分組。第3 步,對(duì)同一節(jié)點(diǎn)的所有毛刺組進(jìn)行差分運(yùn)算并去除毛刺,保留主干部分。第4 步,對(duì)處理后的圖像重新進(jìn)行拓?fù)浞治?,判斷是否完全除去了毛刺點(diǎn)。
在單像素骨架圖像中,根據(jù)八鄰域范圍內(nèi)的特征對(duì)骨架圖像進(jìn)行拓?fù)浞治觥6x本身是骨架點(diǎn)而且在八鄰域中有且只有1 個(gè)相連點(diǎn)的像素為端點(diǎn),定義本身是骨架點(diǎn)而且在八鄰域有且只有2 個(gè)不相鄰點(diǎn)的像素為骨架點(diǎn)。對(duì)于其他簡(jiǎn)單骨架毛刺情況,定義本身是骨架點(diǎn)且八鄰域中有大于等于3 個(gè)相連點(diǎn)的像素為可疑節(jié)點(diǎn),如果可疑節(jié)點(diǎn)的八鄰域中沒有其他可疑節(jié)點(diǎn),那么該點(diǎn)定義為真節(jié)點(diǎn),否則將一個(gè)八鄰域中有4 個(gè)或4 個(gè)以上的可疑點(diǎn)的像素作為真節(jié)點(diǎn),其他作為假節(jié)點(diǎn)。一般骨架毛刺的情況如圖1所示。
圖1 干涉條紋骨架毛刺的特征點(diǎn)Fig.1 Characteristic points of interference fringe skeleton burrs
圖1中:G 為骨架點(diǎn),D 為端點(diǎn),F(xiàn) 為假節(jié)點(diǎn),P 為真節(jié)點(diǎn),整個(gè)干涉條紋都可以通過這些干涉條紋骨架特征點(diǎn)進(jìn)行劃分。而毛刺點(diǎn)、骨架主干點(diǎn)都可以通過拓?fù)涮卣髋c這些特征點(diǎn)相關(guān)聯(lián)。面對(duì)多種其他的復(fù)雜毛刺情況,根據(jù)對(duì)蔡超等[5]的文獻(xiàn)進(jìn)行研究,加入了多種其他復(fù)雜的骨架毛刺特征樣本,如圖2所示。
圖2中:F 為假節(jié)點(diǎn),P 為真節(jié)點(diǎn),其他數(shù)值為1 的是骨架點(diǎn)。圖1、圖2能夠比較詳細(xì)地表示毛刺的大部分狀態(tài)。本文基于迭代模式進(jìn)行多級(jí)去除骨架毛刺,但是只有基于骨架毛刺的特征點(diǎn)選取正確,才能有效去除毛刺。
圖2 復(fù)雜毛刺的特征結(jié)構(gòu)Fig.2 Characteristic structure of complex burrs
本文提出一種基于節(jié)點(diǎn)的迭代去除毛刺算法,需要考慮以下幾個(gè)方案。
1)判斷迭代終止條件。迭代終止意味著一條干涉條紋骨架處理完畢。如果一個(gè)干涉條紋骨架只有一條主干、多個(gè)毛刺組成,不存在骨架主干分支部分,那么迭代終止條件為
式中:flag為迭代判斷變量;endpoint為端點(diǎn)個(gè)數(shù)。當(dāng)一條干涉條紋骨架只有2 個(gè)端點(diǎn)時(shí),則一條干涉條紋處理完畢,否則接著循環(huán)處理當(dāng)前的干涉條紋骨架直到滿足判斷條件。
2)選取毛刺并去除的方法。毛刺是由節(jié)點(diǎn)引出的一條細(xì)線,該細(xì)線是由干涉條紋圖像的背景噪聲造成的。通過端點(diǎn)可以利用方向鏈碼[6]將毛刺追蹤至節(jié)點(diǎn),然后將同一節(jié)點(diǎn)下的所有毛刺、主干進(jìn)行差分比較。當(dāng)端點(diǎn)數(shù)個(gè)數(shù)大于3 個(gè)時(shí),保留像素點(diǎn)個(gè)數(shù)最多的骨架部分作為第一次處理結(jié)果;當(dāng)端點(diǎn)個(gè)數(shù)等于3 個(gè)時(shí),刪除像素點(diǎn)個(gè)數(shù)最少的毛刺;當(dāng)對(duì)不同節(jié)點(diǎn)下的毛刺時(shí),不進(jìn)行差分比較處理。
式中:Trunk為保留下來的骨架;Max為取最大骨架的函數(shù);Delete為刪除處理的函數(shù);Min為取最小毛刺的函數(shù);burr1、burr2、trunk為所有毛刺與主干;P為節(jié)點(diǎn);endpoint為端點(diǎn)個(gè)數(shù)。該算法是基于干涉條紋骨架主干部分只有2 個(gè)端點(diǎn),其他端點(diǎn)是毛刺產(chǎn)生的。
3)骨架主干與毛刺分類問題。如果存在復(fù)雜骨架的情況,在存在3 個(gè)以上端點(diǎn)的情況下出現(xiàn)兩個(gè)主干部分進(jìn)行比較,采用閾值判斷條件。閾值判斷條件設(shè)置如下:
式中:Trunk為保留下來的骨架;Max為取最大骨架的函數(shù);Skip processing為跳過本次處理;burr1、burr2、trunk為同一節(jié)點(diǎn)下的所有毛刺與主干;TN為骨架主干個(gè)數(shù)。這種閾值判斷的目的不是選取毛刺而是保存骨架主干。
4)修復(fù)單條骨架斷點(diǎn)部分的方案。如果干涉條紋骨架主干部分產(chǎn)生了斷點(diǎn),本文用基于八鄰域的簡(jiǎn)單修復(fù),修補(bǔ)方案如下:如果本身像素點(diǎn)不是骨架點(diǎn),而且八鄰域內(nèi)存在2 個(gè)對(duì)稱的骨架點(diǎn),則將本身像素點(diǎn)設(shè)置為骨架點(diǎn)(見圖3)。
圖中K 周圍存在2 個(gè)對(duì)稱的骨架點(diǎn),這種情況將K 點(diǎn)設(shè)置為骨架點(diǎn),數(shù)值設(shè)置為1。這種基于模板的修補(bǔ)方案能夠有效提升算法的容錯(cuò)性,并提升骨架樣本進(jìn)行仿真的魯棒性。
5)多條干涉條紋骨架毛刺處理方法。干涉條紋圖像可能存在多個(gè)干涉條紋,細(xì)化得到的圖像依舊是多個(gè)干涉骨架。多個(gè)干涉條紋骨架需要分級(jí)處理,首先對(duì)不同干涉條紋簡(jiǎn)單標(biāo)定級(jí)次,提取不同級(jí)次的骨架圖進(jìn)行獨(dú)立處理,單條骨架處理結(jié)果單獨(dú)保存,直到所有骨架處理完畢之后將所有骨架圖合并輸出。
圖3 基于八鄰域模板的修復(fù)方案Fig.3 Repair scheme based on 8 neighborhood template
根據(jù)以上所有方案,本文基于節(jié)點(diǎn)的迭代去除毛刺算法步驟如下:
1)對(duì)干涉條紋骨架進(jìn)行級(jí)次標(biāo)記,對(duì)不同級(jí)次的骨架單獨(dú)處理,并進(jìn)行循環(huán)準(zhǔn)備;
2)首先設(shè)置迭代條件,并正確判斷圖內(nèi)的所有干涉條紋骨架、端點(diǎn)、節(jié)點(diǎn)、斷點(diǎn);
3)修補(bǔ)斷點(diǎn),并根據(jù)端點(diǎn)利用八鄰域模板進(jìn)行毛刺追蹤到節(jié)點(diǎn)終止,并以節(jié)點(diǎn)保存所有毛刺、主干的長(zhǎng)度與骨架點(diǎn)坐標(biāo);
4)設(shè)置主干閾值條件,防止出現(xiàn)錯(cuò)誤去除主干部分,并根據(jù)節(jié)點(diǎn)逐級(jí)對(duì)毛刺進(jìn)行刪除;
5)去除毛刺結(jié)束后進(jìn)行迭代判斷,如果滿足條件,跳出當(dāng)前骨架處理進(jìn)入下一條骨架進(jìn)行處理,否則骨架沒有處理完畢還存在其他毛刺接著跳至第3 步進(jìn)行迭代;
6)所有干涉條紋骨架處理完畢,一起輸出當(dāng)前所有條紋骨架圖片。
實(shí)驗(yàn)采用Visual Studio 2017 平臺(tái),采用OpenCV庫[6]對(duì)圖像進(jìn)行形態(tài)學(xué)骨架提取,軟件環(huán)境Windows7,硬件環(huán)境CPU 為i7 處理器。首先建立一個(gè)C++項(xiàng)目,并包含OpenCV 的庫目錄,最后建立一個(gè)頭文件和主程序文件。用imread 函數(shù)[7]讀取待處理的圖像,并通過imshow 函數(shù)進(jìn)行復(fù)現(xiàn)[8]。
首先對(duì)干涉條紋進(jìn)行級(jí)次標(biāo)定,單次級(jí)次標(biāo)定采用種子點(diǎn)膨脹算法如下:
式中:H為單條骨架提取圖像;F為骨架的原圖像;I為設(shè)置的種子點(diǎn);D為dilate 膨脹處理;RDF(I)表示對(duì)種子點(diǎn)D進(jìn)行迭代膨脹處理,直到與種子點(diǎn)膨脹到與對(duì)應(yīng)干涉條紋相同,一個(gè)種子點(diǎn)可以膨脹一條骨架,提取出一條骨架之后,要把原圖像中的對(duì)應(yīng)骨架去除以便進(jìn)行下一次提取。種子膨脹提取算法如圖4所示。
圖4 種子膨脹提取算法Fig.4 Seed expansion extraction algorithm
選取出單條骨架之后,需要對(duì)骨架進(jìn)行預(yù)處理防止出現(xiàn)非單像素寬度的問題,這里采用的是Zhang氏細(xì)化算法[9]、Rosen 細(xì)化算法[10]。在此之后,進(jìn)行圖像骨架特征點(diǎn)[11]提取,根據(jù)本文第1 節(jié)的骨架特征提取出端點(diǎn)、假節(jié)點(diǎn)、真節(jié)點(diǎn)。端點(diǎn)、節(jié)點(diǎn)的選取需要通過全圖掃描逐點(diǎn)判斷并標(biāo)記,直到全圖掃描完畢,如圖5所示。
特征點(diǎn)選取出來之后,對(duì)所有端點(diǎn)進(jìn)行鏈表追蹤,追蹤時(shí)面對(duì)復(fù)雜圖像可能出現(xiàn)追蹤過度或者追蹤不足的情況,本文根據(jù)節(jié)點(diǎn)的特性[12],在追蹤的算法中加入了以下判定條件:如果追蹤點(diǎn)的八鄰域中存在真節(jié)點(diǎn),那么循環(huán)終止。這里有效利用了節(jié)點(diǎn)的特征,同時(shí)也為毛刺分類端點(diǎn)打下基礎(chǔ)。
圖5 特征點(diǎn)提取Fig.5 Feature points extraction
根據(jù)節(jié)點(diǎn)對(duì)端點(diǎn)追蹤到的毛刺、主干進(jìn)行分類,如果多個(gè)毛刺、主干追蹤到同一個(gè)節(jié)點(diǎn)那么多個(gè)毛刺、主干分步保存至OpenCV 中的vector<vector>Point 類中,這個(gè)類表示一個(gè)二重元胞[13],其中元胞內(nèi)保存的是追蹤毛刺點(diǎn)、主干點(diǎn)的坐標(biāo)。根據(jù)節(jié)點(diǎn)與毛刺、主干的位置關(guān)系將毛刺、主干點(diǎn)的所有坐標(biāo)保存在vector 類的多維元胞中。然后根據(jù)第1 章的方案進(jìn)行差分比較去除毛刺,如圖6所示。
單個(gè)條紋處理完畢之后,進(jìn)行多個(gè)骨架迭代處理[14]直到所有干涉骨架都去除毛刺完畢才最終輸出到最終結(jié)果上,如圖7所示。
圖6 去除毛刺Fig.6 Deburring
圖7 最終處理結(jié)果Fig.7 Final processing results
干涉條紋獲取的實(shí)驗(yàn)裝置有632.8 nm 半導(dǎo)體激光器、擴(kuò)束鏡、偏振元件、分光棱鏡、1/4 玻片、待測(cè)元件、標(biāo)準(zhǔn)樣板等。采用的算法是基于干涉條紋骨架的特征進(jìn)行的毛刺去除算法,為了保證提出的算法具有合理性與普適性,本文用了多個(gè)樣本進(jìn)行算法處理,處理結(jié)果如圖8所示。
對(duì)實(shí)例樣本進(jìn)行毛刺去除處理,對(duì)其處理結(jié)果進(jìn)行驗(yàn)證:掃描處理結(jié)果圖中的所有斷點(diǎn)、分叉點(diǎn)(節(jié)點(diǎn))、端點(diǎn),如果處理結(jié)果圖中每一條骨架主干只包含2 個(gè)端點(diǎn),沒有斷點(diǎn)、分叉點(diǎn)(節(jié)點(diǎn)),則處理結(jié)果正確,否則處理的結(jié)果錯(cuò)誤。根據(jù)上述的驗(yàn)證方案,本文給出的實(shí)例測(cè)試結(jié)果都滿足要求。為了驗(yàn)證算法的普遍性,對(duì)樣本庫中所有毛刺圖像進(jìn)行處理和驗(yàn)證,發(fā)現(xiàn)毛刺去除算法的正確率為94%。剩余6%的毛刺圖像中包含了更加復(fù)雜的黏連情況,多條毛刺與其他骨架主干部分存在“黏連”,需要進(jìn)行節(jié)點(diǎn)掃描,并運(yùn)用八鄰域追蹤的處理,將毛刺黏連部分提取出來,再予以處理[15]。
圖8 多個(gè)樣本的處理結(jié)果Fig.8 Processing results of multiple samples
通過上面多種骨架的驗(yàn)證,不難發(fā)現(xiàn)該種算法具有合理性與普適性。為了在保證處理結(jié)果不變的前提下,提升算法的容錯(cuò)性,防止出現(xiàn)主干中的單個(gè)像素識(shí)別錯(cuò)誤當(dāng)做毛刺處理了,本文添加了骨架修復(fù)[16]部分。傳統(tǒng)的毛刺去除算法簡(jiǎn)單地將分叉點(diǎn)(節(jié)點(diǎn))以外的主干、毛刺部分同時(shí)進(jìn)行刪減閾值長(zhǎng)度,這種方案簡(jiǎn)便但具有盲目性,而本文中介紹的算法保留了骨架主干部分,具有較高的針對(duì)性,只去除骨架中的毛刺部分。
本文根據(jù)骨架結(jié)構(gòu)特征對(duì)干涉條紋骨架的主干、毛刺部分進(jìn)行提取并差分比較,通過差分比較的結(jié)果進(jìn)行骨架毛刺去除處理,提出一種識(shí)別多種特征點(diǎn)的思路,基于該思路進(jìn)行毛刺圖像分析。由于干涉條紋骨架可能存在多級(jí)毛刺且毛刺長(zhǎng)度有長(zhǎng)有短,本文基于節(jié)點(diǎn)分類的多個(gè)毛刺、骨架差分算法處理,相較于傳統(tǒng)的閾值法去除毛刺更具有合理性。本文為預(yù)防處理不完整的情況設(shè)定了迭代循環(huán)去除毛刺,為預(yù)防處理過度的情況設(shè)定了主干修補(bǔ)模塊,相較于傳統(tǒng)固定模板的處理方案更加具有靈活應(yīng)變能力與容錯(cuò)能力。不足之處在于骨架特征點(diǎn)的提取是否能夠應(yīng)對(duì)更為復(fù)雜的干涉條紋骨架毛刺樣本,這個(gè)有待驗(yàn)證與提升。其次在于如果存在毛刺部分、主干部分長(zhǎng)度相同但是形態(tài)不同的部分需要如何處理,這也有待新的算法提出。但是總體來說,本文算法能夠處理大多數(shù)干涉條紋骨架毛刺圖片,是一種行之有效的處理算法。