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