20100520-20100523
一個針對螢幕的OCR(光學字元辨識)程式,它與印刷體和手寫輸入OCR的區別在於:螢幕OCR屬於精確識別,識別速度較快,演算法也較簡單,但它只能識別螢幕(或者無損BMP)上的文字,。
該程式的預設字型庫採用索引+Hash表組織,檔案大小1.48M(未壓縮),內含2580個字(漢字2500個+數字10個+字母52個+標點18個)、5種字型、15種字型大小、2種樣式,共計387000個字型。
經測試識別100個22號字約用時3s,100個8號字約用時0.7s,識別率一般。如果字型庫用純Hash表,那麼檔案大小將增大到32M,而識別速度最多可以提高6倍。另外,由於我還沒有搞清楚TrueType字型的產生演算法,所以暫時無法再提高識別速度。
關於印刷體OCR我大概也有一點思路。段落的分割演算法與螢幕OCR基本一致,下面僅討論單字的識別演算法。
首先將目標字的高度伸縮到標準字的大小(目標字的高度已經在段落分割中由行高得到),而目標字的寬度則按保持縱橫比伸縮。
然後由尋徑演算法遍曆目標字的筆畫,得到一個標準筆畫寬度(即粗細)的字。顯然,這一步比較困難。
最後進行模糊比對:將目標字與標準字按左上方對齊,並對目標字的每一個像素點,看以它為中心的正方形(邊長較小)中是否含有標準字的像素點,如果有則相似性+1。按此方法迴圈對所有標準字計算相似性,取相似性最高的字為識別字。
最後一步非常耗時。最佳化的方法是將標準字按使用頻率由高到低存放,在匹配過程中如果發現相似性大於某一個值,則認為找到了識別字,中止迴圈。
可以看出這並不是一個很好的演算法。如果根據筆畫向量或者字型輪廓進行匹配可能會好很多,當然難度也大得多。
最後再簡單說一說手寫輸入的識別,它與前兩種OCR相比又有不同。因為它可以在使用者手寫的過程中獲得筆畫的順序以及方向(如果使用者寫倒筆字將降低識別精度),所以從這一點上看識別起來相對更容易。但是一般來說,使用者手寫的字與標準字差別較大,前面提到的演算法將失效。