一个简单的验证码识别教程

一、起因

前几天准备做一个自动计算gpa的网站,学校的教务登录时候需要输入验证码。本来想把验证码图片显示出来让用户手动输入,但是搞了半天没搞定。。。所以决定自己写一个识别的程序。

直接说结果吧,最终写好的程序成功率100%(连续测试了200次)。

二、原理

我们先来看一看验证码是什么样的。

如上如,就是这样的一个四位数字。

这样的验证码已经可以算是验证码界最简单的了,没有任何扭曲、变形、干扰线,长着一张“快来识别我!”的脸。那我们就来识别一下吧。

原理很简单,就是通过计算图片相似度来判断。

三、准备工作

准备工作主要做两点,截取数字和计算坐标。

截取数字就是把0~9这十个数字从验证码图片中截取出来,方便后面对比用。需要注意的是,十个数字最好尺寸相同。我是用ps截的,因为这个网站已经做完一段时间了,我就不重新截图了。

计算坐标主要是要确定第一个数字左上角的坐标。因为我们截的数字都是同样尺寸,所以只要确定了第一个数字左上角的坐标就可以算出后面三个数字的坐标了。坐标的计算也是用ps,放大图片之后数一数就行了。。别眼花就肯定能数对

四、代码部分

代码部分,我只给出最关键的相似度计算。我使用的是python。

def hamming_dist(hash1, hash2):
    return sum(itertools.imap(operator.ne, hash1, hash2))


def get_hash(img):
    image = img.resize((9, 13), Image.ANTIALIAS).convert("L")
    pixels = list(image.getdata())
    avg = sum(pixels) / len(pixels)
    return "".join(map(lambda p: "1" if p > avg else "0", pixels))

 get_hash()函数是计算图片的hash值。是把单个像素和平均像素比较,如果大就赋1,如果小就赋0。这样就把一个图片转换成一个二进制串了。

hamming_dist()函数是计算两个二进制串的汉明距离。不明白的可以百度一下,很简单的。

有了这两个函数,我们就可以进行识别了。首先从网页获取验证码图片,然后根据坐标以及尺寸从图片中截取出来四个未知数字,然后每个未知数字都和我们的十个标准数字进行对比,最后取相似度最大,也就是汉明距离最小的那个标准数字。这样就可以判断出来四个数字了。

五、意外之外

实际操作中,我发现识别成功率很低。为什么呢?我保存识别失败的图片进行查看,发现这个验证码有一个特点,就是如果里面出现1的时候,两个数字间的距离就会缩短。这也就意味着我们之前计算的坐标是错的。怎么办呢?我想了一会,发现有1的时候一般坐标会向后移动2~3格,那就好办了,我们先按照默认坐标算一次,然后给他+1再算一次,然后+2.。。最后我们取相似度最大的就行了。

虽然不是最好的解决办法,但是很实用,毕竟是计算机,多算个几次完全没有问题。

最后我决定把最大偏移设置为3,并且考虑到1的位置不固定,我每次计算的时候都会尝试偏移0~3,也就是一个图片计算次数为4(4个数字)*4(0~3一共4次尝试)*10(10个标准数字)。大概就是这样。

六、结论

这次的验证码识别可以说简单当中有一点不简单,解决问题的能力还是很重要的。

转载于:https://www.cnblogs.com/numbbbbb/p/3230523.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用过程注意事项: 1.调用DLL识别库识别,多线程下不需要加许可证,支持并发识别. 2.调用DLL识别,识别参数设置命令SetWmOption必须与你弄字库时候的设置参数一样,不然会导致识别率下降具体参数说明,请看调用例子里的[我的函数.txt]文档有对应参数说明. 3.如果遇见本工具无法识别的验证码,可以找群主(用神经网络识别)定制,价格便宜公道. [2017-07-27] 完美验证码识别系统V3.2 1.增加DLL识别返回方式2和3具体看我的函数.txt里说明,主要是增加一个可以返回识别后的总体信任度.这个值你可以给它个阀值,比如说如果总体信任度小于60,那么你就不提交服务器,直接重新获取图片识别,直到总体信任度大于60你才提交给服务器,这个阀值具体多少,自己可以先测试. 2.修复导出字库没有导出完,直接关闭窗口崩溃问题 3.添加批量下载后定位到批量下载文件夹 4.增加可以使用验证码长度进行过滤,增加可以使用总体信任度进行过滤.(这两个功能可以快速的制作字库,比如说你验证码是4位的,你可以设置验证码小于4,大于4那这张图片肯定是识别错误的,那么软件就会把这张图片保存下来,同理可以使用总体信任度进行此保存) [2017-07-20] 完美验证码识别系统V3.1 1.修复数组下标越界问题 2.字库列表添加可以多选然后右键批量删除选中项 [2017-07-13] 完美验证码识别系统V3.0 1.修复导出字库,重复导出不会覆盖原来的BUG,导出的图片会累加上去(注意,以前导出的字模导入新版中会出错,新版字模导出格式为a_md5.bmp 请自行写个软件修改文件名,然后再导入) 2.修复添加字库空格都可以添加进去 3.修复崩溃问题.(崩溃应该绝大多数都是此原因造成的.) 4.其它一些调整. [2017-06-25] 完美验证码识别系统V2.6 1.解决输入焦点问题. 2.批量下载增加可以过滤掉宽度范围,面积范围,高度范围,黑色数范围,可以去掉没有用的干扰图片. 3.其它的一些细节调整 [2017-06-07] 完美验证码识别系统V2.5 1.修复去除干扰滤镜在没有先二值化图片都可以使用. 2.尝试解决添加字库崩溃问题(代码较多,找到1处问题.不知道还有没有其他问题) 3.编辑字库页面增加个选中框[添加字库后自动下载图片],使用批量下载图片,可以快速添加字库 4.使用截图工具,截取图片后,会自动切换到划线工具. [2017-05-17] 完美验证码识别系统V2.3 1.修复设置滤镜默认都有选择项. 2.修复当使用本地图像时,没有新建项目都可以编辑的问题. 3.修复黑白处理滤镜在没有先二值化图片都可以使用. 4.修复处理很多逻辑错误会导致程序崩溃. 5.增加字库列表添加右键删除当前选中的字库 6.增加禁止重复运行,由于重复运行会导致字库添加失败,和读取不到已经做过的字库. 7.增加快捷键"自动分割(Alt+R)" ,"手动分割(Alt+T)" 8.编辑页面增加个批量下载按钮,可以实现批量下载并自动分割图片功能(批量下载的图片保存在当前项目文件夹下的"批量下载"文件夹中) 9.主窗口增加一个选择框_图像已处理不使用滤镜,由于批量下载后图片都是已经使用过滤镜了,处理批量下载的图片这里必须得勾选上,不然会重复运用滤镜 [2017-05-07] 完美验证码识别系统V2.2 1.新增分辨率1024*768布局 2.修改注册热键方式为本进程方式(原为全局热键,感谢群友XGSoft提供源代码) [2017-05-06] 完美验证码识别系统V2.1(要求屏幕分辨率最低1440*900) 1.去掉窗口最大化,去掉自动调整窗口大小代码,修复部分控件显示不全 2.增加检测图像是否二值化,没二值化的图片不允许编辑 3.尝试解决添加字库崩溃的问题(不确定问题出在哪!!) 4.解决滤波数组越界问题.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值