最新文章:

首页 Ops

使用Python进行验证码识别

发布时间:2016年04月16日 评论数:2 阅读数:1497

    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安全播报”,并附上链接。

二维码加载中...
本文作者:Mr.linus      文章标题: 使用Python进行验证码识别
本文地址:http://www.90qj.com/328  百度暂未收录本文
版权声明:若无注明,本文皆为“挨踢 Blog”原创,转载请保留文章出处。
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论
sss
sss2016-04-18 11:46回复
#1
刚刚
怎样炒股
怎样炒股2016-10-28 23:33回复
@sss:好久没来了,过来踩踩