首先介紹一個(gè)名詞OCR(Optical Character Recognition,光學(xué)字符識別)。是指電子設(shè)備(例如掃描儀或數(shù)碼相機(jī))檢查紙上打印的字符,通過檢測暗、亮的模式確定其形狀,然后用字符識別方法將形狀翻譯成計(jì)算機(jī)文字的過程。
OCR的應(yīng)用領(lǐng)域:
文字識別OCR通常應(yīng)用在證件識別(身份證,駕駛證,護(hù)照,名片)、文檔檢索、截圖識別(猿題庫,作業(yè)幫)
OCR對圖片都做了什么:
實(shí)際上我們預(yù)期的結(jié)果是把只有包含單個(gè)文字的圖片交給計(jì)算機(jī)去翻譯。
機(jī)器是怎么看到紙質(zhì)或者電子文檔或是圖片上的文字的呢?接下來看一下他的工作流程:
首先要去掉雜質(zhì),這樣程序就可以集中注意到文字上面。
預(yù)處理
預(yù)處理主要包括灰度化,二值化,噪聲去除,傾斜矯正等。
- 灰度化:
灰度圖是只含亮度信息,不含色彩信息的圖片。
在RGB模型中,如果R=G=B時(shí),則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值。
一般滿足下面這個(gè)公式:
Gray=0.299R+0.587G+0.114B 這種參數(shù)考慮到了人眼的生理特點(diǎn)


-
二值化:非黑即白
對攝像頭拍攝的圖片,大多數(shù)是彩色圖像,彩色圖像所含信息量巨大,對于圖片的內(nèi)容,我們可以簡單的分為前景與背景,為了讓計(jì)算機(jī)更快的,更好的識別文字,我們需要先對彩色圖進(jìn)行處理,使圖片只前景信息與背景信息,可以簡單的定義前景信息為黑色,背景信息為白色,這就是二值化圖了。
經(jīng)過灰度處理的彩色圖像還需經(jīng)過二值化處理將文字與背景進(jìn)一步分離開。
二值化的過程中涉及到“閾值”的概念,簡單來說就是想找到一個(gè)合適的值來作為一個(gè)界限,大于或小于這個(gè)界限的值變?yōu)榘咨蚝谏?或255?!伴撝怠笔窃趺催x出來的?
有很多方法,這里只介紹下面兩種??
方法1:
取閥值為127(相當(dāng)于0~255的中數(shù),(0+255)/2=127),讓灰度值小于等于127的變?yōu)?(黑色),灰度值大于127的變?yōu)?55(白色),這樣做的好處是計(jì)算量小速度快,但是缺點(diǎn)也是很明顯的,因?yàn)檫@個(gè)閥值在不同的圖片中均為127,但是不同的圖片,他們的顏色 分布差別很大,所以用127做閥值,這種一刀切,效果肯定是不好的。
二值化效果圖.GIF方法2:
使用直方圖方法(也叫雙峰法)來尋找二值化閥值,直方圖是圖像的重要特質(zhì)。直方圖方法認(rèn)為圖像由前景和背景組成,在灰度直方圖上,前景和背景都形成高峰,在雙峰之間的最低谷處就是閥值所在。
下圖就可以將小于T的視為全部為黑色,大于T的為白色。
圖片來自網(wǎng)絡(luò).png -
圖像降噪:
現(xiàn)實(shí)中的數(shù)字圖像在數(shù)字化和傳輸過程中常受到成像設(shè)備與外部環(huán)境噪聲干擾等影響,稱為含噪圖像或噪聲圖像。減少數(shù)字圖像中噪聲的過程稱為圖像降噪(Image Denoising)。
在演示的過程中可以看到當(dāng)二值化之后的圖片會(huì)顯示很多小黑點(diǎn) ,這些都是不需要的信息,會(huì)對后面進(jìn)行圖片的輪廓切割識別造成極大的影響,降噪是一個(gè)非常重要的階段,降噪處理的好壞直接影響了圖片識別的準(zhǔn)確率。
最簡單的叫做數(shù)據(jù)結(jié)構(gòu)中學(xué)到的DFS或者BFS(深度和廣度搜索)。我們對w*h的位圖先搜索所有聯(lián)通的區(qū)域(值為1的,我們看起來是黑色的,連接起來的區(qū)域)。所有聯(lián)通區(qū)域算一個(gè)平均的像素值,如果某些聯(lián)通區(qū)域的像素值遠(yuǎn)遠(yuǎn)低于這個(gè)平均值,我們就認(rèn)為是噪點(diǎn)。然后用0代替他。
點(diǎn)點(diǎn).jpg
- 傾斜矯正:
拍照或者選取的圖片不可能完全是水平的,傾斜會(huì)影響后面切出來的圖片,所以要對圖片進(jìn)行旋轉(zhuǎn)
傾斜矯正最常用的方法是霍夫變換,其原理是將圖片進(jìn)行膨脹處理,將斷續(xù)的文字連成一條直線,便于直線檢測。計(jì)算出直線的角度后就可以利用旋轉(zhuǎn)算法,將傾斜圖片矯正到水平位置。
圖片分割:
對于一段多行文本來講,文字切分包含了行切分與字符切分兩個(gè)步驟,傾斜矯正是文字切分的前提。我們將傾斜矯正后的文字投影到 Y軸,并將所有值累加,這樣就能得到一個(gè)在y軸上的直方圖。
下圖是經(jīng)過橫向縱向切割后得到的效果。
截取這篇文章的內(nèi)容理解一下這個(gè)直方圖https://blog.csdn.net/Print_lin/article/details/80143002




最后文字識別:
以上所有的步驟都是為了獲取這一小塊的圖片 ,把每一部分的圖片掃描的文字提取的特征向量與特征模板庫進(jìn)行模板粗分類和模板細(xì)匹配,識別出字符。

本文圖片預(yù)處理部分使用的是開源框架OpenCV,識別部分使用的是谷歌開源的第三方框架Tesseract.Tesseract不能識別手寫,而且只能識別一共大約64種字體的文本。目前對中文的識別速度還是有點(diǎn)低。畢竟是國外的,對于中文還是差點(diǎn),畢竟是免費(fèi)的~~~。
以上的總結(jié)參考并部分摘抄了以下文章,非常感謝以下作者的分享!:
1、https://mp.weixin.qq.com/s?__biz=MzA3MDExNzcyNA==&mid=2650391990&idx=1&sn=a6f4607867441c60b00730afe53325a7
2、https://mp.weixin.qq.com/s?__biz=MzA3MDExNzcyNA==&mid=402907292&idx=1&sn=889c4abcf576e24525ea6a705069c4de
3、https://my.oschina.net/tigerBin/blog/1486966
4、https://www.cnblogs.com/qcloud1001/p/8081438.html
5、https://blog.csdn.net/antkillerfarm/article/details/52274740
6、https://blog.csdn.net/Print_lin/article/details/80143002
7、https://zhuanlan.zhihu.com/p/66301560

