崔 晨 任明武
(南京理工大學計算機科學與工程學院 南京 210094)
書脊(spine)圖像,作為連接書刊封面、封底的部分,既包含書名、期號等關鍵書籍信息,又具有寬度小、便于批量處理的優點,在圖書館書架管理、自助借還書柜管理等應用場景下具有重要作用。為了減輕整理書柜的人力勞動、提高圖書的整理和檢索效率,實現自動書脊定位具有重要意義。
傳統的書脊定位方法主要包括基于射頻技術和基于圖像處理技術兩類?;谏漕l識別的方法需要對書脊進行芯片附著預處理,通過芯片與解讀器信號產生的感應電流識別書脊信息,操作不夠簡便且成本高。因此,基于圖像的書脊定位具有更實際的應用價值,并且受到了更多學者的關注。文獻[1~5]直接通過檢測較長直線對書脊進行定位,存在書脊圖案干擾造成的多檢問題;文獻[6~7]基于所有圖書傾斜方向相同的假設,通過霍夫變換得到傾斜角,根據傾斜角度方向對邊緣圖像進行濾波,從而去除書脊圖案輪廓,然后通過直線檢測對書脊進行定位;文獻[8]通過檢測平行線段對延伸線段檢測書脊角點進行定位;文獻[9]通過小波分析去除書脊圖案輪廓,然后進行直線檢測定位;文獻[10]通過建立狀態機模型,判斷圖像中的每個像素屬于書脊邊緣、書脊文字、文字背景還是書脊間隙。上述方法基本都依賴于梯度圖進行檢測,缺點在于對光照敏感,當相鄰書脊顏色對比度過小、光照不足或相機過曝時容易發生漏檢。文獻[11]通過字符檢測對書脊進行定位,較好地解決了多檢、漏檢問題,但是該方法假設所有書脊傾斜角度相同,僅沿一個方向合并檢測到的字符,不適用于實際書脊多方向傾斜的書架場景。
基于上述分析,為了減小光照影響、能夠定位不同傾斜角度的書脊,本文提出一種基于字符檢測的書脊區域粗選方法,然后結合支持向量機(SVM)算法[12],以方向梯度直方圖(HOG)[13]為特征,精選正確的書脊區域,分割出書脊圖像。
本文首先使用基于序貫分割(sequential algorithm)的方法檢測單排書脊圖像上的字符區域,然后在檢出的字符中找到最可能同屬于一本書的字符集合,下文將稱同屬于一本書的字符為相似字符,然后根據相似字符集合計算書脊的候選區域。
目前的文本檢測算法主要分為基于連通區域的文本檢測和基于深度學習的文本檢測兩類。基于連通區域的方法主要包括筆劃寬度變換算法(SWT)[14]和最大穩定極值區域算法(MSER)[15],使用這兩種方法檢測漢字中的非獨體字時,需要進一步進行字內合并,在書架場景中,相鄰書脊的字符由于距離過短可能對字內合并造成干擾,合并方法的穩定性將難以保證?;谏疃葘W習的方法使網絡模型自動學習書脊圖像特征,具有更好的檢測效果,但是需要提供具有代表性的、足夠數量的訓練樣本,而書脊常常具有各式各樣富有設計感的字體,使用基于深度學習的方法也將難以保證檢測的穩定性。
基于上述分析,本文采用基于序貫分割的文本檢測方法,該方法能夠能夠保證字符不漏檢,同時較好地實現字內合并,算法描述如下:
算法1基于序貫分割的文本檢測
輸入:灰度圖像及圖像大小
輸出:字符外接矩形數組
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
其中,本文將輸入圖像統一按比例縮放使其高度為500,從而在保證檢測率的同時提高算法速度;本文選擇的thres序列是以20為公差的、以20和240為首項和末項的等差數列;Binarize函數實現灰度圖二值化,灰度值小于閾值的像素置為0,反之置為255;mark數組用于記錄圖中的每個像素是否已被歸為某一連通域;RegionGrowing函數通過區域增長算法合并二值圖中灰度相同的連通域,同時返回連通域的外接矩形的四邊坐標(四邊坐標指上下邊的y坐標和左右邊的x坐標,在每個像素新加入連通域時通過調用UpdateRect函數得到),區域增長算法中的Neighborhood取像素的八鄰域;RemoveNonCharRects根據外接矩形的邊長、長邊與短邊的比值、是否被其他矩形包圍來去除不是字符的連通域。
序貫分割的方法和MSER相似,區別在于MS-ER更精確,只保留最穩定的字符邊緣,而本文對字符檢測的精確性要求較低,允許多檢、誤檢(后期通過SVM分類器篩選去除),只要保證沒有漏檢的區域即可,因此本文保存了每一個閾值下的所有候選字符輪廓,如果存在嵌套則留下最外層的輪廓。改善字內合并的原理在于字符內部由于光照會產生一定的倒影,所以在閾值改變的過程中,左右結構或上下結構的字會逐漸連接為一體,如圖1所示。如果應用場景的光照影響沒有這么明顯,則可以通過閉運算對臨近的字內結構進行合并,然后再進行檢測。圖2為本文檢測結果與SWT和MSER算法的對比圖,可以看出字內合并取得了較好效果。

圖1 閾值為180和240時的二值圖像

圖2 從左到右依次為本文算法、SWT、MSER算法檢測結果

根據先驗知識,本文將符合以下條件的兩個字符判斷為相似字符:
1)相似字符的外接矩形寬度之比在1/2~2倍之間;
2)基于圖書豎直擺放或偏離豎直方向的傾斜角不超過45°的假設,相似字符的外接矩形在寬度方向存在重疊、在高度方向不存在重疊;
3)相似字符中心點連線距離不超過字符寬度的3倍。
在符合上述條件的前提下,根據字符寬度相似度和字符外接矩形寬度方向的重疊程度對相似字符對的相似程度進行定量評估,具體計算方法如下:

由于字符寬度的相似程度在相似字符評估中具有重要作用,所以本文優先對寬度相近的字符判斷相似度,即在進行相似字符配對之前,首先把所有字符外接矩形按照寬度從大到小排序,然后對排序后的每個字符計算其相應的配對信息,具體算法如下:
算法2相似字符配對算法
輸入:字符外接矩形數組
輸出:相似字符對數組
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函數基于上文三條判據實現,ComputeScore根據式(3)實現。上述信息用于通過相似字符對獲得相似字符集合,然后根據集合中每個字符的中心點進行最小二乘直線擬合,結合集合內的字符最大寬度得到候選書脊區域,具體算法如下:
算法3基于相似字符配對的候選書脊區域定位
輸入:相似字符對數組,字符外接矩形數組
輸出:書脊候選區域數組
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
其中,FindMaxScoreId函數返回相似字符對數組中分數最高元素索引;FindSimilarRects函數通過遞歸,把所有直接或者間接相似的字符加入相似字符集合,即A與B互為相似字符、B與C互為相似字符,則ABC都加入相似字符集合;ComputeOneSpine函數通過相似字符集合中每個字符的中心點坐標進行最小二乘直線擬合,把擬合直線分別向左、向右平移,使得平移后的直線與擬合直線的距離為集合中的最大字符寬度,得到兩個直線方程作為書脊區域的左邊界和右邊界,由于本文假設輸入為單排書脊圖像,所以書脊區域的上下邊界即為輸入圖像的上下邊界;DeleteCharRectsOnThisSpine函數將所有中心坐標位于書脊區域內的字符從相似字符對數組中刪除,從而保證找到的書脊區域不重復;返回的CandidateSpines是一系列書脊區域的左右邊界的直線方程,左右邊界直線平行,直線方向與豎直方向的夾角即為書脊的傾斜角,本文首先切出書脊區域的外接矩形,然后根據傾斜角旋轉,得到最終的候選書脊圖像,算法效果如圖3所示。
由于本文對字符檢測部分的準確性要求較低,候選書脊中可能出現書脊倒影區域、書柜干擾區域、封面干擾區域等非書脊圖像,如圖4所示。所以本節采用SVM模型基于圖像的HOG特征篩選真正的書脊區域。

圖3 基于相似字符集合擬合得到的書脊區域直線表示,以及矯正分割得到的候選書脊圖像

圖4 非書脊圖像示例
支持向量機是一種二分類模型,定義為在特征空間上使兩類樣本間隔最大的線性分類器,具有泛化能力強、適合小樣本訓練集的優點。HOG特征是一種在圖像處理中用于進行物體檢測的特征描述子,具有旋轉不變性、光照不變性的優點。本文使用候選書脊圖像的HOG特征作為支持向量機的輸入特征,以90幅書脊圖像為訓練集正樣本、60幅非書脊圖像為負樣本訓練SVM分類器,對書脊圖像和非書脊圖像進行分類。圖5為具體訓練過程。

圖5 HOG+SVM訓練書脊圖像分類器流程圖
本文實驗環境為64位Windows 10操作系統,i7CPU(2.40GHz),8G內存,使用IDE為VS2013,算法使用C++結合libsvm庫實現。采集實驗圖像50幅,每幅圖像包含1~8本書不等,共包含201個書脊圖像,考慮了不同光照、不同擺放角度、低顏色對比度的相鄰書脊、部分遮擋、拍攝不全等多種情況,如圖6~9所示。實驗平均處理一幅圖像的時間為2.2s,以分割出的書脊圖像內容能夠被百度OCR接口識別、不漏檢多檢、不重復為標準,書脊定位成功率為98%,在書脊花紋復雜且前后遮擋的場景下出現了分割失敗的情況,我們計劃結合圖像局部二值化和直線檢測對此進行改進。

圖6 多種傾斜角度擺放測試結果

圖7 與圖3相同擺放姿態、不同光照拍攝測試結果

圖8 反光干擾、封底干擾、拍攝不全干擾測試結果

圖9 書間遮擋情況測試結果
本文提出了一種基于文本檢測的書脊定位方法,避免了傳統的基于直線檢測的方法易受光照影響的問題,提出了合并相似字符的算法,能夠定位不同傾斜角度的書脊,在實際項目采集的數據集上表現良好。本文數據集小,相機與書架相對位姿固定,書架背景簡單,所以雖然取得了較好的定位效果,但是在通用性方面仍需提高,首先,本文假設書脊偏離豎直方向的角度不超過45°,如果超過45°可將圖像旋轉90°再檢測,但是這種方法的準確性尚未得到驗證,此外,算法中的一些參數是根據書脊區域占整幅圖像的比例確定的,所以在相機距離書架遠近改變時,參數將不再適用,影響定位成功率,后期我們將嘗試自適應參數算法,或者對輸入圖像進行縮放、分割等處理,使其與既有參數相適應。