基于Python的简单验证码识别

基于Python的简单验证码识别
摘要:验证码在⽹络安全⽅⾯发挥着关键作⽤,验证码的主要⽬的是区分⼈类和计算机,⽤来防⽌⾃动化脚本对⽹站的⼀些恶意⾏为。⽬前绝⼤多数⽹站都利⽤验证码来阻⽌恶意脚本程序的⼊侵。验证码经过图像的预处理字符分割,匹配识别等步骤来完成对字符验证的处理,后进过特征提取与匹配等操作完成对⼀个验证码的识别。本⽂选取了⼀个⽹站进⾏⽹站登录的验证码识别,识别结果取得了预期的效果,较好的识别出了验证码。
关键字:验证码;图像识别;Python;预处理
磁动力Abstrat:CAPTCHA plays a key role in network security, The main purpose of the CAPTCHA is to differentiate between humans and computers, to prevent some malicious behavior from automating scripts on the site. At present, most websites use Authenticode to prevent the intrusion of malicious script programs. The verification code passes the preprocessing character segmentation of the image, the matching recognition and so on completes the processing to the character verification, the backward feature extraction and the matching operation completes to the verification code recognition. In this paper, a website is selected to identify the verification code, the result obtained the expected results, a better identification of the verification code.
Key words:CAPTCHA; Image recognition; Python; Pretreatment;
0.引⾔
验证码是⽬前互联⽹上⼀种⾮常重要⾮常常见的安全识别技术,先引⽤⼀段来⾃wiki的关于验证码的描述:“全⾃动区分计算机和⼈类的公开图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA)[1],俗称验证码,是⼀种区分⽤户是计算机和⼈的公共⾃动程序。在CAPTCHA测试中,作为服务器的计算机会⾃动⽣成⼀个问题由⽤户来解答。这个问题可以由计算机⽣成并判定,但是必须有⼈类才能解答。由于计算机⽆法解答CAPTCHA的问题,所以回答出问题的⽤户就可以被认为是⼈类。”验证码最初是为了防⽌⼀些暴⼒破解的存在,但是后来随着技术的发展,特别是图像识别技术的发展,验证码的识别变的简单,本⽂介绍了⼏种常见且普遍的验证码的识别。
常见的验证码有⼏类,第⼀种四位数字,随机的⼀串数字,⼏乎没有验证作⽤,第⼆种是GIF格式的随机数字图⽚验证码,字符中规中矩,验证效果⼀般。第三种是PNG格式,随机数字+随机⼤⼩写字母,识别难度较⼤。第四种是JPG格式,随机数字+随机颜⾊+随机位置+随机长度,难度较⼤。
1.Python简介
Python是⼀种粘性语⾔,其具有良好的简洁性、易读性以及可维护性。本⽂使⽤的PIL库是Python的⼀种图形识别库。
Python是纯粹的⾃由软件,源代码和解释器CPython遵循GPL(GNU General Public license)协议。Python语法简洁清晰,特⾊之⼀是强制⽤空⽩符作为语句缩进。
Python具有丰富和强⼤的库。它常被昵称为能够把⽤其他语⾔制作的各种模块(尤其是/)很轻松地联结在⼀起。常见的⼀种应⽤情形是,使⽤Python快速⽣成程序的原型(有时甚⾄是程序的最终界⾯),然后对其中有特别要求的部分,⽤更合适的语⾔改写,⽐如中的图形渲染模块,性能要求特别⾼,就可以⽤重写,⽽后封装为Python可以调⽤的扩展类库。需要注意的是在您使⽤扩展类库时可能需要考虑平台问题,某些可能不提供的实现。
Python的设计哲学是“优雅”、“明确”、“简单”。因此,中“总是有多种⽅法来做同⼀件事”的理念在Python开发者中通常是难以忍受的。Python 开发者的哲学是“⽤⼀种⽅法,最好是只有⼀种⽅法来做⼀件事”。在设计Python语⾔时,如果⾯临多种选择,Python开发者⼀般会拒绝花俏的语法,⽽选择
明确的没有或者很少有歧义的语法。由于这种设计观念的差异,Python源代码通常被认为⽐Perl具备更好的可读性,并且能够⽀撑⼤规模的软件开发。这些准则被称为Python格⾔。在Python内运⾏import this可以获得完整的列表。
Tesseract,⼀款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎,与Microsoft Office Document Imaging(MODI)相⽐,我们可以不断的训练的库,使图像转换⽂本的能⼒不断增强;如果团队深度需要,还可以以它为模板,开发出符合⾃⾝需求的OCR引擎。Tesseract算法分为下列⼏个步骤:
轮廓分析:⽂本图像中含有许多字符,在OCR识别前,⾸先需要给每个字符标记有效边界,即:轮廓。它采⽤了⼀种嵌套的轮廓搜索算法,不仅搜索轮廓本⾝,还搜索嵌套轮廓的轮廓。最后将分析所得的轮廓组合成⽂本块。
uc3907
⽂本块被划分:顾名思义将图像划分成若⼲⾏,将⽂本⾏分割成字符。
特征提取,进⾏第⼀次识别,再次识别上次认错的字符,当识别率达到设定的阈值时进⾏下⼀步。无线存储
语⾔分析:利⽤词义、词频、语法规则或语料库等语⾔先验知识识别结果进⾏校正,提⾼识别率。
这个OCR识别技术有着积极的应⽤场景:银⾏卡的识别、⾝份证识别、车牌号码识别等。这些场景具有和⽂本研究素材很相似的特点:字体单⼀、字符较为简单的数字或字母组合、⽂字的排列是标准统⼀化的,所以在获取原始数据⽐较规范的情况下,识别起来的难度也是不⼤的。
3.识别模型
3.1基本模型
验证码识别的模型⼤致可以分为以下阶段:1)图⽚收集;2)图⽚预处理;3)图⽚字符切割;4)图⽚尺⼨归⼀化;5)图⽚特征提取匹配。图1简单描述了整个模型的流程[2]。
3.2图⽚收集
识别验证码之前,⾸先需要收集验证码,图2是常见的⼏种验证码,是从⼀些⽹站上获取验证码原图下载下来。这些验证码分为⼏种,第⼀是背景单⼀,随机四位数字;第⼆种是背景模糊,灰度值有所变化;第三种是随机颜⾊,随机位置随机数字;第四种是随机数字,随机字母,随机位置的验证码。这些验证码获取到后要对彩⾊图像进⾏灰度转化,然后进⾏去噪等预处理。
3.3预处理
⼀般的图像处理的定义是将⼀个⽂字图像分拣出来交给识别模块识别,这⼀过程称为图像预处理。在图像分析中,对输⼊图像进⾏特征抽取、分割和匹配前所进⾏的处理。
预处理的主要⽬的是消除图像中⽆关的信息,恢复有⽤的真是信息,增强有关信息的可检测性和最⼤限度地简化数据,从⽽改进特征抽取、图像分割、匹配和识别的可靠性。
针对于上述的原始素材,我们预处理的过程是将彩⾊图⽚先转化为灰度化,则彩⾊表⽰⼀种灰度颜⾊,其中R=G=B的值叫,因此,灰度图像每个像素只需⼀个字节存放灰度值(⼜称强度值、亮度值),灰度范围为0-255。⼀般常⽤的是加权平均法来获取每个像素点的灰度值,并且设置相应的阈值来判定图像。然后进⾏图像⼆值化,所谓图像的⼆值化处理就是将图像上的点的灰度值化为0到255的范围,将整个图像呈现出⿊⽩的效果。即将256个灰度等级的灰度图像通过适当的阈值选取⽽获得仍然可以反映整体和局部特征的⼆值化图像。
设原始灰度图像为发f(x, y),⼆值化处理后的图像为g(x, y)则⼆值化过程可以表⽰为
式中f(x, y)是原始图像坐标为(x,y)的点的像素值,g(x,y)是⼆值化处理后的改点的像素值,0表⽰⿊⾊,255表⽰⽩⾊。在实际处理中,进⾏图像⼆值化处理的关键是要确定合适的阈值,使得字符与背景能够分离出来。
进⾏⼆值化后,图像还存在⼀些噪点,下⼀步的⼯作就是清除噪点,我们平常常见的降噪算法⼀般都是⼀些滤波算法,这⾥要⽤的是均值滤波法,这是⼀种局部空间域处理的算法。我们假设⼀副图像f(x,y)为NxN的矩阵,处理后的图像为g(x,y),它的每个像素的灰度级由包含(x,y)邻域的⼏个像素的灰度的平均值所决定,可以⽤下⾯的公式处理后得到图像。
式中x,y=0,1,2……,N-1;s是以(x,y)点为中⼼的邻域的集合,M是s内坐标总数。图像邻域,这种算法的处理效果与所⽤的邻域半径有关。半径越⼤,则图像模糊程度也越⼤。
为了减少模糊程度,我们把邻域选为8。如下图所⽰,
采⽤矩阵表⽰如下,假设转化后的⼆值化图像中,⽩⾊部分⽤0表⽰,⿊⾊部分有1表⽰,对于噪⾳点,我们判断该点和相邻的⼏个像素点的差异性。这些像素点按照位置不同,还可以分成三类1)顶点
A;2)⾮顶点的边界点B;3)内部点C。种类如下图所⽰。便携式鱼缸
1):A类点需要计算周边及相邻的3个点。
2):B类点需要计算周边及相邻的5个点。
3):C类点需要计算周边及相邻的8个点。
经过我们处理后可以去除⼤部分噪声。
穴盘
3.4字符切割
图像的字符分割是在上⼀步图像⼆值化后的下⼀个步骤,是将验证码图像中的字符单独分离出来。字符切割的⽬的是为下⼀步字符匹配识别等做准备。这⾥采⽤的是上下轮廓投影法相结合的⽅法。其原理:⾸先利⽤⽔平、竖直投影法到⼆值化后的的验证码图像中字符的边界,确定边界后,再进⾏图像阈值分割。[3]      图像阈值分割是⼀种⼴泛应⽤的分割技术,其特点是操作简单,分割结果是⼀系列连续区域。灰度图像的阈值分割⼀般基于如下假设:图像⽬标或背景内部的相邻像素间的灰度值是⾼度相关的,⽬标与背景之间的边界两侧像素的灰度值差别很⼤,图像⽬标与背景的灰度分布都是单峰的。如要图像⽬标与背景对应的两个单峰⼤⼩接近、⽅差较⼩且均值相差较⼤,则该图像的直⽅图具有双峰性质[4]。阈值化常可以有效分割具有双峰性质的图像。
3.5图⽚尺⼨归⼀化飞羽辅助
在进⾏图像切割后,得到了原来图像的⼏个单个的图⽚,但是由于我们是根据原图边缘切割的,切割出来的图像有⼤有⼩,需要我们对这些图像进⾏尺⼨的归⼀化,便于后期对图⽚的识别。[5]
3.6图⽚特征提取匹配
以形状特征检索图像⽬标效果都是⾮常理想的,当前对其的研究主要体现在以下⼏⽅⾯;第⼀,基于形状特征实现检索,虽然理论上说得通,但是实践上还缺少较为系统的数学模型作为⽀撑;第⼆,当检索⽬标出现变化时,检索的结果并不是很理想;第三,⼤部分的形状特征,只是对检索⽬标局部性质的体现,仍⽆法区分出检索⽬标的综合属性,且要增加计算时间等。[6]
常⽤的特征提取⽅法包括两种:即通过图像分割,对⽬标、颜⾊区域等进⾏有效的划分,以此为基础构建索引。还有⼀种将图像划分,针对于不同划分区域进⾏特征提取,最后构建索引。
尺度不变特征转换,是常⽤的⼀种图像特征提取⽅法,其算法的步骤主要包括以下⼏点:⼀是对尺度空间进⾏构建,对极值点进⾏检测,继⽽得到其尺度不变性属性;⼆是对于特征点进⾏有效过滤,然后通过⾼效的定位,对不稳定的特征点进⾏排除;三是获取特征点的描述符,并在其基础上进⾏⽅向值的分配;四是获取特征描述⼦,然后在描述符的基础上出匹配点。其中描述⼦的获取⽅法主要为在特征点的基础上,将16*16的领域,当作是采⽤窗⼝,然后将采样点、特征点组成的相对空间,利⽤⾼斯加权,然后将其纳⼊到8个bin的直⽅图,最终获得描述⼦。
本⽂采⽤模板匹配法,先提取样本的n维特征,在提取待识别字符的n维特征,对照产⽣结论。算法采⽤欧式距离。即经过计算待识别字
符的特征向量与模板库中提取的特征向量之间的欧式距离,取模板中与计算出的欧式距离最⼩的作匹配,将匹配字符输出。
4.实验及结果
本论⽂实验验证的环境是Python环境,需要导⼊PIL(Python Imagine Library)图像处理库,其功能⾮常强⼤。
4.1 字符验证码的识别
本论⽂中选取的实验对象的验证码是从⽹络上选取下载下来的,是
现在⽐较流⾏的⼏种验证码,⽐较简单的是随机数字,背景、颜⾊单⼀的验证码,⽐较复杂的是随机数字+随机位置+随机颜⾊+随机字母的验证码,本论⽂中使⽤Python都对其进⾏了识别,识别结果如下:
我们可以看到,4张验证码中有3张是可以正确识别的,对最后⼀张的随机数字+随机位置+随机颜⾊+随机字母的验证码识别率较低。
4.2
本实验访问了全国道路货运车辆公共监管与服务平台,轻易的拿到了验证码地址。通过地址下载验证码图⽚资源进⾏识别。获取到的验证码如下图,
识别情况如下:

本文发布于:2024-09-23 00:21:31,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/219763.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   识别   验证码   字符   灰度   特征   分割   处理
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议