当前位置: 首页 > 运维技术 > 正文

使用Python进行验证码识别

Mr.linus 发表于2016年4月16日 20:41

http://p8.qhimg.com/t012344eb6d20b234fe.jpg

验证码(CAPTCHA,“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写)是一种询问-响应测试,用来判断用户是否是人类。验证码主要用于注册或登陆页面。在这篇文章中,我们会谈谈如何用Python进行在线验证码的识别。

验证码


我们需要用到光学字符识别技术( Optical Character Recognition (OCR)),所谓OCR,就是一种对图像中的文本进行扫描识别之后转换成纯文本的技术。这使得你可以使用代码读取识别出的验证码纯文本并且进行自动提交,就像正常人提交验证码一样。在Linux下,Tesseract是最常用的OCR识别引擎。

首先,我们需要安装tesseract OCR ,我们使用这条命令进行安装:

1
sudo apt-get install tesseract-ocr

要使用Tesseract,首先需要准备好图像

Tesseract对常规输入图像格式不太友好,它接受TIFF格式的图像,而对于处理压缩TIFF格式非常复杂,这同样适用于灰度和彩色图像。因此,你最好准备好未压缩的TIFF图像。

解析验证码图像


以下是样品,我们使用的是这种规范的图像。你可以复制这些图像然后保存到名为“capat”(或者任何你喜欢的名字)的文件夹里

http://p2.qhimg.com/t012e0b2f8fed8e77e5.jpg

http://p9.qhimg.com/t0122bd599a43b72a4e.jpg

http://p7.qhimg.com/t0153adca3ac7bc8bc4.jpg

http://p4.qhimg.com/t0199e0b852b0023a3e.jpg

http://p6.qhimg.com/t017991fa3c39f34a16.jpg

以上这些图像有如下特点:

所有图片只包含四个数字

没有英文字母

数字颜色是黑色

没有旋转的数字

所有数字都在同一行

然后你可以使用GIMP处理这些图像,操作非常简单:

1.在图像->模式菜单中确定图片出于RGB或者灰度模式

2.在工具->颜色工具->阈值中选择一个合适的阈值

3.在图像->模式->索引中选择1bit,这里是必须的。

4.保存图像为.tif扩展名的TIFF图像

关于GIMP的相关信息,比如如何安装和如何使用它,可以转到这里https://help.ubuntu.com/community/TheGIMP

使用GIMP对图像处理后,干扰就被去除掉了,OCR可以轻易识别处理后的文件中的数字。另外对于阈值的调整也使得我们得到了下面这样清晰的图像:

http://p8.qhimg.com/t01c66de73d41683624.png

现在,我们准备用OCR识别图像中的数字并且进行输出,因为我们需要对图像进行前期的处理,我们可以使用脚本来简化工作,使用脚本将原始图像自动转化为TIFF图像,我们创建了一个名为cap.py的Python脚本,代码如下:

(“capat”是你存放原始图像文件的目录,“check”是存放处理后输出文件的目录)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python
# coding=utf-8
from PIL import Image
import os
import time
def captcha():
    getlist = os.listdir("capat/")
    print getlist
    number = int(len(getlist))
    for cap in range(1, number + 1):
        print convert(str(cap))
def convert(cap_name):
    img = Image.open("capat/" + cap_name + '.jpg')
    img = img.convert("RGB")
    pixdata = img.load()
    for in xrange(img.size[1]):
        for in xrange(img.size[0]):
            if pixdata[x, y][0] < 90:
                pixdata[x, y] = (000255)
    for in xrange(img.size[1]):
        for in xrange(img.size[0]):
            if pixdata[x, y][1] < 136:
                pixdata[x, y] = (000255)
    for in xrange(img.size[1]):
        for in xrange(img.size[0]):
            if pixdata[x, y][2] > 0:
                pixdata[x, y] = (255255255255)
    ext = ".tif"
    img.save("check/" + cap_name + ext)
    command = "tesseract -psm 7 check/" + cap_name + ".tif " + "text_captcha"
    os.system(command)
    time.sleep(1)
    Text = open("text_captcha.txt""r")
    decoded = Text.readline().strip('\n')
    if decoded.isdigit():
        print '[+}CAPTCHA number are ' + decoded
    else:
        print '[-] Error : Not able to decode'
captcha()

在上面的代码中,captcha函数用于加载图像。之后convert函数把它转换成RGB模式,之后使用了三次循环处理图像,使得图像中的数字更容易识别,背景干扰也被清理。然后将它保存成tif格式文件后使用tesseract进行识别并保存到文件中。图像处理完毕后会将结果进行输出。

现在我们运行这个脚本,使用如下命令:

1
$ python cap.py

之后你会在输出目录check中发现处理后的干净图像。并且OCR识别结果也会显示到终端。

http://p4.qhimg.com/t0155cd9b6239452e33.png

以上就是我们要讲的内容,希望你能够理解这些概念,然后使用Python帮助你做其他有趣的事情。

本文由 360安全播报 翻译,转载请注明“转自360安全播报”,并附上链接。

全文完
本文标签: Python验证码
本文标题: 使用Python进行验证码识别
本文链接: http://www.90qj.com/m/?post=328

〓 随机文章推荐

共有4719阅 / 2我要评论
  1. @sss:好久没来了,过来踩踩
  2. sss沙发
    刚刚

发表你的评论吧返回顶部

!评论内容需包含中文


请勾选本项再提交评论