0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python 只需20行代码即可实现验证码识别

马哥Linux运维 来源:未知 作者:李建兵 2018-03-16 15:23 次阅读

一、探讨

识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习机器视觉人工智能等等高深领域……

简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正。对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等。

在破解验证码中需要用到的知识一般是 像素,线,面等基本2维图形元素的处理和色差分析。常见工具为:

支持向量机(SVM)

OpenCV

图像处理软件(Photoshop,Gimp…)

Python Image Library

二、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。

三、一般思路

验证码识别的一般思路为:

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包,打开图片:

fromPIL importImage

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

2、把彩色图像转化为灰度图像。RBG转化到HSI彩色空间,采用I分量:

imgry = im.convert('L')

imgry.show()

灰度看起来是这样的:

3、二值化处理

二值化是图像分割的一种常用方法。在二值化图象的时候把大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,从而实现二值化(一般设置为0-1)。根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值,这里选用比较简单的固定阈值。

把像素点大于阈值的设置,1,小于阈值的设置为0。生成一张查找表,再调用point()进行映射。

threshold = 140

table = []

foriinrange(256):

ifi < 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

四、利用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对象和图片地址,代码判断如下:

fromPIL importImage

frompytesser importpytesser

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

printpytesser.image_file_to_string('7039.jpg')

printpytesser.image_to_string(image)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68323
  • python
    +关注

    关注

    55

    文章

    4778

    浏览量

    84439

原文标题:20行 Python 代码实现验证码识别

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    无法验证邮箱,总是提示验证码错误,验证码明明是正确的。

    `无法验证邮箱,总是提示验证码错误,验证码明明是正确的。是不是系统的bug?`
    发表于 05-12 10:41

    平台是如何高效的破解市面上各家验证码平台的各种形式验证码的?

    验证码与打平台的对抗讲起。何为打平台?打平台的基本原理是利用人工智能技术实现验证码设计原
    发表于 11-01 15:21

    【国民技术N32项目移植】手机验证码项目移植4--手机验证码计算

    ,同时看到device_id的第4个数就是验证码中的第4个数。四 在windows平台计算验证码如下图,把同样的TOTP算法代码移植到到windows平台,编译后,同一时间计算的验证码
    发表于 02-24 14:45

    搜狗开放12306验证码识别技术助力抢票软件

    12306的验证码,已经击败了全国99%的购票者,我已经找不到回家的路了随着春运抢票高峰期来临,12306验证码识别成为用户讨论的热点。日前,搜狗浏览器、QQ浏览器等应用相继推出抢票功能,帮助用户秒
    发表于 10-13 16:21 1次下载

    多样变换的手写验证码自动识别算法

    提出了一种多样变换的手写验证码自动识别算法,对彩色验证码进行识别主要包括彩色验证码的二值化、手写字符的区域分割、同一字符的区域连接、使用卷积
    发表于 12-20 14:14 0次下载

    一套基于GAN的验证码AI识别系统,能在0.5秒之内识别验证码

    近日,英国兰卡斯特大学、中国西北大学、北京大学的计算机科学家们共同开发了一种AI系统,能够在短短0.5秒内识别出多种验证码。该系统已在不同的33个验证码系统中进行了成功测试,其中11个来自世界上最受欢迎的一些网站,包括eBay和
    的头像 发表于 12-16 10:02 5009次阅读

    以一个真实网站的验证码为例,实现了基于一下KNN的验证码识别

    很多网站登录都需要输入验证码,如果要实现自动登录就不可避免的要识别验证码。本文以一个真实网站的验证码为例,
    的头像 发表于 12-24 17:27 7746次阅读

    如何使用Python机器学习解决验证码的资料说明

    写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种: 图像类 滑动类 点击类 语音类
    的头像 发表于 05-03 13:43 2283次阅读

    验证码层出不穷?试试这个自动跳过验证码的工具

    目前网络上越来越多使用验证码了,验证码的本意是阻止机器刷流量挤占服务器资源,这本来无可厚非;但是验证码已经变得越来越过分,别说机器人了,连人也经常没法辨认!这就相当烦了,特别是被广泛使用更多
    的头像 发表于 11-15 10:42 5916次阅读

    爬虫实现目标网站验证码登陆

    在爬虫访问目标网站的过程中,很多网站为了避免被恶意访问,需要设置验证码登录,这样是为了避免非人类的访问。今天我们学习下如何使用Python爬虫实现验证码登录并且将生成的
    发表于 12-11 15:27 2407次阅读

    带带弟弟OCR通用验证码识别SDK免费开源版

    在使用爬虫登录网站的时候,经常输入用户名和密码后会遇到验证码,简单一点的有字母验证码,复杂一点的有滑块验证码,点选文章和点选图片验证码。这些都是爬虫中的老大难问题,今天介绍一款通用
    的头像 发表于 03-30 17:26 4608次阅读

    burpsuit验证码爆破教程

    填写验证码识别接口,这里有百度的可以用,但是有次数限制,需要修改为自己的token,不推荐,但是如果想使用,只需要在接口的大框框里右键--模板库--百度,点击,就会自动填充百度ocr的模板
    的头像 发表于 05-11 11:09 1565次阅读
    burpsuit<b class='flag-5'>验证码</b>爆破教程

    验证码到底在验证啥?聊一聊验证码是怎么为难我们人类的

    在文章开头,老狐先给大家玩一个验证码的游戏,猜出图中验证码字母。
    的头像 发表于 08-12 10:25 2039次阅读
    <b class='flag-5'>验证码</b>到底在<b class='flag-5'>验证</b>啥?聊一聊<b class='flag-5'>验证码</b>是怎么为难我们人类的

    Java 中验证码的使用

    今天我们讲一下在 Java 中验证码的使用。 验证码生成 本效果是利用easy-captcha工具包实现,首先需要添加相关依赖到pom.xml中,代码如下: com .github.w
    的头像 发表于 09-25 11:11 979次阅读
    Java 中<b class='flag-5'>验证码</b>的使用

    SpringBoot分布式验证码登录方案

    传统的项目大都是基于session交互的,前后端都在一个项目里面,比如传统的SSH项目或者一些JSP系统,当前端页面触发到获取验证码请求,可以将验证码里面的信息存在上下文中,所以登录的时候只需要 用户名、密码、
    的头像 发表于 10-12 17:34 685次阅读
    SpringBoot分布式<b class='flag-5'>验证码</b>登录方案