python验证码识别算法_Python网站验证码识别

python验证码识别算法_Python⽹站验证码识别
0x00 识别涉及技术
验证码识别涉及很多⽅⾯的内容。⼊⼿难度⼤,但是⼊⼿后,可拓展性⼜⾮常⼴泛,可玩性极强,成就感也很⾜。
验证码图像处理
验证码图像识别技术主要是操作图⽚内的像素点,通过对图⽚的像素点进⾏⼀系列的操作,最后输出验证码图像内的每个字符的⽂本矩阵。
读取图⽚
图⽚降噪
辐照杀菌设备图⽚切割
图像⽂本输出
验证字符识别
验证码内的字符识别主要以机器学习的分类算法来完成,⽬前我所利⽤的字符识别的算法为KNN(K邻近算法)和SVM (⽀持向量机算法),后⾯我 会对这两个算法的适⽤场景进⾏详细描述。触摸笔
获取字符矩阵
矩阵进⼊分类算法
输出结果
涉及的Python库
这次研究主要使⽤了以下这三个库
numpy(数学处理库)
Image(图像处理库)
ImageEnhance(图像处理库)
验证码识别技术难点
验证码识别由两部分组成,分别是验证码图⽚处理和验证码字符学习。
在编码过程中,我认为难度最⼤的部分是识别算法的学习和使⽤。
在写⽂档的时候,我认为难度最⼤的部分是图像处理部分,图像处理部分需要对抗各种⼲扰因素,对抗不同类型的验证码需要不同的算法⽀持,因此图像处理程序需要对各种验证码具体问题具体分析,不能抱有⼤⽽全的思想,务必注重细节处理。
0x01 学习与识别
验证码识别的过程分为学习过程与识别过程
学习
识别
上图代码运⽤的是SVM的识别过程
0x02 图像处理
验证码图像处理脑图
如上图所⽰,验证码图像处理模块是⼀个结构规整、内部分⽀复杂的模块,整个验证码识别准确率全
端子板外部接线靠这个模块,可谓是整个验证码识别的根本。如 上⽂所说,图像处理模块玩的是图⽚内的每⼀个像素百度百科:像素,因此这个模块好上⼿。
上⾯这两句便可以打开⼀个图像对象,im对象内置许多⽅法有兴趣可以查看Image库源码或者参考Python Imaging Library Handbook 图⽚增加对⽐度、锐化、调整亮度、⼆值化,这四块是⽐较规整的模块,处理调⽤库函数即可。下⾯主要说说图⽚降噪和清楚单像素⼲扰线。
图⽚清除噪点
图⽚降噪的原理是利⽤9宫格内信息点(信息像素,⼀般经过预处理的信息像素为⿊⾊)。
上图⿊⾊部分为(x,y),单像素噪点处理时分别验证周围的⼋个点是否为⽩⾊,如果为⽩⾊即可判断(x,y)为噪点。同理双像素噪点需要考虑两个像 素的排列是横向还是纵向或者是斜向,之后判断其周围10个像素是否均为⽩⾊像素即可。同理三像素噪点也是这样,我尝试的情况三像素噪点不包括 横向排列和纵向排列。
图⽚清除⼲扰线
对于单像素的⼲扰线⽬前可以解决,但是⼤宽度⼲扰线则会产⽣判断上的误差,⽬前不好解决。
分布式存储数据保护
上图的⼲扰线为单像素,因此通过算法即可解决。
⼲扰线处理后的图⽚如上图所⽰。
图⽚切割
对于去噪后的图⽚,我们需要对图⽚进⾏切割,切割的⽬的是为了提取信息,⽅便把图⽚中的数字转化为01形式的⽂本。 我所采⽤的切割⽅式是投影法.
如上图所⽰,对于切割数字3,⾸先需要到垂线A和B,判断步骤是:纵向从左向右扫描图⽚,到第⼀条含有信息点的直线记为A,继续向右扫描,当从A开始,到第⼀条⽆信息点的直线记为B,从投影的⾓度来看,A与B之间X轴上的投影的信息值均⼤于0,切割A与B之间的图像后,以新图像为 基础,出C与D,⾄此便可切割出数字3。
图⽚切割⽬前可以仅可对⾮粘连字符进⾏切割,对于粘连字符,我的程序并没能很好的处理。
信息输出
当获取了切割好的图⽚,由于图⽚只有⿊⾊与⽩⾊,因此遍历每⼀个像素点,根据像素点的颜⾊来进⾏0,1输出,⼀般认为⿊⾊像素输出1,⽩⾊像素 输出0。
0x03 识别算法概述
字符识别算法整体流程很好理解,举个例⼦,字符像素⽂本A进⼊识别算法,通过对算法的结果进⾏判断,便可以完成识别过程。我实践了两种识别算 法,第⼀种是KNN算法,第⼆种是SVM算法,下⾯我将以个⼈的⾓度来阐述下这两种算法的原理以及适⽤场景,个⼈⽔平有限,算法细节可以参考我 之后给出的链接。
KNN(K邻近算法)
KNN算法是⼀种简单的算法,KNN算法基本思想是把数据转化为点,通过计算两点之间的距离来进⾏判断。 在n维度下,两点间距离可以表⽰为S = math.sqrt((x1-y1)^2+(x2-y2)^2+.+(xn-yn)^2)。
SVM(⽀持向量机)
热冲击
SVM算法相⽐较KNN算法来说,原理上要复杂复杂的多,SVM算法基本思想是把数据转化为点,通过把点映射到n维空间上,通过n-1维的超平⾯切割,到最佳切割超平⾯,通过判断点在超平⾯的哪⼀边,来判断点属于哪⼀类字符。
但是SVM算法的特点只能在两类中间⽐较,因此把字符识别运⽤到该算法上,还需要在⽐较过程中加以⼀个遍历算法,遍历算法可以减少⼤量⽆效计 算,遍历的场景是⼀个有向⽆环图。
算法细节⽂档链接
jerrylead 的blog : Machine Learning
⽀持向量机通俗导论(理解SVM的三层境界)
0x04 识别算法适⽤场景
门铃电路
K NN与SVM的适⽤场景存在⼀定区别。
KNN算法在运⾏过程上来说,并不存在学习过程,只是遍历已知分类进⾏距离上的判断,根据待测数据与已知分类进⾏⽐较,出与待测距离最近的n个数据来进⾏匹配,因此当已分类的样本越来越多,KNN算法的运算时间会越来越长。
SVM算法在运⾏过程中,是存在学习的过程的,通过对已知分类标签进⾏两两组合,出每个组合的切割⽅程。待测数据只需要⼀个⼀个计算切割⽅程,根据切割⽅程的返回值来判断下⼀个执⾏的是哪个⽅程即可。0-9数字的判断,只需要执⾏9次⽅程计算即可。SVM多类分类⽅法
因此如果⼤规模识别验证码,我建议适⽤SVM作为识别算法。
0x05 实践细节注意事项
这部分内容是我所遇到的问题。
规则化图像
当切割的验证码以数字呈现在⽂本⾥,他们的像素是各不相同的,需要把这些标准化,我选择标准化在27*30像素是⼀个经验值。此外,还需要把新图 像放置在标准化像素的正中央。
使⽤SVM构建超平⾯⽅程
SVM算法的重点是寻切割⽅程,⾸先需要把待判断的两种元素存⼊到dataArr和labelArr中,通smoP⽅程寻b和alphas。
利⽤⽅程组预测——遍历dag图
由于svm是⼆分类器,只能判断是或者不是,只需要使⽤k⼀1个决策函数即可得出结果,不存在误分、拒分区域;另外,由于其特殊的结构,故有⼀定的容错性,分类精度较⼀般的⼆叉树⽅法⾼。
对于0123456789 共10个字符 共有45种⾮重复组合。利⽤dag只需判断9次即可出⽬标。
0x06 实践总结
运⽤机器学习算法时,如果不理解实现原理,先直接套接⼝,总之先实现功能,不必强求对算法的彻底理解。 2. 识别算法是通⽤的。
处理不同验证码,应该有不同的处理策略。
测试发现,主要耗时发⽣在构建⽅程过程中,构建⽅程耗时105s,识别1s。
图像去噪时对于⼤宽度的⼲扰线没有好的解决办法(⼲扰线宽度⼤于3像素)。 6. 图像切割在⾯临图像粘连时,⽬前⽆很好的处理⽅法。

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

本文链接:https://www.17tex.com/tex/3/219100.html

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

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