張婷婷,馬明棟,王得玉
(南京郵電大學(xué),江蘇 南京 210003)
OCR的概念于1929年由德國科學(xué)家Tausheck最先提出。最早對印刷體漢字識別進(jìn)行研究的是IBM公司的Casey和Nagy[1]。在20世紀(jì)的60、70年代,世界各個國家對OCR的研究主要集中在對文字的識別方法上,并且僅是對0到9的數(shù)字進(jìn)行識別。而國內(nèi)在OCR技術(shù)的研究相對較晚。在20世紀(jì)70年代,國內(nèi)學(xué)者起初研究的是數(shù)字、英文字母及符號的識別,70年代末開始研究漢字的識別。
OCR[2]技術(shù)在目前互聯(lián)網(wǎng)及人工智能迅速發(fā)展的趨勢下,也有了飛速的發(fā)展。到目前為止,結(jié)合其他方向的技術(shù),特別是人工智能方向,OCR技術(shù)已經(jīng)發(fā)展到可以識別帶有地理位置信息的圖紙,可以對文字進(jìn)行高精度的識別,包括生僻字在內(nèi)的情況[3]。
OCR技術(shù)也普遍應(yīng)用在日常生活,最為熟悉的是百度網(wǎng)頁可以拍照識別圖紙上的題目文字,另外還有百度AI輸入法中的一系列文字識別功能,包括:身份證識別、名片識別、表格識別等等[4]。
圖像輸入,對其進(jìn)行預(yù)處理操作。對于不同格式的圖像,有著不同的存儲格式和壓縮方式[5]。文中的圖像輸入,上傳圖片方法是實(shí)現(xiàn)客戶端上傳一張本地圖片或者使用抓包工具postman向百度服務(wù)器發(fā)送url請求[6]時設(shè)置參數(shù)添加一張本地帶漢字的圖片。
預(yù)處理過程,是使用閾值分割法把圖片上每個像素二值化[7]。以下是用Java語言實(shí)現(xiàn)的預(yù)處理函數(shù),函數(shù)是根據(jù)圖片高度和寬度遍歷圖片上的每個像素點(diǎn),通過ISWHITE來判斷當(dāng)前像素值。
Int width=img.getWidth();
Int height=img.getHeight();
For(int x=0;x For(int y=0;y If(ISWHITE(img.getRGB(x, y))==1) { Img.setRGB(x,y,color.WHITE.getRGB()); //像素紅綠藍(lán)在一定范圍置成白色 } else { Img.setRGB(x,y,color.WHITE.getRGB()); //反之置成黑色 } } } 灰度化處理,在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值。灰度圖每個像素只需一個字節(jié)存放灰度值[8],其范圍是0~255。將彩色圖像中的三分量的亮度作為三個灰度圖像的灰度值[9]。其中fk(i,j)(k=1,2,3)為轉(zhuǎn)換后的灰度圖像在(i,j)處的灰度值。采用分量方法[10]: f1(i,j)=R(i,j) (1) f2(i,j)=G(i,j) (2) f3(i,j)=B(i,j) (3) 二值化過程[11],根據(jù)灰度圖像中像素的灰度級值的取值范圍為c0[12],希望能夠更加顯現(xiàn)出圖像中的文字部分,一般圖像中的文字為黑色,在灰度圖像中灰度值較小。二值化過程使用Otsu算法實(shí)現(xiàn),Otsu算法又稱為最大類間方差法[13]。 設(shè)一幅圖像大小為(M*N),f(x,y)是該圖像中點(diǎn)(x,y)處像素的灰度值,灰度級為L,則f(x,y)∈[0,L-1]。若灰度級i的所有像素個數(shù)為fi,則第i級灰度出現(xiàn)的概率為: (4) (5) 將圖像中的像素按灰度級用閾值t劃分為兩類,即背景c0和目標(biāo)c1[14]。背景c0的灰度級為0~t-1,目標(biāo)的灰度級為t~L-1。背景c0和目標(biāo)c1對應(yīng)的像素分別為f(i,j)。背景c0部分出現(xiàn)的概率和目標(biāo)c1部分出現(xiàn)的概率分別為: (6) (7) 其中,w0+w1=1。 背景c0部分和目標(biāo)c1部分的平均灰度值分別為: (8) (9) 圖像的總平均灰度值為: (10) 圖像中背景和目標(biāo)的類間方差為: δ2(k)=w0(u-u0)2+w1(u-u1)2 (11) 令k的取值從0~L-1變化,計(jì)算不同k值下的類間方差δ2(k),使得類間方差δ2(k)最大時的那個值就是所要的最佳閾值。 圖像分割就是把圖像分成若干個特定的、具有獨(dú)特性質(zhì)的區(qū)域并提出感興趣目標(biāo)的技術(shù)和過程。圖像分割方法近年來又有新型神經(jīng)網(wǎng)絡(luò)圖像分割法,文中使用閾值分割法進(jìn)行圖像分割。 閾值分割方法實(shí)際上是輸入圖像f到輸出圖像g的變換[15],公式如下: (12) 其中,T為閾值,對于物體的圖像元素g(i,j)=1,對于背景的圖像元素g(i,j)=0。 如果能確定一個合適的閾值就可準(zhǔn)確地將圖像分割開來。閾值確定后,將閾值與像素點(diǎn)的灰度值逐個進(jìn)行比較,而且像素分割可對各像素并行地進(jìn)行,分割的結(jié)果直接給出圖像區(qū)域[16]。 前邊的圖像處理都是為此步驟做鋪墊。二值化和圖像分割已經(jīng)將字符提取出來,但是以單個漢字為基礎(chǔ)的識別要將每個字從圖像中提取出來[17]。文中的漢字識別,主要借助百度的OCR識別技術(shù),識別出通用字。 此測試環(huán)境需要的配置如下: (1)百度官方的Java SDK壓縮包; (2)Jdk需要1.7以上; (3)IDE使用Eclipse新建工程,導(dǎo)入下載的工具包; (4)配置通用文字識別的客服端,以及服務(wù)器代理設(shè)置,代碼如下: Public class test { Public static void main(string[] args) { AipOcr Client=new AipOcr(app_id,api_key,secret_key); //網(wǎng)絡(luò)設(shè)置 Client.setConnectionTimeoutInMillis(2000); Client.setSocketTimeoutInMillis(60000); //代理設(shè)置,http代理 Client.setHttpProxy(“proxy_host”,proxy_port); //接口調(diào)用 String path=“test.jpg”; JSONObject res=client.basicGeneral(path,new HashMap System.out.println(res.toString(2)); } } 上述代碼中接口說明如表1所示。 表1 測試代碼接口說明 向服務(wù)器請求識別某張圖片中的所有文字。Java語言的配置代碼如下: public void sample(AipOcr client) { //傳入可選參數(shù)調(diào)用接口 HashMap options.put(“l(fā)anguage_type”,“CHN_ENG”); options.put(“detect_direction”,“true”); options.put(“detect_language”,“true”); options.put(“probability”,“true”); //參數(shù)為本地路徑 String image=“test.jpg”; JSONObject res=client.basicGeneral(image,options); System.out.println(res.toString(2)); //參數(shù)為二進(jìn)制數(shù)組 byte[] file=readFile(“test.jpg”); res=client.basicGeneral(file,options); System.out.println(res.toString(2)); //通用文字識別, 圖片參數(shù)為遠(yuǎn)程url圖片 JSONObject res = client.basicGeneralUrl(url, options); System.out.println(res.toString(2)); } Postman使用post方法請求識別圖片文字,請求參數(shù)設(shè)置如表2所示。 表2 url請求參數(shù)設(shè)置 請求返回結(jié)果參數(shù)說明如表3所示。 表3 請求結(jié)果參數(shù)說明 介紹了OCR識別的過程和相應(yīng)模塊的代碼實(shí)現(xiàn),理論公式推導(dǎo)。國內(nèi)在OCR方向上的發(fā)展是很迅速的,尤其是國內(nèi)公司在其上的應(yīng)用,這種技術(shù)已經(jīng)滲透到日常手機(jī)打字的軟件百度輸入法中。文中的二值化方法只是平常方法中的一個,還有其他很多方法未涉及,圖像分割也是如此。 OCR大體可以分為兩類:手寫體識別和印刷體識別。文中使用Java語言基于百度OCR的API實(shí)現(xiàn)OCR掃描識別印刷體圖片上文字的一個客戶端(普通文字識別),操作可以借助百度公司OCR的API利用抓包工具postman向其服務(wù)器發(fā)送post請求,在請求參數(shù)中帶上一張帶有文字的圖片或者使用實(shí)現(xiàn)的客戶端進(jìn)行圖片上傳識別。還介紹了圖像文字識別剛開始的圖像處理,其中圖像分割步驟至關(guān)重要,是識別率高的關(guān)鍵點(diǎn)。文中默認(rèn)識別通用文字中文,高精度的識別或者帶位置信息的識別,生僻字的識別,此處不做研究。Post請求提交時,請求頭Header設(shè)置為x-wwww-form-urlencoded形式。2 圖像分割
3 漢字識別
4 結(jié)束語