1. 程式人生 > >OCR技術淺探二: 文字定位和文字切割

OCR技術淺探二: 文字定位和文字切割

文字定位

經過前面的特徵提取,我們已經較好地提取了影象的文字特徵,下面進行文字定位。 主要過程分兩步:

1、鄰近搜尋,目的是圈出單行文字;

2、文字切割,目的是將單行文字切割為單字。

 鄰近搜尋

我們可以對提取的特徵圖進行連通區域搜尋,得到的每個連通區域視為一個漢字。 這對於大多數漢字來說是適用,但是對於一些比較簡單的漢字卻不適用,比如“小”、“旦”、“八”、“元” 這些字,由於不具有連通性,所以就被分拆開了,如圖13。 因此,我們需要通過鄰近搜尋演算法,來整合可能成字的區域,得到單行的文字區域。

圖13 直接搜尋連通區域,會把諸如“元”之類的字分拆開。

鄰近搜尋的目的是進行膨脹,以把可能成字的區域“粘合”起來.。如果不進行搜尋就膨脹,那麼膨脹是各個方向同時進行的,這樣有可能把上下行都粘合起來了。因此,我們只允許區域向單一的一個方向膨脹。我們正是要通過搜尋鄰近區域來確定膨脹方向(上、下、左、右):

鄰近搜尋* 從一個連通區域出發,可以找到該連通區域的水平外切矩形,將連通區域擴充套件到整個矩形。 當該區域與最鄰近區域的距離小於一定範圍時,考慮這個矩形的膨脹,膨脹的方向是最鄰近區域的所在方向。

既然涉及到了鄰近,那麼就需要有距離的概念。下面給出一個比較合理的距離的定義。

 距離

圖14 兩個示例區域

如上圖,通過左上角座標(x,y)和右下角座標(z,w)就可以確定一個矩形區域,這裡的座標是以左上角為原點來算的。 這個區域的中心是( (x+z) / 2, (y+w) / 2 )。對於圖中的兩個區域S和S′,可以計算它們的中心向量差

 

如果直接使用作為距離是不合理的,因為這裡的鄰近應該是按邊界來算,而不是中心點。因此,需要減去區域的長度:

 

距離定義為

 

至於方向,由的幅角進行判斷即可。

然而,按照前面的“鄰近搜尋*”方法,容易把上下兩行文字粘合起來,因此,基於我們的橫向排版假設,更好的方法是隻允許橫向膨脹:

鄰近搜尋   從一個連通區域出發,可以找到該連通區域的水平外切矩形,將連通區域擴充套件到整個矩形。 當該區域與最鄰近區域的距離小於一定範圍時,考慮這個矩形的膨脹,膨脹的方向是最鄰近區域的所在方向,當且僅當所在方向是水平的,才執行膨脹操作。

結果

有了距離之後,我們就可以計算每兩個連通區域之間的距離,然後找出最鄰近的區域。 我們將每個區域向它最鄰近的區域所在的方向擴大4分之一,這樣鄰近的區域就有可能融合為一個新的區域,從而把碎片整合。

實驗表明,鄰近搜尋的思路能夠有效地整合文字碎片,結果如圖15。

 

圖15 通過鄰近搜尋後,圈出的文字區域

文字切割

經過前面文字定位得到單行的文字區域之後,我們就可以想辦法將單行的文字切割為單個的字元了。因為第三步的模型師針對單個的字元建立的,因此這一步也是必須的。

均勻切割

基於方塊漢字的假設,事實上最簡單的切割方法是均勻切割,也就是說不加任何判斷,直接按照高度來將單行文字切割為一個個的正方形圖片。這種思路可以應對大部分的單行文字,如下圖。


當然,均勻切割的弊端也是很明顯的。 大多數漢字都是方塊漢字,但多數英語和數字都不是,因此如果出現中英文混排的時候,均勻切割就失效了,如上圖。

統計切割 

從圖15中可以看出,經過前面的操作,字與字都被很好地分離開了。 因此,另外一種比較簡單的思路是對單行的文字圖片進行垂直方向的求和,和為0的所在的列就是被切割的的列。

用這種統計的思路可以很好地解決中英文混排的單行文字圖片分割的問題,但是它也存在一定的弊端。 最明顯的就是諸如“小”、“的”等字就被切割開為兩部分了。

前後比較

一個更好的思路是結合前面兩部分結果,通過比較前後兩部分割槽域是否組成方形來確定是否切割。 具體步驟是:

1。 通過統計求和的思路,得出候選的切割線;

2。 如果該候選切割線到左右兩條候選切割線的距離之和超過寬長度的1。2倍,那麼該候選切割線確定為切割線;

3。 如果得到的區域是一個明顯的長條矩形,並且沒辦法按照上面兩個步驟切割,那個就均勻切割。

這三個步驟比較簡單,基於兩個假設:

1、數字、英文字元的底與高之比大於60%;

2、漢字的底與高之比低於1.2。經過測試,該演算法可以很好地用於前面步驟所提取的圖片文字特徵的分割。