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」。

相关文章
相关标签/搜索