Python 代碼實現驗證碼識別

Python 代碼實現驗證碼識別

測試開發社區  1周前html

                                                                                                   

源 /  j_hao104  python

1、探討算法

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

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

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

  • 支持向量機(SVM)學習

  • OpenCV測試

  • 圖像處理軟件(Photoshop,Gimp…)google

  • Python Image Library人工智能

2、PIL安裝

PIL:Python Imaging Library, 是Python平臺的圖像處理標準庫,功能很是強大。

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

$sudo apt-get install python-imaging

 

Max和其餘版本的Linux能夠直接使用easy_install或pip安裝,安裝前須要把編譯環境裝好:

$ sudo easy_install PIL

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

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

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:

一、導入Image包,打開圖片:

from PIL import Image

im = Image.open('7039.jpg')

 

二、把彩色圖像轉化爲灰度圖像。RBG轉化到HSI彩色空間,採用I份量:

imgry = im.convert('L')

imgry.show()

灰度看起來是這樣的:

三、二值化處理

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

把像素點大於閾值的設置,1,小於閾值的設置爲0。生成一張查找表,再調用point()進行映射。

threshold = 140

table = []

for i in range(256):

    if i < threshold:

        table.append(0)

    else:

        table.append(1)

out = imgry.point(table, '1')

out.show()

 

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

3.2 圖片切割

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

4、利用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對象和圖片地址,代碼判斷以下:

from PIL import Image

from pytesser import pytesser

image = Image.open('7039.jpg')

print pytesser.image_file_to_string('7039.jpg')

print pytesser.image_to_string(image)

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

-END-

轉載聲明:本文選自「   j_hao104」。

相關文章
相關標籤/搜索