章 安,馬明棟
(1.南京郵電大學 通信與信息工程學院,江蘇 南京 210003; 2.南京郵電大學 地理與生物信息學院,江蘇 南京 210003)
1929年德國科學家Tausheck提出了OCR的概念[1],通過對圖像像素點的分割,與字符庫對照,獲取最近似的計算機文字。最初的OCR技術目的在于信息化處理大量的印刷品,例如報刊雜志、文件資料和其他文字材料,進而開始了西文OCR技術的研究,以便代替人工鍵盤輸入[2]。隨著時間的推移,科技公司的不懈努力以及計算機技術的飛速發展,西文OCR技術現已廣泛應用于各個領域,實現了“電子化”信息處理。
國內對于印刷體漢字識別的研究從20世紀70年代末起步[3],至今己有近四十年的發展歷史。從最開始對數字、英文、符號識別的研究,到對漢字識別進行了探索,80年代后期,大量研究人員鉆研其中,漢字識別技術也趨于實用化[4]。如今市場上的OCR識別平臺層出不窮,最常見的百度、華為和騰訊等公司都提供了文字識別云平臺,在所需的環境之下,調用其提供的在線接口,便可以實現文字的識別。
Tesseract是一個開源OCR庫,源碼存在于github上?;谄溟_源的特性,可以添加接口,豐富其功能。支持Tesseract的Leptonica組件有著優越的圖像分析性能,保證了文字識別的精度。除此之外,Tesseract還具有多平臺的可移植性,擁有龐大的Unicode字符識別庫。
識別是智能的基礎[5],目前互聯網技術迅速發展,在AI(artificial intelligence,人工智能)技術的需求之下,OCR技術成為了不可忽略的部分,通過文字的識別,提高了各行各業的生產效率。
文字識別通常有兩種形式,手寫體與印刷體[6]。對于印刷體而言,研究結果相對成熟,而手寫體更為復雜,該文的討論范圍僅在于印刷體的文字識別。
文字識別通常包括以下流程:
(1)預處理:預處理操作在圖像識別之前。已采集的圖像質量受多方面因素影響,圖像的亮暗、印刷體質量、污點或陰影都是干擾識別的因素。預處理主要是對圖像進行處理,將圖像灰度化以及二值化,進而對圖像的傾斜、邊框等問題進行處理,使得文字規范,圖像平滑,從而有利于接下來的處理操作[7]。
(2)版面分析:版面分析主要處理文本圖像的不同部分,分析圖像中不同類型文本,例如標題或是正文,插圖或是表格,從而獲取文章邏輯結構,包括各區域的邏輯屬性、文章的層次關系和閱讀順序。最后根據版面分析和文字的結果,進行版面重構。
(3)圖像切分:識別是單個文字的識別,因而必須對圖像進行行列切分。印刷體文字圖像行列間距、字間距大致相等,簡化了處理方法。
(4)特征提取與模型訓練:通過深度學習框架,對文字識別進行特征提取和模型訓練,提高了識別的有效性和可靠性。
(5)識別后處理:識別后處理通常包括版面的重構和識別的校正,對原圖像版面的恢復以及不同語言模型的校正[8]。
通過以上流程,計算機通過輸入的圖像,分析并識別文字,同時保存于硬件中。識別流程不包括圖像的采集、最終圖像的輸出,這類工作由其他硬件實現。
預處理是文字識別的重要一環,預處理對圖像質量的提升起到了關鍵作用。預處理通常包括灰度化、二值化、傾斜校正和噪聲消除[9],該文實現了以下幾個預處理方法,為Tesseract文字識別做好準備。
Tesseract處理圖像的DPI(dots per inch,每英寸點像素數)默認為300 DPI,因而對于DPI不足的圖片,需要進行縮放處理。常用的縮放算法有最近鄰算法(最近鄰插值)、雙線性插值算法以及更為復雜的三次插值算法[10],三種算法的精度不一?;谖淖肿R別的精度要求,該文實現了雙線性插值圖像縮放算法。
在離散數學中,插值是指在離散數據的基礎上補差連續函數[11],使得該連續曲線通過全部給定的離散數據點,關鍵在于恢復曲線的連續與平滑。與之類似,圖像基本構成是有限像素集,在圖像縮放的過程中,需要對圖像進行像素的插入(放大)或是疊加(縮小)。
圖像縮放的過程中,原圖像與輸出圖像具有一定的映射關系:
Y(x'+u,y'+v)=X(x,y)=X(h1(x,y),h2(x,y))
(1)
其中,X(x,y)表示輸入圖像,Y(x'+u,y'+v)表示輸出圖像,h1和h2表示映射函數。轉換之后可能出現小數的情況,令x'和y'作為坐標的整數部分,u和v作為小數部分。
圖1 雙線性插值示意
如圖1所示,取轉換點四個領域整數位置點(x',y'),(x',y'+1),(x'+1,y'),(x'+1,y'+1)。設RGB滿足函數f(x,y),則轉換之后的點坐標中的RGB值為:
f(x,y)=f(x'+u,y'+v)
(2)
f(x'+u,y'+v)=f(x,y)*(1-u)*(1-v)+
f(x',y'+1)*(1-u)*v+
f(x'+1,y)*u*(1-v)+
f(x'+1,y'+1)*u*v
(3)
式(3)類比于一維坐標系下的長度比值關系,在二維坐標系下,是富含規律的面積比值關系。即所求點的RGB等于:
f(x,y)=∑Ri*S對角
(4)
其中,Ri表示領域點的RGB中的某一項,S對角表示對角的矩形面積值。
示例代碼:
for (int k=0;k<3;k++)
{
change[x+k]=image[o_x+k]*(1-a_x)*(1-a_y)+
//對應f(x,y)*(1-u)*(1-v)
image[o_b+k]*a_x*(1-a_y)+
/對應/f(x',y'+1)*(1-u)*v
image[o_c+k]* a_y*(1 - a_x) +
//對應f(x'+1,y)*u*(1-v)
image[o_d+k]* a_y*a_x;
//對應f(x'+1,y'+1)*u*v
}
二值化的過程形如二進制中的01變化,圖像的二值化就是將圖像的像素點的灰度值設置成0或255。首要工作是將圖像灰度化,灰度化是將原圖像各像素R、G、B三個值按照不同的權值,將加權和均賦值給目標圖像的RGB值。二值化的算法的重點是獲取像素點灰度的閾值,高于閾值的像素點灰度設置為255,反之設置為0。二值化的算法眾多,常用的如利用聚類思想、根據灰度特征劃分前景后景的Otsu算法,以及基于像素點為中心確定利用范圍像素確定像素閾值的Bernsen算法[12]。
由于人眼對RGB三色的敏感度不同[13],因而灰度化時權值必然不同,該文利用心理學公式(5)中的權值實現灰度化,該公式適用于sRGB存儲空間的圖像。
Gray=R*0.299+G*0.587+B*0.114
(5)
實現方法只需遍歷所有像素點,對其RGB求加權和,將新值更新到源像素點中。
對于二值化過程,該文使用Otsu算法,Otsu算法又稱為“大津法”、最大類間方差法[14]。該算法的主要思想是根據圖像的灰度特征將圖像分為前景與背景兩部分,而前景就是所求的目標圖像[15],使用方差這一統計量,反映前后景灰度差距,其中存在概率分布,實行概率加權,最終遍歷所有可能的灰度值,方差最大處為灰度閾值。
具體流程如下:
設圖像灰度范圍為[0,L-1],閾值M∈[0,L-1]。
(1)分別計算像素灰度值在[0,M]與(M,L-1]出現的概率P1和P2,其中:
P1+P2=1
(6)
(2)分別計算像素在[0,M]和(M,L-1]的平均值μ1和μ2及總體灰度平均值μ。
(3)灰度類間方差函數為:
σ2=P1(μ1-μ)2+P2(μ2-μ)2
(7)
由概率以及均值關系可推出最終表達式:
σ2=P1P2(μ1μ2)2
(8)
(4)遍歷所有灰度閾值M,方差最大時的M即為最佳閾值。
示例為部分代碼:
int OtsuAlgThreshold(const Mat){
int M;//閾值
for(int i=0;i < 255;i++){
double p1=0,u1=0,p2=0,u2=0;
double sum1=0,sum2=0;//像素點總數
double gray_sum1=0,gray_sum2=0;//灰度值總數
for(int j=0;j<=i;j++){
sum2+=gram[j];
gray_num2+= j*gram[j];
sum1+= gram[i+j];
gray_num1+=(i +j)*gram[i+j];
}
u2=gray_sum2/sum2;
p2=sum2/total;
u1=gray_sum1/sum1;
p1=sum1/total;
//類間方差計算
double Sq=p1*p2*(u1-u2)*(u1-u2);
if(SqMax < sq){
SqMax=sq;//更新最大方差值
M=i;
}
}
return M;//返回閾值M
}
以上獲取最佳方差的灰度值之后,便可通過遍歷像素點進行灰度值調整。
輸入的圖像由于采集設備的原因可能存在意想不到的邊框,或是圖像角度發生了偏移,因而會影響接下來的版面分析與行列切分工作,最終影響識別效果。此部分涉及到兩個部分,一是發生偏移的角度,二是邊框的選取。該文參考OpenCV庫中的函數,實現了一種方法,方法的重點在于遍歷查找最小外接矩形,旋轉之后進行切割,從而獲取最終圖像。方法流程如下:
(1)獲取圖像最小外接矩形。
(2)獲取圖像偏移角度,同時進行旋轉操作。
(3)對圖像進行輪廓檢測,循環篩選。
(4)切邊,獲取最終圖像。
該思路之前需要對圖像進行灰度化和二值化處理,以便于提高檢測的精度。
此前的圖像預處理是為了文字識別作鋪墊。預處理過程使得圖像質量得到一定的改善,其DPI和對比度得到顯著提升,文字的方向和邊框也得到校正,從而改善了識別的準確性。文中的漢字識別,依賴于Tesseract框架,識別出Unicode字符。
此測試環境需要的配置如表1所示。
表1 配置環境與說明
預先需要使用CMake編譯工具將Libtiff、Leptonica編譯,在Tesseract中添加動態鏈接庫(后綴為.dll)文件之后方可使用。
識別代碼如下:
char *outPut;
tesseract::TessBaseAPI *ocr=new tesseract::TessBaseAPI();
//初始化ocr識別模式
if(ocr->Init(NULL, "eng")) {
cerr<<"Initialize Failed”< exit(1);//退出 } //傳入參數 Pix *image=pixRead(Imag_name); ocr->SetImage(image); //輸出結果 outPut=ocr->GetUTF8Text(); cout< ocr->End(); 上述代碼中的接口功能如表2所示。 表2 接口與功能 參數及說明如表3所示。 表3 參數與說明 輸入圖像通過預先的縮放、二值化、邊框處理的工作之后,輸入到Tesseract工作環境中,實現最終屏幕控制臺的輸出顯示,從而完成文字識別的基本流程。 該文概述了文字識別的基本過程,對每一個過程進行了基本的介紹。在Tesseract框架已有的基礎上,對預處理階段的圖像縮放、二值化、邊框處理、傾斜校正重點研究,相應的模塊具有公式的推導以及代碼的實現。最后依賴于Tesseract框架,先調用實現的預處理方法,實現預處理,繼而調用Tesseract對象提供的初始化、讀入、處理接口進行圖像的操作,從而輸出字符串變量,實現文字的識別。 該文的OCR文字識別研究較為普通,面向的場景也較為單一,精度要求不甚嚴格。除印刷體以外,還有較為復雜的手寫體,證件識別,高精度識別。在OCR的工作流程中,除了預處理之外,還可通過版面分析、圖像切分以及后續的特征匹配和模型訓練的算法提升來提高識別的效率。實現的預處理方法只是領域中的一種可行的方法,除此之外也有眾多優秀的算法。 Tesseract框架的功能強大,可移植性強,識別范圍廣。Tesseract支持Linux、Windows、Mac OS,在各個領域應用廣泛。Tesseract框架只能識別印刷體,而不能識別手寫體,除此之外,如上文提到的,Tesseract依賴于圖像的質量,對于圖像的DPI,文字的排布也有著要求。因此,圖像的預處理工作必不可少,其中的算法研究也是研究重點。4 結束語