崔 晨 任明武
(南京理工大學(xué)計算機科學(xué)與工程學(xué)院 南京 210094)
書脊(spine)圖像,作為連接書刊封面、封底的部分,既包含書名、期號等關(guān)鍵書籍信息,又具有寬度小、便于批量處理的優(yōu)點,在圖書館書架管理、自助借還書柜管理等應(yīng)用場景下具有重要作用。為了減輕整理書柜的人力勞動、提高圖書的整理和檢索效率,實現(xiàn)自動書脊定位具有重要意義。
傳統(tǒng)的書脊定位方法主要包括基于射頻技術(shù)和基于圖像處理技術(shù)兩類?;谏漕l識別的方法需要對書脊進行芯片附著預(yù)處理,通過芯片與解讀器信號產(chǎn)生的感應(yīng)電流識別書脊信息,操作不夠簡便且成本高。因此,基于圖像的書脊定位具有更實際的應(yīng)用價值,并且受到了更多學(xué)者的關(guān)注。文獻[1~5]直接通過檢測較長直線對書脊進行定位,存在書脊圖案干擾造成的多檢問題;文獻[6~7]基于所有圖書傾斜方向相同的假設(shè),通過霍夫變換得到傾斜角,根據(jù)傾斜角度方向?qū)吘増D像進行濾波,從而去除書脊圖案輪廓,然后通過直線檢測對書脊進行定位;文獻[8]通過檢測平行線段對延伸線段檢測書脊角點進行定位;文獻[9]通過小波分析去除書脊圖案輪廓,然后進行直線檢測定位;文獻[10]通過建立狀態(tài)機模型,判斷圖像中的每個像素屬于書脊邊緣、書脊文字、文字背景還是書脊間隙。上述方法基本都依賴于梯度圖進行檢測,缺點在于對光照敏感,當(dāng)相鄰書脊顏色對比度過小、光照不足或相機過曝時容易發(fā)生漏檢。文獻[11]通過字符檢測對書脊進行定位,較好地解決了多檢、漏檢問題,但是該方法假設(shè)所有書脊傾斜角度相同,僅沿一個方向合并檢測到的字符,不適用于實際書脊多方向傾斜的書架場景。
基于上述分析,為了減小光照影響、能夠定位不同傾斜角度的書脊,本文提出一種基于字符檢測的書脊區(qū)域粗選方法,然后結(jié)合支持向量機(SVM)算法[12],以方向梯度直方圖(HOG)[13]為特征,精選正確的書脊區(qū)域,分割出書脊圖像。
本文首先使用基于序貫分割(sequential algorithm)的方法檢測單排書脊圖像上的字符區(qū)域,然后在檢出的字符中找到最可能同屬于一本書的字符集合,下文將稱同屬于一本書的字符為相似字符,然后根據(jù)相似字符集合計算書脊的候選區(qū)域。
目前的文本檢測算法主要分為基于連通區(qū)域的文本檢測和基于深度學(xué)習(xí)的文本檢測兩類?;谶B通區(qū)域的方法主要包括筆劃寬度變換算法(SWT)[14]和最大穩(wěn)定極值區(qū)域算法(MSER)[15],使用這兩種方法檢測漢字中的非獨體字時,需要進一步進行字內(nèi)合并,在書架場景中,相鄰書脊的字符由于距離過短可能對字內(nèi)合并造成干擾,合并方法的穩(wěn)定性將難以保證。基于深度學(xué)習(xí)的方法使網(wǎng)絡(luò)模型自動學(xué)習(xí)書脊圖像特征,具有更好的檢測效果,但是需要提供具有代表性的、足夠數(shù)量的訓(xùn)練樣本,而書脊常常具有各式各樣富有設(shè)計感的字體,使用基于深度學(xué)習(xí)的方法也將難以保證檢測的穩(wěn)定性。
基于上述分析,本文采用基于序貫分割的文本檢測方法,該方法能夠能夠保證字符不漏檢,同時較好地實現(xiàn)字內(nèi)合并,算法描述如下:
算法1基于序貫分割的文本檢測
輸入:灰度圖像及圖像大小
輸出:字符外接矩形數(shù)組
1:function SeqGetChar(Image,width,height)
2:thres[n]←{t1,t2,…,tn} △二值化閾值序列
3:foreach t in thres do
4: binImage← Binarize(Image,width,height,t)
5: mark[width*height]←{0}
6:foreach pixel in binImage do
7: if mark[pixel]==0 then
8: push RegionGrowing(binImage,width,height,mark,pixel)into Rects
9: end if
10:end
11:end
12:RemoveNonCharRects(Rects)
13:return Rects
14:end function
15:
16:function RegionGrowing(binImage,width,height,mark,pixel)
17:color← binImage[pixel]
18:UpdateRect(pixel)
19:push pixel into S
20:while S is not empty do
21:pop a pixel p from S
22: mark[np]=1
23:UpdateRect(pixel)
24: foreach pixel np in Neighborhood(p)
25: if color==binImage[np]then
26: push np into S
27: end if
28:end
29:end
30:return S
31:end function
其中,本文將輸入圖像統(tǒng)一按比例縮放使其高度為500,從而在保證檢測率的同時提高算法速度;本文選擇的thres序列是以20為公差的、以20和240為首項和末項的等差數(shù)列;Binarize函數(shù)實現(xiàn)灰度圖二值化,灰度值小于閾值的像素置為0,反之置為255;mark數(shù)組用于記錄圖中的每個像素是否已被歸為某一連通域;RegionGrowing函數(shù)通過區(qū)域增長算法合并二值圖中灰度相同的連通域,同時返回連通域的外接矩形的四邊坐標(biāo)(四邊坐標(biāo)指上下邊的y坐標(biāo)和左右邊的x坐標(biāo),在每個像素新加入連通域時通過調(diào)用UpdateRect函數(shù)得到),區(qū)域增長算法中的Neighborhood取像素的八鄰域;RemoveNonCharRects根據(jù)外接矩形的邊長、長邊與短邊的比值、是否被其他矩形包圍來去除不是字符的連通域。
序貫分割的方法和MSER相似,區(qū)別在于MS-ER更精確,只保留最穩(wěn)定的字符邊緣,而本文對字符檢測的精確性要求較低,允許多檢、誤檢(后期通過SVM分類器篩選去除),只要保證沒有漏檢的區(qū)域即可,因此本文保存了每一個閾值下的所有候選字符輪廓,如果存在嵌套則留下最外層的輪廓。改善字內(nèi)合并的原理在于字符內(nèi)部由于光照會產(chǎn)生一定的倒影,所以在閾值改變的過程中,左右結(jié)構(gòu)或上下結(jié)構(gòu)的字會逐漸連接為一體,如圖1所示。如果應(yīng)用場景的光照影響沒有這么明顯,則可以通過閉運算對臨近的字內(nèi)結(jié)構(gòu)進行合并,然后再進行檢測。圖2為本文檢測結(jié)果與SWT和MSER算法的對比圖,可以看出字內(nèi)合并取得了較好效果。
圖1 閾值為180和240時的二值圖像
圖2 從左到右依次為本文算法、SWT、MSER算法檢測結(jié)果
根據(jù)先驗知識,本文將符合以下條件的兩個字符判斷為相似字符:
1)相似字符的外接矩形寬度之比在1/2~2倍之間;
2)基于圖書豎直擺放或偏離豎直方向的傾斜角不超過45°的假設(shè),相似字符的外接矩形在寬度方向存在重疊、在高度方向不存在重疊;
3)相似字符中心點連線距離不超過字符寬度的3倍。
在符合上述條件的前提下,根據(jù)字符寬度相似度和字符外接矩形寬度方向的重疊程度對相似字符對的相似程度進行定量評估,具體計算方法如下:
由于字符寬度的相似程度在相似字符評估中具有重要作用,所以本文優(yōu)先對寬度相近的字符判斷相似度,即在進行相似字符配對之前,首先把所有字符外接矩形按照寬度從大到小排序,然后對排序后的每個字符計算其相應(yīng)的配對信息,具體算法如下:
算法2相似字符配對算法
輸入:字符外接矩形數(shù)組
輸出:相似字符對數(shù)組
1:function MakePair(Rects)
2:set all SimilarRectPairs.smallerId-1
3:set all SimilarRectPairs.biggerId-1
4:set all SimilarRectPairs.score 0
5:sort Rects by width from big to small
6:for i← 0 to n-1 do
7: for j← i+1 to n-1 do
8:if IsSimilar(Rects[i],Rects[j])==true then
9:SimilarRectPairs[i].smallerId=j
10: SimilarRectPairs[j].biggerId=i
11: SimilarRectPairs[i].score=ComputeScore(Rects[i],Rects[j])
12: break
13: end if
14:end
15:end
16:return SimilarRectPairs
17:end function
算法記錄了每個字符的3項配對信息:比自身寬度更大的相似字符、比自身寬度更小的相似字符、與比自身寬度更小的相似字符的相似度得分,若沒有找到與自身相似的字符則得分為0。IsSimilar函數(shù)基于上文三條判據(jù)實現(xiàn),ComputeScore根據(jù)式(3)實現(xiàn)。上述信息用于通過相似字符對獲得相似字符集合,然后根據(jù)集合中每個字符的中心點進行最小二乘直線擬合,結(jié)合集合內(nèi)的字符最大寬度得到候選書脊區(qū)域,具體算法如下:
算法3基于相似字符配對的候選書脊區(qū)域定位
輸入:相似字符對數(shù)組,字符外接矩形數(shù)組
輸出:書脊候選區(qū)域數(shù)組
1:function MakeCandidateSpines (SimilarRectPairs,Rects)
2:while SimilarRectPairs is not empty do
3:set SimilarRectSet empty
4: maxScoreId ← FindMaxScoreId(SimilarRectPairs)
5: push Rects[maxScoreId]into SimilarRectSet
6: FindSimilarRects(SimilarRectSet,SimilarRectPairs,maxScoreId,Rects)
7: oneSpine← ComputeOneSpine(SimilarRectSet)
8: DeleteCharRectsOnThisSpine (SimilarRectPairs,SimilarRectSet)
9:push oneSpine into CandidateSpines
10:end
11:return CandidateSpines
12:end function
13:
14:function FindSimilarRects(SimilarRectSet,Similar-RectPairs,maxScoreId,Rects)
15:smallerID←SimilarRectPairs[maxScoreId].smallerId
16:biggerID ← SimilarRectPairs[maxScoreId].biggerId
17:if smallerID!=-1 then
18: push Rects[smallerID]into SimilarRectSet
19: FindSimilarRects(SimilarRectSet, SimilarRect-Pairs,smallerID,Rects)
20:end if
21:if biggerID!=-1 then
22: push Rects[biggerID]into SimilarRectSet
23: FindSimilarRects(SimilarRectSet, SimilarRect-Pairs,biggerID,Rects)
24:end if
25:end function
其中,F(xiàn)indMaxScoreId函數(shù)返回相似字符對數(shù)組中分數(shù)最高元素索引;FindSimilarRects函數(shù)通過遞歸,把所有直接或者間接相似的字符加入相似字符集合,即A與B互為相似字符、B與C互為相似字符,則ABC都加入相似字符集合;ComputeOneSpine函數(shù)通過相似字符集合中每個字符的中心點坐標(biāo)進行最小二乘直線擬合,把擬合直線分別向左、向右平移,使得平移后的直線與擬合直線的距離為集合中的最大字符寬度,得到兩個直線方程作為書脊區(qū)域的左邊界和右邊界,由于本文假設(shè)輸入為單排書脊圖像,所以書脊區(qū)域的上下邊界即為輸入圖像的上下邊界;DeleteCharRectsOnThisSpine函數(shù)將所有中心坐標(biāo)位于書脊區(qū)域內(nèi)的字符從相似字符對數(shù)組中刪除,從而保證找到的書脊區(qū)域不重復(fù);返回的CandidateSpines是一系列書脊區(qū)域的左右邊界的直線方程,左右邊界直線平行,直線方向與豎直方向的夾角即為書脊的傾斜角,本文首先切出書脊區(qū)域的外接矩形,然后根據(jù)傾斜角旋轉(zhuǎn),得到最終的候選書脊圖像,算法效果如圖3所示。
由于本文對字符檢測部分的準(zhǔn)確性要求較低,候選書脊中可能出現(xiàn)書脊倒影區(qū)域、書柜干擾區(qū)域、封面干擾區(qū)域等非書脊圖像,如圖4所示。所以本節(jié)采用SVM模型基于圖像的HOG特征篩選真正的書脊區(qū)域。
圖3 基于相似字符集合擬合得到的書脊區(qū)域直線表示,以及矯正分割得到的候選書脊圖像
圖4 非書脊圖像示例
支持向量機是一種二分類模型,定義為在特征空間上使兩類樣本間隔最大的線性分類器,具有泛化能力強、適合小樣本訓(xùn)練集的優(yōu)點。HOG特征是一種在圖像處理中用于進行物體檢測的特征描述子,具有旋轉(zhuǎn)不變性、光照不變性的優(yōu)點。本文使用候選書脊圖像的HOG特征作為支持向量機的輸入特征,以90幅書脊圖像為訓(xùn)練集正樣本、60幅非書脊圖像為負樣本訓(xùn)練SVM分類器,對書脊圖像和非書脊圖像進行分類。圖5為具體訓(xùn)練過程。
圖5 HOG+SVM訓(xùn)練書脊圖像分類器流程圖
本文實驗環(huán)境為64位Windows 10操作系統(tǒng),i7CPU(2.40GHz),8G內(nèi)存,使用IDE為VS2013,算法使用C++結(jié)合libsvm庫實現(xiàn)。采集實驗圖像50幅,每幅圖像包含1~8本書不等,共包含201個書脊圖像,考慮了不同光照、不同擺放角度、低顏色對比度的相鄰書脊、部分遮擋、拍攝不全等多種情況,如圖6~9所示。實驗平均處理一幅圖像的時間為2.2s,以分割出的書脊圖像內(nèi)容能夠被百度OCR接口識別、不漏檢多檢、不重復(fù)為標(biāo)準(zhǔn),書脊定位成功率為98%,在書脊花紋復(fù)雜且前后遮擋的場景下出現(xiàn)了分割失敗的情況,我們計劃結(jié)合圖像局部二值化和直線檢測對此進行改進。
圖6 多種傾斜角度擺放測試結(jié)果
圖7 與圖3相同擺放姿態(tài)、不同光照拍攝測試結(jié)果
圖8 反光干擾、封底干擾、拍攝不全干擾測試結(jié)果
圖9 書間遮擋情況測試結(jié)果
本文提出了一種基于文本檢測的書脊定位方法,避免了傳統(tǒng)的基于直線檢測的方法易受光照影響的問題,提出了合并相似字符的算法,能夠定位不同傾斜角度的書脊,在實際項目采集的數(shù)據(jù)集上表現(xiàn)良好。本文數(shù)據(jù)集小,相機與書架相對位姿固定,書架背景簡單,所以雖然取得了較好的定位效果,但是在通用性方面仍需提高,首先,本文假設(shè)書脊偏離豎直方向的角度不超過45°,如果超過45°可將圖像旋轉(zhuǎn)90°再檢測,但是這種方法的準(zhǔn)確性尚未得到驗證,此外,算法中的一些參數(shù)是根據(jù)書脊區(qū)域占整幅圖像的比例確定的,所以在相機距離書架遠近改變時,參數(shù)將不再適用,影響定位成功率,后期我們將嘗試自適應(yīng)參數(shù)算法,或者對輸入圖像進行縮放、分割等處理,使其與既有參數(shù)相適應(yīng)。