Python用KNN算法实现验证码识别
更新时间:2023-11-22 18:53:01 阅读量: 教育文库 文档下载
Python用KNN算法实现验证码识别
作为一名爬虫爱好者,把互联网作为数据库的同时总会遇到很多坑,其中一个就是验证码,设置验证码一大理由就是为了限制你乱爬,不过对于很多简单的验证码,破解还是相当容易的。比如类似下面这种。最简单的办法是直接用pytesseract库,具体方法请自行搜索。当然如果不想用它,自己来写一个识别算法也并不难。可以用机器学习里面比较基础的KNN算法。
先来介绍一下这个KNN算法,他全称叫K最近邻(kNN,k-NearestNeighbor),所谓K最近邻,就是离谁最近,是谁的可能性就更大。什么意思,举个例子就明白了。 我现在已经统计了一组手机数据,方便起见,假设只有高端机和低端机两个分类,如下:此时如果有一个新手机T(1500元,15小时),该怎么判断是什么手机呢?我把它们放到同一个坐标系中去比较一下。它并不能很好地跟已知数据完全重合,但不要紧,可以算一下它与其他手机的距离。经过计算,与T的距离D就是这么简单。当然了,这里面只是举个例子所以数据量比较小,当数据量足够大时,比如有200台低端机和300台高端机,选出最接近的200个数据,其中哪种机器多就归到哪种,得出的结论就会比较准确。这就是最简单的KNN算法,离哪个近,就把它归类为哪个种类。这
是二维,还可以再加个“像素”属性,变为三维,仍然可以求最近距离。拓展到N个属性也是一样的道理。基本原理就是这样,下面来介绍如何识别验证码,以下代码基于Python3 还是这张验证码,我们把它放大一点可以看到,其实他就是一个一个的像素点构成的。
里面颜色太多不好操作,首先把这张图变成黑白的from PIL import Image#引入Image类
im = Image.open('图片路径')#打开图片
im=im.convert('1')#原来图片是彩色的,这里把图片转换成模式'1',即黑白的 im.show()#显示图片
于是我们就得到了这么一张图
可以把每个点的颜色转变成0和1,并打印出来for i in range(im.size[1]): temp=[]
for j in range(im.size[0]): pos=(j,i)
col=im.getpixel(pos)
#获取某坐标的点的颜色,黑色为0,白色为255,为了显示规程,把它转变成1了 if col==255: col=1
temp.append(col) print(temp)
可以从打印出来的字符中隐约看到这几个数字
然后处理一下这串字符,把不连续的点,即上下左右都没有同色的点去掉 im2 = im
for i in range(im.size[1]): for j in range(im.size[0]): #pos=(j,i) #print(pos)
if i==0 or j==0 or i==im.size[1]-1 or j==im.size[0]-1:
im2.putpixel((j,i),255)#图片最外面一周都换成白点
elif im.getpixel((j,i))!=im.getpixel((j-1,i)) and im.getpixel((j,i))!=im.getpixel((j+1,i)) and im.getpixel((j,i-1))!=im.getpixel((j,i)) and im.getpixel((j,i+1))!=im.getpixel((j,i)):
im2.putpixel((j,i),255)#不连续点也都换成白点
然后开始切割图片 inletter = False
foundletter = False start = 0 end = 0
letters = []#用来记录每个数字的起始位置
for x in range(im2.size[0]): for y in range(im2.size[1]): pix = im2.getpixel((x, y)) if pix != 255:
inletter = True#如果不是白色,这说明已经开始接触到数字了
if foundletter == False and inletter == True: foundletter = True start = x#数字的起始坐标
if foundletter == True and inletter == False: foundletter = False end = x-1#数字的结束位置 letters.append((start, end))
inletter = False
letters的值为[(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, 0, 1, 1, 1, 1, 0, 0, 0,
0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1,
1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1,
1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0,
0, 1, 1, 0, 0, 1, 0, 1]总大小7*14,总共98个点 到这里差不多就出来了,把每个点看成一个属性,问题就转化成了:已知一个数有98个属性,也知道他的种类是9,同样,还有很多很多这样的数,知道属性+种类。然后要做的,就是拿N个样本作为标准集合,有新的数要识别的时候,选出最接近
的K个,这K个里面,数量最多的就是这个数的值。






正在阅读:
Python用KNN算法实现验证码识别11-22
c语言指针习题05-08
2022得当女生的提前批院校有哪些03-29
当年明月语录,当年明月经典语录02-13
悼念消防员,不忘多反思02-23
教师入党申请书,2022年教师入党申请书范文【大全】07-31
某某学校乡村少年宫活动计划03-05
孕期便秘怎么办09-01
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 算法
- 识别
- 验证
- 实现
- Python
- KNN
- 北师大学案 1、物态变化 温度1 - 图文
- 秩和检验
- 2015届上海市十三校第一次联考化学试卷
- 国际金融(二)作业
- 装饰装修工程施工方案(更新) - 图文
- TJ37标系梁施工专项方案 - 图文
- 商品房买卖合同的若干思考
- 县绩效考评试点工作情况汇报材料
- 经济学基础习题答案(第四版)刘华
- 沪粤版八年级物理下册6.5 探究杠杆的平衡条件
- 2020版高考历史新探究大一轮复习第一单元1第1讲夏商制度与西周封建课后达标检测含2019届新题含解析岳麓版
- 练习题一(总论)含答案
- 春节习俗(英文版)
- 福建省泉州市泉港区第一中学2017-2018学年高一第二学期第一次(4月)月考地理试卷
- 邢台市第四届中小学教师论文大赛评选结果的通报
- 解密大成拳 - 图文
- 2009 年度全国监理工程师执业资格考试案例分析真题及答案
- 统一建模语言UML实验报告
- 度历史必修人教新课标第26课世界多极化趋势的出现教案
- 财税实务价外费用中延期支付款项利息的营改增理解误区