Python用KNN算法实现验证码识别.doc

Python用KNN算法实现验证码识别.doc

ID:55632092

大小:17.00 KB

页数:8页

时间:2020-05-21

Python用KNN算法实现验证码识别.doc_第1页
Python用KNN算法实现验证码识别.doc_第2页
Python用KNN算法实现验证码识别.doc_第3页
Python用KNN算法实现验证码识别.doc_第4页
Python用KNN算法实现验证码识别.doc_第5页
资源描述:

《Python用KNN算法实现验证码识别.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Python用KNN算法实现验证码识别作为一名爬虫爱好者,把互联网作为数据库的同时总会遇到很多坑,其中一个就是验证码,设置验证码一大理由就是为了限制你乱爬,不过对于很多简单的验证码,破解还是相当容易的。比如类似下面这种。最简单的办法是直接用pytesseract库,具体方法请自行搜索。当然如果不想用它,自己来写一个识别算法也并不难。可以用机器学习里面比较基础的KNN算法。先来介绍一下这个KNN算法,他全称叫K最近邻(kNN,k-NearestNeighbor),所谓K最近邻,就是离谁最近,是谁的可能性就更大。什么意思,举个例子就明白了。我现在已经统计了一组手机数据,方便起见,假设只有高端

2、机和低端机两个分类,如下:此时如果有一个新手机T(1500元,15小时),该怎么判断是什么手机呢?我把它们放到同一个坐标系中去比较一下。它并不能很好地跟已知数据完全重合,但不要紧,可以算一下它与其他手机的距离。经过计算,与T的距离D就是这么简单。当然了,这里面只是举个例子所以数据量比较小,当数据量足够大时,比如有200台低端机和300台高端机,选出最接近的200个数据,其中哪种机器多就归到哪种,得出的结论就会比较准确。这就是最简单的KNN算法,离哪个近,就把它归类为哪个种类。这是二维,还可以再加个“像素”属性,变为三维,仍然可以求最近距离。拓展到N个属性也是一样的道理。基本原理就是这样,

3、下面来介绍如何识别验证码,以下代码基于Python3还是这张验证码,我们把它放大一点可以看到,其实他就是一个一个的像素点构成的。里面颜色太多不好操作,首先把这张图变成黑白的fromPILimportImage#引入Image类im=Image.open('图片路径')#打开图片im=im.convert('1')#原来图片是彩色的,这里把图片转换成模式'1',即黑白的im.show()#显示图片于是我们就得到了这么一张图可以把每个点的颜色转变成0和1,并打印出来foriinrange(im.size[1]):temp=[]forjinrange(im.size[0]):pos=(j,i)

4、col=im.getpixel(pos)#获取某坐标的点的颜色,黑色为0,白色为255,为了显示规程,把它转变成1了ifcol==255:col=1temp.append(col)print(temp)可以从打印出来的字符中隐约看到这几个数字然后处理一下这串字符,把不连续的点,即上下左右都没有同色的点去掉im2=imforiinrange(im.size[1]):forjinrange(im.size[0]):#pos=(j,i)#print(pos)ifi==0orj==0ori==im.size[1]-1orj==im.size[0]-1:im2.putpixel((j,i),255

5、)#图片最外面一周都换成白点elifim.getpixel((j,i))!=im.getpixel((j-1,i))andim.getpixel((j,i))!=im.getpixel((j+1,i))andim.getpixel((j,i-1))!=im.getpixel((j,i))andim.getpixel((j,i+1))!=im.getpixel((j,i)):im2.putpixel((j,i),255)#不连续点也都换成白点然后开始切割图片inletter=Falsefoundletter=Falsestart=0end=0letters=[]#用来记录每个数字的起始位置

6、forxinrange(im2.size[0]):foryinrange(im2.size[1]):pix=im2.getpixel((x,y))ifpix!=255:inletter=True#如果不是白色,这说明已经开始接触到数字了iffoundletter==Falseandinletter==True:foundletter=Truestart=x#数字的起始坐标iffoundletter==Trueandinletter==False:foundletter=Falseend=x-1#数字的结束位置letters.append((start,end))inletter=Fals

7、eletters的值为[(7,14),(20,27),(33,40),(46,54)],就是每个数字的起始X坐标,同样道理获得每个数字的起始Y坐标,然后切割开来。region=(起始X值,起始Y值,结束X值,结束Y值)#裁切图片im3=im2.crop(region)#im3就是这个区域内的图形,也就是提取的数字#im3.show()于是得出了四个切割好的数字这个时候怎么做呢,我们把第一个数字9用0和1来打印看看。[1,1,1,1,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。