基於筆畫描述的文字識別OCR系統 技術說明

2021-08-30 23:55:14 字數 3276 閱讀 3266

1. 已排除的方法

以下方法經過我們編寫程式**來實踐驗證了其不可行性。

1.1 遊程統計法

思路:統計出點陣中的任意一點向六個角度0°、30°、60°、90°、120°、150°所能遍歷的點數。如圖2,最上一點往六個方向的最大值是 13,方向為上下方向(90°);又如,最左一點往六個方向的最大值是30,方向為左右方向(0°)。通過統計周圍的點,可以輕易得到橫豎捌捺點。

[img][/img] 

圖1 「南」字的遊程統計

缺點:文字在有雜點或掃瞄不清楚時,識別率很低或無法識別。例如:圖2的「操」字就無法用遊程統計法區分出橫豎捌撇。

[img][/img]

圖21.2 瘦邊法

思路:對文字的筆畫進行腐蝕、細線化處理,從而得到文字的骨架。

圖3 左圖是瘦邊法的理想效果,右圖是黑體、粗體等瘦邊後的效果

缺點:由於黑體、粗體的筆畫較粗,在進行腐蝕、細線化處理後,往往造成筆畫丟失或產生多餘筆畫。如圖4,由於「操」字有連筆,在使用瘦邊法細化後產生了多餘筆畫,會造成誤識別。

圖41.3 x、y方向歸一法

思路:對文字的筆畫按x、y方向求中點進行簡化筆畫。

缺點:同上。

此外,還有漢字特徵法、匹配法、字根特徵、粗外圍特徵法、筆畫密度法等演算法,但經我們編寫**來實踐證明其效果不理想,所以在此不一一介紹。

2. 我們現在採用的識別演算法----雙識別引擎

我們採用雙識別引擎,即:輪廓筆畫描述、邊角特徵資料庫。其中筆畫描述是主要的識別演算法,邊角特徵資料庫是輔助的識別演算法。

2.1 輪廓筆畫描述

輪廓筆畫描述為主要的識別方法,其關鍵是找出漢字點陣的輪廓,並對筆畫的特性、關鍵性確定取捨。通過上面對傳統ocr使用方法的分析,我公司花了近2年的時間調研、程式設計測試,用實踐來證明了:只有通過分析輪廓,才能更準確地得到橫豎捌捺點。遊程統計法、瘦邊法、漢字特徵法、匹配法、字根特徵、歸一法等演算法都無法成功地描述出筆畫。

原因一:只有基於「筆畫描述」才能識別手寫體文字,任何邊角特徵、匹配法、遊程統計法等都無法歸納出手寫體文字的特徵,只能歸納印刷體。所以,「筆畫描述」是手寫體識別的唯一出路。

原因二:經過我們編寫**來實踐證明了瘦邊法、歸一法等簡化筆畫的識別方法是低效的、誤差大的演算法,這些演算法容易丟失筆畫或者產生多餘的筆畫。只有使用 「輪廓」才能體現出手寫體文字的原貌,「輪廓」能夠原汁原味地體現手寫體文字的字形,而且能夠實現二維的漢字點陣轉化為二維向量,實現漢字的高效識別。

通過輪廓來描述筆畫,使用許多無關大局的「短邊」被「長邊」歸納吞併,「曲線」被描述為「兩段線段」,「區域性凹凸」視周圍環境也被歸納合併……這樣,乙個複雜的文字就被能用「盡可能少」的筆畫描述出來。關鍵技術如下:

2.1.1 描述輪廓,使用「逆(順)時針搜尋」演算法描述出漢字的輪廓。見圖5中的左圖。

假設:漢字是width╳height的點陣,任意一點都有左上、上、右上、右、右下、下、左下、左這8個方向的鄰點。

首先,x: 0→width-1, y: 0→height-1 搜尋出乙個黑點,該點設為p1;從點p1逆(順)時針搜尋出下一輪廓點p2,再從點p2逆(順)時針搜尋出下一輪廓點pn……

2.1.2 使用「切線最陡」演算法區分出相鄰的兩個筆畫。描述輪廓之後,筆畫描述的關鍵在於決定從何處開始屬於下一段筆畫。經理論證明,使用「切線最陡」演算法可以算出任意一點屬於哪一筆畫。見圖5中的右圖。

假設:從第一步得到漢字的輪廓點的陣列p1、p2……pn,並且由於二維漢字點陣至少可以得到x、y座標最大最小極值點(且至少存在4個符合這樣條件的點maxmin1、maxmin2、maxmin3、maxmin4等);

首先,遍歷任意2個極值點(例如:maxmin1和maxmin2)之間的輪廓點,如果某一點px的切線與maxmin1、maxmin2所在的直線的夾角最大,且大於一定的角度angle(如30°),則該點能把maxmin1、maxmin2「至少」分為兩段筆畫。

接著,遍歷maxmin1和px之間的輪廓點,同上步的原理判斷是否再分為兩段筆畫;遍歷px和maxmin2之間的輪廓點,同上步的原理判斷是否再分為兩段筆畫。

重複以上的步驟,就可以實現漢字輪廓向量化。

2.1.3 無關大局的「短邊」被歸納、吞併、省略,一般取矩形的1/8或1/10為參考值,小於該參考值的邊就考慮吞併、省略。

2.1.4 由於描述曲線(撇、捺等)比較複雜,比較兩條曲線的相對位置關係更複雜。因此,把曲線描述為兩條或多條線段,轉換為計算機易於操作的物件來處理。

2.1.5 宋體字的橫或豎等筆畫起始端常有乙個三角形的凸出點,通過強制記憶的方法,把它們省略。

這樣,所有印刷體、手寫體都能用簡單的筆畫描述出來。

圖5 左圖書是「林」的輪廓,右圖是筆畫描述的效果

優點:識別速度快,不需要搜尋資料庫,直接由筆畫得到識別結果。如果筆畫足夠清晰,能輕易地識別不同人書寫的手寫體,手寫體文字識別率達到了80%以上。這正是傳統ocr無法比擬的,因為傳統ocr不是基於筆畫描述的,不能識別或很難識別手寫體。

缺點:如果筆畫模糊不清,很難用筆畫來描述,如下圖。

圖6 筆畫描述對這樣模糊不清的文字「矗」就無能為力

解決方法:不要因為某方面的缺陷,而放棄一種不錯的演算法。使用下面介紹的第二種識別引擎,取長補短。

2.2 邊角特徵資料庫:改進型四邊輪廓特徵

2.2.1 傳統ocr的識別演算法----四邊輪廓特徵法

思路:每一漢字用32╳32點陣表示,分別從上下左右四個方向掃瞄漢字點陣,得到四個數值p1、p2、p3、p4,把這四個數值存入資料庫。通過大量的學習、記憶,得到乙個所有漢字的四邊特徵資料庫。用該方法識別漢字時,系統會從資料庫中檢索出乙個最相似的漢字,得到識別結果。經我們編寫程式、測試發現,用該方法對印刷體文字進行識別,識別率可達60%以上。

圖1 「木」字的上邊特徵

評價:中等

2.2.2 改進型四邊輪廓特徵

傳統ocr的四邊輪廓特徵法,識別率不高,如:「國」、「囚」、「四」、「因」等字,因為它們的四邊特徵值是相同的,使用此方法無法區分、無法識別。因此,我們使用提出了新的構思,使用新的演算法:在漢字內部再次切割(按1/4切割),切割後再取四邊特徵q1、q2、q3、q4,這樣,乙個文字就的特徵描述就是p1、p2、p3、p4、q1、q2、q3、q4。通過大量的學習、記憶,得到乙個所有漢字的內外四邊特徵資料庫。識別漢字時,從資料庫中檢索出乙個最相似的漢字,得到識別結果。經過我們這樣的改進,印刷體文字識別率達到了80%以上。

圖4 「囚」字按1/4切割後得到右邊的圖形

評價:良

通過以上同時使用兩種識別引擎,揚長避短,印刷體文字的識別率提高到99%以上,手寫體文字的識別率提高到90%以上。其中最顯著的就是:成功解決了手寫體識別的關鍵問題。傳統ocr識別侷限於某種識別方法,無法同時解決模糊不清的印刷體、變形較多的手寫體,而我們提出的兩種識別引擎,將能輕易地解決這種問題,並能在識別率、識別速度上有質的提高,可擴充套件性較強。

基於python的OCR中文字元識別

將翻譯成文字一般被稱為光學文字識別 optical character recognition,ocr 可以實現ocr 的底層庫並不多,目前很多庫都是使用共同的幾個底層ocr 庫,或者是在上面進行定製。tesseract 是乙個ocr 庫,目前由google 贊助 google 也是一家以ocr 和...

自然場景文字識別 基於筆畫寬度變換的文字檢測

近期在學習自然場景 natural scenes 的文字識別 text recognition 問題,這一問題也是時下乙個很熱門的亟待解決的問題。在閱讀學習了一定量的文獻資料之後,有了一定收穫,本文提到的基於 筆畫寬度變換 stroke width transform 的方法,是眼下個人看到比較認同...

基於深度學習(端到端)的OCR文字識別

開發環境 anaconda python3.6 tensorflow keras pytorch 該模型使用了 opencv 模組。依賴包版本需求 你可以使用 pip install 包名 conda install 包名 安裝依賴 easydict 1.7tensorflow gpu 1.3.0 ...