Python驗證碼識別:利用pytesser識別簡單圖形驗證碼

發表於2016-03-29

一、探討

識別圖形驗證碼可以說是做爬蟲的必修課,涉及到計算機圖形學,機器學習,機器視覺,人工智慧等等高深領域……

簡單地說,計算機圖形學的主要研究內容就是研究如何在計算機中表示圖形、以及利用計算機進行圖形的計算、處理和顯示的相關原理與演算法。圖形通常由點、線、面、體等幾何元素和灰度、色彩、線型、線寬等非幾何屬性組成。計算機涉及到的幾何圖形處理一般有 2維到n維圖形處理,邊界區分,面積計算,體積計算,扭曲變形校正。對於顏色則有色彩空間的計算與轉換,圖形上色,陰影,色差處理等等。

在破解驗證碼中需要用到的知識一般是 畫素,線,面等基本2維圖形元素的處理和色差分析。常見工具為:

  • 支援向量機(SVM)
  • OpenCV
  • 影象處理軟體(Photoshop,Gimp…)
  • Python Image Library

二、PIL安裝

PIL: Python Imaging Library, 是Python平臺的影象處理標準庫,功能非常強大。

在Debian/Ubantu Linux下直接通過apt安裝:

Max和其他版本的Linux可以直接使用easy_install或pip安裝,安裝前需要把編譯環境裝好:

Windos平臺可以直接去PIL官網下載exe安裝包。http://pythonware.com/products/pil/

注:官網提供的安裝包是32位的,63位系統請前往這裡 http://www.lfd.uci.edu/~gohlke/pythonlibs/#pillow 下載替代包pillow。

三、一般思路

驗證碼識別的一般思路為:

1、圖片降噪

2、圖片切割

3、影象文字輸出

3.1 圖片降噪

所謂降噪就是把不需要的資訊通通去除,比如背景,干擾線,干擾畫素等等,只剩下需要識別的文字,讓圖片變成2進位制點陣最好。

對於彩色背景的驗證碼:每個畫素都可以放在一個5維的空間裡,這5個維度分別是,X,Y,R,G,B,也就是畫素的座標和顏色,在計算機圖形學中,有很多種色彩空間,最常用的比如RGB,印刷用的CYMK,還有比較少見的HSL或者HSV,每種色彩空間的維度都不一樣,但是可以通過公式互相轉換。在RGB空間中不好區分顏色,可以把色彩空間轉換為HSV或HSL。色彩空間參見 http://baike.baidu.com/view/3427413.htm

驗證碼圖片7039.jpg:

1、匯入Image包,開啟圖片:

2、把彩色影象轉化為灰度影象。RBG轉化到HSI彩色空間,採用I分量:

灰度看起來是這樣的:

3、二值化處理

二值化是影象分割的一種常用方法。在二值化圖象的時候把大於某個臨界灰度值的畫素灰度設為灰度極大值,把小於這個值的畫素灰度設為灰度極小值,從而實現二值化(一般設定為0-1)。根據閾值選取的不同,二值化的演算法分為固定閾值和自適應閾值,這裡選用比較簡單的固定閾值。

把畫素點大於閾值的設定,1,小於閾值的設定為0。生成一張查詢表,再呼叫point()進行對映。

處理結果看起來是這樣的:143014_RhPx_2463131

3.2 圖片切割

識別驗證碼的重點和難點就在於能否成功分割字元,對於顏色相同又完全粘連的字元,比如google的驗證碼,目前是沒法做到5%以上的識別率的。不過google的驗證碼基本上人類也只有30%的識別率。本文使用的驗證碼例子比較容易識別。可以不用切割,有關圖片切割的方法參見這篇部落格:http://www.cnblogs.com/apexchu/p/4231041.html

四、利用pytesser模組實現識別

pytesser是谷歌OCR開源專案的一個模組,在python中匯入這個模組即可將圖片中的文字轉換成文字。

連結:https://code.google.com/p/pytesser/

pytesser 呼叫了 tesseract。在python中呼叫pytesser模組,pytesser又用tesseract識別圖片中的文字。

4.1 pytesser安裝

  • 如果沒有安裝PIL,請到這裡下載安裝:http://www.pythonware.com/products/pil/
  • 安裝pytesser,下載地址:http://code.google.com/p/pytesser/ ,下載後直接將其解壓到專案程式碼下,或者解壓到python安裝目錄的Libsite-packages下,並將其新增到path環境變數中,不然在匯入模組時會出錯。
  • 下載Tesseract OCR engine:http://code.google.com/p/tesseract-ocr/  ,下載後解壓,找到tessdata資料夾,用其替換掉pytesser解壓後的tessdata資料夾即可。
  • 另外如果現在都是從PIL庫中運入Image,沒有使用Image模組,所以需要把pytesser.py中的import Image改為from PIL import Image, 其次還需要在pytesser資料夾中新建一個__init__.py的空檔案。

ps:如果覺得後面兩步比較麻煩,可以直接到雲盤中下載    http://yun.baidu.com/s/1jHJvNiI ,操作如步驟2。

4.2 呼叫pytesser識別

pytesser提供了兩種識別圖片方法,通過image物件和圖片地址,程式碼判斷如下:

同時pytesser還支援其他語言的識別,比如中文。具體參見:http://blog.csdn.net/hk_jh/article/details/8961449

相關文章