汪依帆,汪存燕
(1.上海市學(xué)生事務(wù)中心 信息技術(shù)部,上海 200235; 2.上海應(yīng)用技術(shù)學(xué)院 計(jì)算機(jī)學(xué)院,上海 201418)
對于很多紡織品來說,常需要檢測其中纖維的長度、紋理、截面面積、卷曲程度等信息來判斷紡織品的質(zhì)量.長期以來,對于纖維的識別主要采用手感目測法、燃燒法、顯微鏡觀察法、化學(xué)溶解法、藥品著色法等.此類方法都是人工參與的,所以人為因素較大,準(zhǔn)確率不高.傳統(tǒng)的方法已不能滿足現(xiàn)代纖維檢測和識別的要求.隨著計(jì)算機(jī)圖像學(xué)理論和技術(shù)的不斷發(fā)展,數(shù)字圖像分析系統(tǒng)已逐漸滲透入紡織行業(yè),用計(jì)算機(jī)代替?zhèn)鹘y(tǒng)的手工勞動是必然趨勢.本文作者提出了一種在復(fù)雜背景下的纖維提取、識別、匹配的方法.
本實(shí)驗(yàn)的樣本圖片為在顯微鏡下拍攝的纖維圖片,纖維線條錯綜復(fù)雜,粗細(xì)不一.在圖像采集過程中,由于多種因素的影響使得圖像與原始場景之間產(chǎn)生某些差異,如光照不一,拍攝時的抖動等都會造成圖像模糊,細(xì)節(jié)部分不明顯,并引入較多的噪聲.在進(jìn)行識別前,先進(jìn)行圖像的歸一化,并使用中通濾波法進(jìn)行了圖像平滑.
圖像二值化處理就是將灰度圖像或彩色圖像轉(zhuǎn)化為二值圖像(黑、白)的過程.對于纖維圖像進(jìn)行二值化就是將圖像分為前景和背景,此方法多利用圖像的直方圖進(jìn)行二值化.可以利用雙峰法、最大熵閾值分割法、最大類間方差法(OTSU算法)[1].此類方法的最大缺點(diǎn)就是很難找出一個最佳的閾值點(diǎn),對于多張照片采用同一種方法,效果好壞不一,同時計(jì)算量也比較大.
數(shù)字形態(tài)學(xué)是一種非線性濾波方法,采用形態(tài)和差運(yùn)算,即膨脹和腐蝕.灰度圖像的腐蝕和膨脹過程可直接從圖像和結(jié)構(gòu)元素的灰度級函數(shù)計(jì)算而得.與二值形態(tài)學(xué)相同,灰值形態(tài)學(xué)也由腐蝕和膨脹得到灰值形態(tài)學(xué)的二級運(yùn)行——開閉運(yùn)算.利用TOP-HAT變換,圖像的灰度級較低,圖像較暗,通過加大圖像的亮度,再采用閾值變換,將纖維的圖像提取出后,細(xì)化后最終得到識別圖像[2].
鏈碼是二值圖像常用的表示方法.用整數(shù)描述邊緣相鄰像素間的轉(zhuǎn)動角度得到物體邊界的方向鏈碼.根據(jù)鏈碼值和像素間距離進(jìn)行序列點(diǎn)插值、平滑、擬合后得到鏈碼的曲線描述.該算法對像素間的位置關(guān)系用確定的碼值來表示,避免了通常的二維矩陣結(jié)構(gòu),以較少的數(shù)據(jù)量存儲圖形中的位置以及形狀信息.從而減少了計(jì)算量、降低了信息冗余、節(jié)約了存儲空間.
邊緣檢測是標(biāo)示出數(shù)字圖像中亮度等屬性變化明顯的點(diǎn),以勾勒出圖像的邊緣.采用求方差的方法進(jìn)行邊緣檢測[3].具體方法是:
(1) 利用一個3×3的滑動窗口在圖像上滑動,求出中心點(diǎn)和周圍8個點(diǎn)的方差,作為矩陣中對應(yīng)位置的值,構(gòu)造一個新的矩陣.
(2) 首先從左到右橫向掃描,找出掃描過程中的相對峰值點(diǎn)(即大于它左右兩個點(diǎn)的方差值),如果此點(diǎn)與它左邊的谷值點(diǎn)的距離大于設(shè)定的閾值,則將此點(diǎn)置為邊界點(diǎn),置為1(白色),如果小于閾值,記錄下對應(yīng)位置的與左邊谷值點(diǎn)的距離,放入backup矩陣中,以備以后第二次掃描.用同樣的方法進(jìn)行縱向掃描.
(3) 用相同的方法在斜線方向進(jìn)行掃描,如果某點(diǎn)與它斜線方向的谷值點(diǎn)的距離大于第二步記錄下的backup值,則修改此點(diǎn)的backup值.
(4) 對backup矩陣進(jìn)行掃描,如果它周圍的8個點(diǎn)中有白點(diǎn)的話,將此點(diǎn)置為白色,同時修改其backup值為0.
(5) 去除孤立的黑點(diǎn).
細(xì)化是纖維圖像預(yù)處理中的重要環(huán)節(jié),主要是去除不必要的邊緣信息,便于提取細(xì)節(jié)特征,提高纖維圖像的處理速度.一種好的細(xì)化算法應(yīng)該滿足下列條件:收斂性、連通性、拓?fù)湫浴⒈3中浴⒓?xì)化性、中軸性和快速性.利用8鄰域的查表細(xì)化算法對圖像進(jìn)行細(xì)化.
在細(xì)化前圖像已經(jīng)進(jìn)行了二值化,即將纖維邊界與圖像中的其他部分分離,白色代表纖維邊緣,黑色代表其余部分,將纖維圖像從灰度圖像轉(zhuǎn)換為二值圖像(0代表黑色,1代表白色)根據(jù)以下規(guī)則細(xì)化:內(nèi)部點(diǎn)不能刪除,即如果一個白點(diǎn)的上、下、左、右都是白點(diǎn)的話,此點(diǎn)不能刪.孤立點(diǎn)不能刪除.直線斷點(diǎn)不能刪除.如果一個點(diǎn)是邊界點(diǎn),去掉此點(diǎn)后,如果連通分量不增加,則此點(diǎn)可以刪除.
根據(jù)上述判據(jù),事先做出一張表,從0到255共有256個元素,每個元素要么是0,要么是1.根據(jù)某點(diǎn)(要處理的是白色點(diǎn))的8個鄰域點(diǎn)計(jì)算出的索引值查表,若查得表中的元素是1,則表示該點(diǎn)可刪,否則保留.
(1) 按順序計(jì)算用于查表的索引值:S=P1×20+P2×21+P3×22+P4×23+P6×25+P7×26+P8×27+P9×28.
其中P1~P8分別取值為0或1,則有256種索引與數(shù)值0到255一一對應(yīng).
(2) 根據(jù)上述判據(jù)制作一張查找表,實(shí)際上是一個1×256的一維矩陣[4],元素值為0表示該組合的中心點(diǎn)應(yīng)該保留,1表示應(yīng)該刪除,數(shù)組定義如下:
looktable[256]=(0,1,1,0,1,1,0,0,1,0,0,0,1,1,0,0,1,1,0,0,0,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,0,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,0,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,1).
(3) 從上到下,從左到右,對二值圖像進(jìn)行掃描,對每一個白點(diǎn)做如下處理:先判斷該白點(diǎn)的上下鄰居,如果都是白點(diǎn),則該點(diǎn)不做處理,另外,如果某個白點(diǎn)被刪除了,那么跳過它的下鄰居,處理下一個點(diǎn),否則根據(jù)8鄰域編碼計(jì)算索引值,此索引值就是數(shù)組元素的下標(biāo),找到對應(yīng)下標(biāo)所對應(yīng)的元素,查看是否刪除,如果該白點(diǎn)被刪除了,那么跳過它的右鄰域,處理下一個點(diǎn).
(4) 從左到右,從上到下,對二值圖像進(jìn)行第二次掃描,對每一個白點(diǎn)做類似處理:先判斷該白點(diǎn)的左右鄰居,如果都是白點(diǎn),則該點(diǎn)不做處理,另外,如果某個白點(diǎn)被刪除了,那么跳過它的右鄰居,處理下一個點(diǎn);否則計(jì)算8鄰域編碼索引值,看是否刪除,如果該白點(diǎn)被刪除了,那么跳過它的下鄰居,處理下一個點(diǎn).
(5) 如果本次循環(huán)有白點(diǎn)被刪除,則跳到(3),否則終止循環(huán),細(xì)化結(jié)束.
纖維原圖,二值化并進(jìn)行邊緣檢測的纖維圖,和細(xì)化后的圖像如圖1所示.

圖1 原圖、二值化并進(jìn)行邊緣檢測的圖和細(xì)化后圖的對比
3.3.1 去毛刺,刪除交叉點(diǎn)
在處理之前,先要刪除孤立的白點(diǎn).首先尋找出一條纖維的端點(diǎn),判斷的條件是在一個3×3的小矩陣中,如果有且只有2個點(diǎn)是白點(diǎn),且其中有一個白點(diǎn)是在矩陣的中心位置,則這個中心位置的白點(diǎn)就是一條纖維的起點(diǎn).從纖維的起點(diǎn)出發(fā),依次搜索纖維的每一個點(diǎn)所在的位置,計(jì)算出纖維的長度,如果小于某一閾值(作者提出的閾值是25),則判定此條纖維是毛刺,刪除這條纖維[5].
刪除交叉點(diǎn)的方法是:依次掃描圖像的每個像素,如果是白點(diǎn),檢測它周圍8個點(diǎn),如果大于等于3個白點(diǎn),則將此點(diǎn)的上、下、左、右4個點(diǎn)全部置為黑色.部分細(xì)節(jié)的效果如圖2所示.

圖2 纖維圖像刪除交叉點(diǎn)
3.3.2 刪除拐點(diǎn)
刪除拐點(diǎn)是為以后的纖維識別做準(zhǔn)備的.由于先前細(xì)化后,不會在一個3×3的矩陣出現(xiàn)4個白點(diǎn)的情況.所以在查找一條連通纖維的過程中,可以先找到纖維的一個端點(diǎn),記錄下該點(diǎn)的位置,并將其置為黑色;找出與其連通的點(diǎn),作為纖維的新端點(diǎn),記錄下位置,置為黑色,依次類推,直到纖維的另外一個端點(diǎn).通過余弦定律來計(jì)算曲率.具體的做法是在纖維上選擇4點(diǎn),其中2點(diǎn)是兩個端點(diǎn),設(shè)為A和B,由于先前的去毛刺已經(jīng)去掉了一些很短的纖維,所以另外兩點(diǎn)取的是從端點(diǎn)出發(fā)的第8個點(diǎn),設(shè)為C和D,計(jì)算直線AC和直線BD的角度,如果小于某個閾值(設(shè)為150°),則將C、D兩點(diǎn)置為黑色,C、D再各向中間移動一個點(diǎn),繼續(xù)計(jì)算角度.部分細(xì)節(jié)的效果如圖3所示.

圖3 纖維圖像刪除拐點(diǎn)
3.3.3 補(bǔ)斷并標(biāo)記纖維
先前的刪除交叉點(diǎn)和刪除拐點(diǎn)都是為后面纖維識別做準(zhǔn)備的,原先連接起來的纖維已經(jīng)不再連通了.補(bǔ)斷就是要把屬于同一條纖維邊緣的線段連起來.綜合考慮了各線段之間的距離和角度,選擇可能性最大的線段進(jìn)行配對,并用線性插值的方法進(jìn)行補(bǔ)點(diǎn)[6].補(bǔ)斷后需重新整理纖維條數(shù),并用不同的顏色標(biāo)記不同的纖維,效果見圖4.

圖4 纖維識別的結(jié)果
本文作者提出了一種在復(fù)雜背景下的纖維識別的方法,其考慮了多種因素的影響,力爭把不利因素通過各種方法加以解決.下一步的工作是要提高纖維識別的正確性,并按課題的要求計(jì)算出每條纖維的平均寬度.同時,對于拍攝效果不佳的圖像,如何加以預(yù)處理,使得圖像更容易被處理,也是接下去需要研究的方向.
參考文獻(xiàn):
[1] 陳濱,田啟川.改進(jìn)的快速Otsu自適應(yīng)分割算法及其應(yīng)用[J].計(jì)算機(jī)應(yīng)用研究,2012,29(4):1572-1574.
[2] 馬健,曾文華,陳維國.灰值形態(tài)學(xué)在動物纖維圖像處理中的應(yīng)用[J].紡織學(xué)報(bào),2004,25(5):42-45.
[3] 周德龍,潘泉,張洪才.圖像模糊邊緣檢測的改進(jìn)算法[J].中國圖像圖形學(xué)報(bào),2001,6(4):353-358.
[4] 王榮武.基于圖像處理技術(shù)的苧麻和棉纖維縱向全自動識別系統(tǒng)[D].上海:東華大學(xué),2007.
[5] 王崇文,王偉,王廷才等.指紋圖像后處理[J].計(jì)算機(jī)工程與設(shè)計(jì),2002,23(9):35-38.
[6] 朱長武,戴上平.基于指紋圖像斷裂紋線的修復(fù)方法[J].電子測量技術(shù),2007,30(4):97-99.