曾 悅,馬明棟
(1.南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210003;2.南京郵電大學(xué) 地理與生物信息學(xué)院,江蘇 南京 210003)
在二十世紀(jì)三十年代末,德國科學(xué)家Tausheck提出了OCR的概念[1],并獲得了OCR專利。之后美國科學(xué)家Handel也提出了利用技術(shù)進(jìn)行文字識別[2]的想法。二十世紀(jì)六十年代,OCR技術(shù)首次被使用于生產(chǎn)實(shí)踐中,至此第一批OCR系統(tǒng)誕生,其中Farrington3010最具有代表性[3],但是運(yùn)行速度慢且只能識別簡單的字符。1996年,IBM公司的Casey和Nagy完成了中文字符識別系統(tǒng)的研發(fā),采用模板匹配法能識別1 000個(gè)印刷體漢字[4]。
中國在二十世紀(jì)七十年代才開始在字符識別方面的研究,主要是常見的字符,比如數(shù)字、英文和漢字。1986年進(jìn)入到一個(gè)實(shí)質(zhì)性的階段,雖然很多研究單位推出了一些中文OCR的產(chǎn)品,但由于識別率低,硬件設(shè)備成本高,運(yùn)行速度慢等,未能達(dá)到實(shí)際要求。只有信息部門、新聞出版社等個(gè)別單位使用漢字識別軟件。
到二十世紀(jì)九十年代,隨著平臺式掃描儀的普及,以及信息科學(xué)技術(shù)的發(fā)展,大大推動(dòng)了該技術(shù)的發(fā)展,使得識別的速度、效率大大滿足了用戶的使用要求,并在學(xué)校、醫(yī)院、企業(yè)等地方得到了廣泛的應(yīng)用。
Tesseract是一個(gè)OCR庫,目前由Google贊助[5]。Tesseract是目前公認(rèn)最優(yōu)秀、最精確的開源OCR系統(tǒng)。除了極高的精確度,Tesseract也具有很高的靈活性。它可以通過訓(xùn)練識別出任何字體,也可以識別出任何Unicode字符[6]。
文中在分析了文字識別系統(tǒng)的需求后,結(jié)合相關(guān)技術(shù)和方法設(shè)計(jì)了一個(gè)基于Tesseract文字識別框架的文字識別系統(tǒng),主要工作如下:
(1)文字信息提取:在識別輸入圖片之前對圖片進(jìn)行處理,避免原圖的質(zhì)量、亮暗程度、傾斜程度對實(shí)驗(yàn)結(jié)果的影響,使得提取出來的文字信息區(qū)域平滑、規(guī)范。截取修正包含完整的文字信息區(qū)域,對原圖上的所有文字進(jìn)行識別,以提高有效性。
(2)文字識別:通過Tesseract識別框架,對提取出的文字信息進(jìn)行模型訓(xùn)練和優(yōu)化字庫,提取輸入圖片中的文字信息,并重構(gòu)原圖版面和矯正識別信息。
(3)系統(tǒng)架構(gòu)設(shè)計(jì):根據(jù)項(xiàng)目需求分析,對各個(gè)模塊進(jìn)行實(shí)現(xiàn)并優(yōu)化系統(tǒng)。
圖像處理主要是對圖像成像所出現(xiàn)的問題進(jìn)行修正,可以降低隨機(jī)噪聲,為后續(xù)的識別做準(zhǔn)備。預(yù)處理一般包括二值化,灰度化,畸變校正,幾何變換(扭曲、旋轉(zhuǎn)、透視等等),去除模糊、圖像增強(qiáng)、光線校正,規(guī)范化等等[7]。
二值化(image binarization)[8]是一種基于灰度直方圖的圖像分割算法,將圖像中的像素分為兩類,通過適當(dāng)?shù)拈撝颠x取獲得仍然可以反映圖像整體和局部特征的二值化圖像,減少圖像中的數(shù)據(jù)量,凸顯目標(biāo)輪廓。適用于物體與背景的灰度值差別比較大的情況。二值化算法的初始值被設(shè)置為整個(gè)圖像灰度值的平均值,求取最優(yōu)二值化的值是這個(gè)算法的關(guān)鍵,也就是盡量求取灰度直方圖中兩個(gè)雙峰間的最低點(diǎn)。
然而,如果直接用OTSU大律法[9]進(jìn)行二值化,實(shí)際效果并不是很好,因?yàn)檫@是全局閾值,比較好的二值化方法應(yīng)該用局部閾值,畢竟圖像上每個(gè)地方的灰度值差別是比較大的。局部自適應(yīng)二值化的基本思想:首先針對某個(gè)像素點(diǎn),確定它的鄰域大小,然后根據(jù)鄰域內(nèi)像素值的分布情況來決定該像素點(diǎn)處的閾值,進(jìn)行二值化。該方法有較強(qiáng)的自適應(yīng)能力,能夠根據(jù)局部亮度值設(shè)定閾值,解決一定程度的明暗情況??梢杂行У貏澐至炼然蛘邔Ρ榷炔町愝^大的區(qū)域,獲得效果較好的二值化圖像。
Bernsen方法主要是一種動(dòng)態(tài)選擇閾值的自適應(yīng)方法,主要步驟為:首先讀取圖像并按照要求填充為指定形式的圖像,然后根據(jù)當(dāng)前位置像素點(diǎn)鄰域灰度情況計(jì)算該點(diǎn)二值化閾值,比較當(dāng)前像素點(diǎn)灰度值和閾值大小,如果閾值較小則將該點(diǎn)視為白點(diǎn),反之將該點(diǎn)視為黑點(diǎn),最后構(gòu)建二值圖像并顯示。
假設(shè)在一幅M×N大小的圖像中,針對(i,j)處的像素點(diǎn),它的灰度值為f(i,j),將大小為(2ω+1)×(2ω+1)的正方形區(qū)域視為鄰域窗口,則圖像中(i,j)位置像素點(diǎn)的二值化閾值T(i,j)可以表示為:
(1)
將該像素點(diǎn)的灰度值f(i,j)和二值化閾值T(i,j)進(jìn)行比較,從而對圖像進(jìn)行二值化。比較的規(guī)則如下:
(2)
由于(2ω+1)×(2ω+1)的窗口并不能在M×N尺寸的圖像中移動(dòng),所以要對圖像進(jìn)行填充。
由于輸入圖片上的字體位置不固定、文字傾斜等情況,很難確保后續(xù)包含完整的文字信息,所以要對原圖上的文字信息進(jìn)行精確截取和修正[10],確保待識別的文字信息區(qū)域含有較少的干擾信息和完整的文字信息。
對已處理后的二值化區(qū)域部分進(jìn)行適當(dāng)?shù)恼{(diào)整,截取相對的文字信息區(qū)域。在獲得區(qū)域截圖之后,使用間隙法來確定截取的圖片是否包括完整的文字信息。間隙法的主要思想是用于檢查圖區(qū)的圖片是否存在兩條間隙,若不存在則根據(jù)對應(yīng)的情況進(jìn)行調(diào)整,直到截取成功位置,如果在最大循環(huán)次數(shù)結(jié)束后,依舊沒有檢測到兩條間隙,則返回錯(cuò)誤代碼。
字符分割是將二值化后的圖像分割成只包含單個(gè)字符的圖片,也是關(guān)鍵步驟。分割的效果如何對后續(xù)的文字識別結(jié)果有直接的影響,避免分割的字符出現(xiàn)重疊、分裂的情況,盡量取出完整清晰的文字。
基于投影的圖像分割算法[11-12]就是依據(jù)圖像在水平和垂直兩個(gè)方向的投影密度來確定行切分和字符切分。一般是先進(jìn)行行切分,然后對每一文本行進(jìn)行垂直投影進(jìn)行字符切分。以行切分為例,首先判斷圖片是否存在傾斜,若存在則先進(jìn)行傾斜校正(計(jì)算傾斜角度然后進(jìn)行坐標(biāo)變換),保證文本行都是水平以后,逐行掃描圖像,記錄每一行的前景像素點(diǎn)(即組成文字的像素點(diǎn))個(gè)數(shù),得到一個(gè)圖像像素在水平方向上的統(tǒng)計(jì)結(jié)果。
然后根據(jù)這個(gè)結(jié)果來決定每一個(gè)文本行的起始行和結(jié)束行,最一般的做法是閾值法,即設(shè)定一個(gè)閾值,根據(jù)每一行的前景像素個(gè)數(shù)決定該行是否屬于“文本行”的一部分。
(1)通過空白區(qū)域?qū)挾扰袛喈?dāng)前空白區(qū)域是字與字之間的空隙,還是同一個(gè)字內(nèi)結(jié)構(gòu)與結(jié)構(gòu)之間的空隙。比如和前一個(gè)空白區(qū)域、后一個(gè)空白區(qū)域的寬度進(jìn)行比較,或者與空白區(qū)域?qū)挾鹊木颠M(jìn)行比較,一般來說,同一個(gè)字內(nèi)部結(jié)構(gòu)之間的空隙寬度是要比字與字之間的空隙小的。
(2)通過字的寬度/寬高比來判斷當(dāng)前切割出來的“字”是一個(gè)完整的字還是一個(gè)完整的字的一部分。不同的字體,會有不同的字體寬高比,所以利用字寬是個(gè)更好的方法,原理與通過空白區(qū)域?qū)挾冗M(jìn)行判斷的方法類似。
基于區(qū)域的圖像分割算法可以確保字符重疊時(shí)能夠?qū)鄠€(gè)字符的單個(gè)區(qū)域分割開來。以直接尋找區(qū)域?yàn)榛A(chǔ)的分割技術(shù),基于區(qū)域提取方法有兩種基本形式:一種是區(qū)域生長,從單個(gè)像素出發(fā),逐步合并以形成所需要的分割區(qū)域;另一種是從全局出發(fā),逐步切割至所需的分割區(qū)域。
文中提出了一種垂直投影結(jié)合區(qū)域判定算法,算法步驟如下:
(1)使用基于投影的圖像算法統(tǒng)計(jì)各個(gè)位置上的投影點(diǎn)的個(gè)數(shù);
(2)將字符大致分割,并計(jì)算分割位置的寬度眾數(shù);
(3)設(shè)置圖像中字符的寬度為字符寬度的寬度眾數(shù);
(4)比較寬度眾數(shù)和字符寬度,如果二者相差較小,就說明字符沒有重疊,可以直接返回,反之則認(rèn)為字符重疊,需要進(jìn)一步分割字符;
(5)計(jì)算寬度眾數(shù)和字符寬度的比值并向上取整數(shù),尋找兩個(gè)字符中間領(lǐng)域最小的投影點(diǎn)位置作為重疊字符的分割位置進(jìn)行分割。
Tesseract是1985年Ray Smith在HP實(shí)驗(yàn)室研發(fā)的一個(gè)OCR引擎[13],在1995年成為了最準(zhǔn)確的三款OCR識別引擎之一。曾經(jīng)在UNLV精確度測試中名列前茅。但1996年后基本停止了開發(fā)。2006年,Google邀請Smith加盟,重啟該項(xiàng)目。Tesseract目前支持Windows、Linux和Mac OS等平臺[14],在各個(gè)領(lǐng)域應(yīng)用廣泛。
配置所需測試環(huán)境組件如表1所示。
表1 設(shè)備環(huán)境
(1)將訓(xùn)練數(shù)據(jù)打包成tif格式,如果有多個(gè)圖片可以用jTessBoxEditors合并成單個(gè),圖片可以利用Windows自帶的畫圖工具另存為tif格式;
(2)將訓(xùn)練數(shù)據(jù)生成box格式。生成box文件的語法格式如下:
Tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
(3)用jTessBoxEditor打開tif文件進(jìn)行矯正錯(cuò)誤并訓(xùn)練,根據(jù)實(shí)際情況進(jìn)行修正,可能會分頁需要逐頁調(diào)整;
(4)顯示分析修正的字,生成.tr文件。tr文件格式如下:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] nobatch box.train
(5)計(jì)算字符集,生成一個(gè)unicharset文件。unicharset文件格式如下:
unicharset_extractor [lang].[fontname].exp[num].box
(6)定義字體特征文件,新建一個(gè)文件font_properties;
(7)聚集字符特征;
(8)合并5個(gè)文件。
Tesseract中主要的數(shù)據(jù)結(jié)構(gòu)如表2所示。
表2 Tesseract中的主要數(shù)據(jù)結(jié)構(gòu)
Init接口函數(shù)對內(nèi)部的變量進(jìn)行初始化,patapath為字符庫的路徑,language使用默認(rèn)的字庫,默認(rèn)的英文字庫為“eng”,默認(rèn)的中文字庫為“chi_sim”,在這里也可以添加自己訓(xùn)練的字庫。
SetImage接口函數(shù)輸入待識別的圖片,以及寬度、高度、像素等信息,為Tesseract提供最后識別的圖片。
MFC是微軟公司提供的一個(gè)C++類庫,用于在C++環(huán)境下編寫應(yīng)用程序的框架和引擎。MFC是WinAPI與C++的結(jié)合[15]。API,即微軟提供的Windows下應(yīng)用程序的編程語言接口,是一種軟件編程的規(guī)范,但不是一種程序開發(fā)語言本身,可以允許用戶使用各種各樣的第三方的編程語言對Windows下應(yīng)用程序進(jìn)行開發(fā),使這些被開發(fā)出來的應(yīng)用程序能在Windows下運(yùn)行,比如VB、VC++、Java、Delhpi。編程語言函數(shù)本質(zhì)上全部源于API,因此用它們開發(fā)出來的應(yīng)用程序都能工作在Windows的消息機(jī)制和繪圖里,遵守Windows作為一個(gè)操作系統(tǒng)的內(nèi)部實(shí)現(xiàn),這其實(shí)也是一種必要。MFC不只是一個(gè)功能單純的界面開發(fā)系統(tǒng),它提供的類絕大部分用來進(jìn)行界面開發(fā),關(guān)聯(lián)一個(gè)窗口的動(dòng)作,但它提供的類中有好多類不與一個(gè)窗口關(guān)聯(lián),即類的作用不是一個(gè)界面類,不實(shí)現(xiàn)對一個(gè)窗口對象的控制(如創(chuàng)建、銷毀),而是一些在Windows(用MFC編寫的程序絕大部分都在Windows中運(yùn)行)中實(shí)現(xiàn)內(nèi)部處理的類,如數(shù)據(jù)庫的管理類等[16-17]。
在MFC應(yīng)用中常規(guī)的應(yīng)用程序主要分為SDI(single document interface,單文檔界面)、MDI(multiple document interface,多文檔界面)、MTI(multiple top-level windows interface,多頂級窗口界面)和Dialog對話框程序幾類。
文中主要使用Dialog對話框程序來實(shí)現(xiàn)文字識別系統(tǒng)。對話框是圖形化用戶界面中一種組件,用于對用戶輸入、選擇的信息進(jìn)行接收,用戶可對各種控件進(jìn)行操作,也可向用戶顯示響應(yīng)的操作。對話框中包括編輯框、文本框、列表框、組合框、單選按鈕和復(fù)選按鈕等多種控件,來實(shí)現(xiàn)用戶的需求,完成用戶指定的操作和響應(yīng)。
對話框的組成:(1)對話框資源:在程序執(zhí)行過程中,用戶可以動(dòng)態(tài)地創(chuàng)建對話框資源,可以使用對話框資源對控件位置和類型、對話框位置和大小進(jìn)行編輯來配置對話框界面。通過創(chuàng)建對話框資源來添加所需的各種控件,以設(shè)置控件的ID和內(nèi)容;(2)對話框類:一般這個(gè)類由CDialog派生出,然而CDialog這個(gè)類又是由CWnd類派生。
CDialog成員變量如表3所示。
表3 CDialog成員變量
系統(tǒng)主要的控制按鈕及其說明如表4所示。
表4 控制按鈕與說明
系統(tǒng)實(shí)現(xiàn)代碼如下:
CString file;
m_path.GetWindowText(file);
char *path = T2A(file);
tesseract::TessBaseAPI *ap = new tesseract::TessBaseAPI();
string language="eng_my+chi_my";
if (ap->Init(NULL, language.c_str())) /
{
cerr<<"Could not initialize."< exit(1); } Pix *pic = pixRead(path); ap->SetImage(pic); char *put = api->GetUTF8Text(); ifstream in("../Debug/tmp.txt",ios::binary); while (getline(in, t)) { r += UTF8ToGB(t.c_str()).c_str(); } MessageBox(_T("識別成功")); m_res = A2W(r.c_str()); UpdateData(false); ap->End(); pixDestroy(&pic); 識別結(jié)果如圖1所示。 圖1 識別結(jié)果 文中介紹了OCR識別的過程和相應(yīng)的模塊,主要從文字信息提取和字符識別兩大模塊進(jìn)行研究。實(shí)現(xiàn)了容錯(cuò)性強(qiáng)、易擴(kuò)展等特點(diǎn)的文字識別系統(tǒng)。由于漢字字符集龐大導(dǎo)致漢字識別比英文字母的識別難度大,而傳統(tǒng)的基于字形結(jié)構(gòu)的方法不能滿足當(dāng)下實(shí)際的需求。文中主要結(jié)合了國內(nèi)外關(guān)于文字識別領(lǐng)域的文獻(xiàn),針對目前技術(shù)現(xiàn)狀的需求特點(diǎn),基于Tesseract框架實(shí)現(xiàn)了一種文字識別系統(tǒng)。 由于該識別模型的識別率主要與訓(xùn)練的數(shù)據(jù)量有關(guān),中文字符集較多且字符的結(jié)構(gòu)大致相識,系統(tǒng)依靠Tesseract引擎進(jìn)行識別,實(shí)驗(yàn)結(jié)果表明識別率并不高。目前文字信息提取的識別樣本有限,訓(xùn)練集也遠(yuǎn)遠(yuǎn)不夠,所以在以后的處理中會逐步加入更多的數(shù)據(jù)集,以提高系統(tǒng)的識別率。4 實(shí)驗(yàn)結(jié)果
5 結(jié)束語