Python tesserocr模塊使用示例
操作系統:Win10 1709 X64
python版本:3.6.5
依賴模塊:PIL、tesserocr。
需要說明的是,在windows系統上PowerShell通過PIP3 install tesserocr安裝驗證碼識別模塊時,需要先安裝Tesseract (一款由HP實驗室開發由Google維護的開源OCR(Optical Character Recognition , 光學字符識別)引擎,與Microsoft Office Document Imaging(MODI)相比,我們可以不斷的訓練的庫,使圖像轉換文本的能力不斷增強。)可執行文件。
以中國知網的註冊頁面為例,我們常被要求輸入這類簡單的字母組成,背景含很多雜線的驗證碼,如下圖所示:
我們對驗證碼另存為到本地代碼所在目錄,取名:test.png.
下圖是直接用對應模塊識別的代碼示例:
import tesserocr from PIL import Image image=Image.open(‘test.png‘) image.show() #可以打印出圖片,供預覽 print(tesserocr.image_to_text(image))
原始圖片尺寸較小,極少情況下如果無法正常識別,可以借助圖片處理工具PIL模塊進行圖片等比例放大後保存。此例中直接運行上述代碼,結果為“VHIHI”,即使是肉眼可見較為清晰的驗證碼,如果圖片未經處理直接交由tesserocr解析,也可能識別率很低。
通常情況下,我們還需要做些額外的圖片處理,如轉灰度圖,二值化等。
利用Image對應的convert()方法傳參L,即可將圖片轉為灰度圖。
image=image.convert(‘L‘)
image.show()
傳入1即可完成二值化,如下:
image=image.convert(‘1‘)
image.show()
當然我們更多時候需要根據圖片的實際情況指定二值化的閾值,比如我們將閾值設定為80,先轉灰度圖,再二值化,代碼如下:
import tesserocr from PIL import Image image=Image.open(‘test.png‘) image=image.convert("L") threshold=80 table=[] for i in range(256): if i <threshold: table.append(0) else: table.append(1) image=image.point(table,‘1‘) image.show() print(tesserocr.image_to_text(image))
觀察到處理後圖片如右:
盡管圖片已經轉為灰度圖,且過濾了大部分雜線,但是圖片關鍵像素丟失嚴重,識別結果自然也不盡如人意,結果:“VH.”。
此時我們根據圖片的實際情況,人為調整程序中預設的閾值到130,再觀察:,這次的圖片轉換效果顯著,我們再次查看識別結果,“VHRU”,與肉眼觀察到的別無二致,合乎要求。
可見驗證碼的識別除了用好識別模塊,還需要在必要時引入PIL(圖片處理模塊)進行圖片預處理,預處理過程中的閾值等設定也存有技巧,不同的參數設定,會完全影響最終的識別率。
現實中很多網站的驗證碼要遠比例子中的來得復雜,尤其是12306購票網站的驗證碼,使行為驗證碼開始高速發展,肉眼分辨起來都異常困難,這就要求我們對驗證碼的識別技術要不斷提升,才能突破網站逐步升級的反爬蟲機制。
Python tesserocr模塊使用示例