操做系統:Win10 1709 X64python
python版本:3.6.5windows
依賴模塊:PIL、tesserocr。app
須要說明的是,在windows系統上PowerShell經過PIP3 install tesserocr安裝驗證碼識別模塊時,須要先安裝Tesseract (一款由HP實驗室開發由Google維護的開源OCR(Optical Character Recognition , 光學字符識別)引擎,與Microsoft Office Document Imaging(MODI)相比,咱們能夠不斷的訓練的庫,使圖像轉換文本的能力不斷加強。)可執行文件。工具
以中國知網的註冊頁面爲例,咱們常被要求輸入這類簡單的字母組成,背景含不少雜線的驗證碼,以下圖所示:網站
咱們對驗證碼另存爲到本地代碼所在目錄,取名:test.png.spa
下圖是直接用對應模塊識別的代碼示例:操作系統
import tesserocr from PIL import Image image=Image.open('test.png') image.show() #能夠打印出圖片,供預覽 print(tesserocr.image_to_text(image))
原始圖片尺寸較小,極少狀況下若是沒法正常識別,能夠藉助圖片處理工具PIL模塊進行圖片等比例放大後保存。此例中直接運行上述代碼,結果爲「VHIHI」,即便是肉眼可見較爲清晰的驗證碼,若是圖片未經處理直接交由tesserocr解析,也可能識別率很低。code
一般狀況下,咱們還須要作些額外的圖片處理,如轉灰度圖,二值化等。blog
利用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購票網站的驗證碼,使行爲驗證碼開始高速發展,肉眼分辨起來都異常困難,這就要求咱們對驗證碼的識別技術要不斷提高,才能突破網站逐步升級的反爬蟲機制。