因爲公司須要,最近開始學習驗證碼的識別html
我選用的是tesseract-ocr進行識別,聽說之前是惠普公司開發的排名前三的,如今開源了。到目前爲止已經出到3.0.2了算法
固然了,前期咱們仍是須要對驗證碼進行一些操做,讓他對機器更友好,這樣才能提升識別率。app
步驟基本上是這樣的工具
第一步對驗證碼進行灰度圖以及二值化學習
須要用到pil庫能夠pip下載測試
代碼以下字體
def binarization(image): #轉成灰度圖 imgry = image.convert('L') #二值化,閾值能夠根據狀況修改 threshold = 128 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) out = imgry.point(table, '1') return out
接着是去噪,由於我研究的驗證碼基本不須要去噪,因此省略,須要去噪的小夥伴們,請自行谷歌。網站
還有傾斜度調整,推薦使用旋轉卡殼算法spa
原理是對圖片進行-30度到30度的旋轉,寬度最大的通常就是正的了。(網上這樣說的,我試過了,對大部分是能夠,小部分如c啥的貌似效果很差)命令行
歸一化
能夠用腐蝕算法對驗證碼進行細化
腐蝕算法請自行谷歌。
第二步對驗證碼進行切割
對不一樣的驗證碼有不一樣的算法
目前我只研究了這幾種
一
垂直像素直方圖
原理是根據每一個x的黑塊數量進行切割,黑塊數量大於某個值開始切割,小於某個值結束切割。適用於驗證碼之間有間隔或者間隔較大的,對那種粘連在一塊兒的驗證碼效果很差。
二
平均分割法
原理是找到黑塊開始出現的x,y軸和黑塊不出現的x,y軸,切割。而後平均分割成n等分。適用於驗證碼大小比較固定的,對粘連在一塊兒的驗證碼效果比上一種方法要好一點。
三
波谷分割法
原理和垂直像素直方圖相似,記錄每一個x的黑塊數量,找到局部的極小值,切割。適用於驗證碼之間有間隔或者間隔較大的,對那種粘連在一塊兒的驗證碼效果比垂直像素直方圖要好。
四
滴水算法
原理是模擬水滴的流動,記錄水滴的流動路徑,而後進行切割。要注意的是,起始點的肯定很重要,對那種粘連在一塊兒的驗證碼效果很好。
以上的四種算法之後我會將代碼貼在另外一個隨筆裏
第三步對驗證碼進行識別
終於到了重頭戲了
須要導入pytesser,調用image_to_string(image)便可識別。
不過識別率實在是低的可憐。
因此須要咱們對機器進行訓練。
下面簡要介紹下若是對機器進行訓練。
首先下載tesseract-ocr,必須的沒有怎麼識別對吧。
找儘可能多的驗證碼,最好是二值化後的或者按照上面的步驟切割下來的。
下載jTessBoxEditor選擇Tools中的merge-tiff,選擇要訓練的圖片,按下shift選擇多個,而後保存起來名字以下[lang].[fontname].exp[num].tif
生成 .box文件
tesseract ec.ufont.exp0.tif ec.ufont.exp0 batch.nochop makebox
而後能夠經過jTessBoxEditor的Box Editor進行調整能夠一張張調整。
如下摘自http://www.cnblogs.com/wolfray/p/5547267.html
爲了方便 ,將tif命名格式設爲[lang].[fontname].exp[num].tif
lang是語言
fontname是字體
好比咱們要訓練自定義字庫 ec 字體名:unfont
那麼咱們把tif文件重命名 ec.ufont.exp0.tif
生成 .box文件
tesseract ec.ufont.exp0.tif ec.ufont.exp0 batch.nochop makebox
使用訓練過的字庫生成.box文件
tesseract ec.ufont.exp0.tif ec.ufont.exp0 -l ufont batch.nochop makebox
而後寫一個腳本批量運行如下命令
腳本內容以下
num.font.exp0.tif應該改爲你本身的文件名字
rem 執行改批處理前先要目錄下建立font_properties文件 echo Run Tesseract for Training.. tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train echo Compute the Character Set.. unicharset_extractor.exe num.font.exp0.box mftraining -F font_properties.txt -U unicharset -O num.unicharset num.font.exp0.tr echo Clustering.. cntraining.exe num.font.exp0.tr echo Rename Files.. rename normproto num.normproto rename inttemp num.inttemp rename pffmtable num.pffmtable rename shapetable num.shapetable echo Create Tessdata.. combine_tessdata.exe num.
1. 產生字符特徵文件 .tr
tesseract ec.ufont.exp0.tif ec.ufont.exp0 nobatch box.train
這一步將會產生 ec.ufont.exp0.tr文件和一個 ec.ufont.exp0.txt文件,txt文件貌似沒什麼用,看看而以。
2.計算字符集(生成unicharset文件)
unicharset_extractor ec.ufont.exp0.box
3.定義字體特徵文件
—Tesseract-OCR3.01以上的版本在訓練以前須要建立一個名稱爲font_properties.txt的字體特徵文件
手工創建一個文件font_properties.txt
內容如:ufont 0 0 0 0 0
注意:這裏 必須與訓練名中的名稱保持一致,填入下面內容 ,這裏全取值爲0,表示字體不是粗體、斜體等等。
4.彙集字符特徵
1) shapeclustering -F font_properties.txt -U unicharset ec.ufont.exp0.tr
注意:若是font_properties不加擴展名.txt,可能會報錯
2) mftraining -F font_properties.txt -U unicharset -O ufont.unicharset ec.ufont.exp0.tr
使用上一步產生的字符集文件unicharset,來生成當前新語言的字符集文件ec.unicharset。同時還會產生圖形原型文件inttemp和每一個字符所對應的字符
特徵數文件pffmtable。最重要的就是這個inttemp文件了,他包含了全部須要產生的字的圖形原型。
3)cntraining ec.ufont.exp0.tr
這一步產生字符形狀正常化特徵文件normproto。
shapeclustering 操做不是必須的,若沒有進行此步,在mftraining的時候 會自動進行。
5.更名字
把目錄下的unicharset、inttemp、pffmtable、shapetable、normproto這五個文件前面都加上ufont.
6.執行combine_tessdata ufont.
而後把ufont.traineddata放到tessdata目錄
7.測試
必須肯定的是第type 一、三、四、5的數據不是-1,那麼一個新的字典就算生成了。
tesseract ec.ufont.exp0.tif papapa -l ufont
tesseract也提出,經過使用多個語言訓練庫聯合使用。如此,新的字體訓練庫也能夠與原有的數據訓練庫聯合使用。如參數 -l 以後 tesseract input.tif output -l eng+newfont。
cntraining和mftraining只能最多采用32個.tr文件,所以,對於相同的字體,你必須從多種語言中,以字體獨立的方式,將全部的文件cat到一塊兒來讓32種語言結合在一塊兒。cntraining/mftraining以及unicharset_extractor命令行工具必須各自由給定的.tr和.box文件,以相同的順序,爲不一樣的字體進行不一樣的過濾。能夠提供一個程序來完成以上的事情,並在字符集表中挑出相同字符集。這樣會將事情更簡單些。
寫批處理bat命令的時候,要靈活使用excel裏面的填充功能。
最後記錄下訓練時遇到的問題
tesseract.exe eng.font.exp0.tif eng.font.exp0 nobatch box.train
運行上述命令是可能會遇到could not find a matching blob問題
請調整你的box大小,或者更換圖片
在此隨便解釋下box裏面的值的含義
第一個是識別出的值+空格+box起始x座標+空格+不知道什麼鬼的座標,貌似不是起始y座標+空格+box終點x座標即起始x座標加上寬度+空格+起始y座標加上高度
通常來講若是調整了box大小都還報錯的話,建議換圖
另外一個問題是運行
mftraining -F font_properties -U unicharset eng.font.exp0.tr
會報錯
改爲運行
mftraining -F font_properties.txt -U unicharset eng.font.exp0.tr
就是font_proerties加上.txt
在這裏感謝下不少大神在網站的解答和記錄,對個人學習起了很大的做用。謝謝。