这篇文章给大家介绍使用python脚本怎么识别验证码,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都网站建设、托里网络推广、微信平台小程序开发、托里网络营销、托里企业策划、托里品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;成都创新互联为所有大学生创业者提供托里建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com首先进行二值化处理。由于图片中的噪点颜色比较浅,所以可以设定一个阈值直接过滤掉。这里我设置的阈值是150,像素大于150的赋值为1,小于的赋为0.
def set_table(a): table = [] for i in range(256): if i < a: table.append(0) else: table.append(1) return table img = Image.open("D:/python/单个字体/A"+str(i)+".jpg") pix = img.load() #将图片进行灰度化处理 img1 = img.convert('L') #阈值为150,参数为1,将图片进行二值化处理 img2 = img1.point(set_table(150),'1')
处理后的图片如下。
阈值不同产生的不同效果:
接下来对图片进行分割。遍历图片中所有像素点,计算每一列像素为0的点的个数(jd)。对于相邻两列,若其中一列jd=0,而另一列jd!=0,则可以认为这一列是验证码中字符边界,由此对验证码进行分割。这样分割能达到比较好的效果,分割后得到的字符图片几乎能与模板完全相同。
(Width,Height) = img2.size pix2 = img2.load() x0 = [] y0 = [] for x in range(1,Width): jd = 0 # print x for y in range(1,Height): # print y if pix2[x,y] == 0: jd+=1 y0.append(jd) if jd > 0: x0.append(x) #分别对各个字符边界进行判断,这里只举出一个 for a in range(1,Width): if (y0[a] != 0)&(y0[a+1] != 0): sta1 = a+1 break
分割完成后,对于识别,目前有几种方法。可以遍历图片的每一个像素点,获取像素值,得到一个字符串,将该字符串与模板的字符串进行比较,计算汉明距离或者编辑距离(即两个字符串的差异度),可用Python-Levenshtein库来实现。
我采用的是比较特征向量来进行识别的。首先设定了4个竖直特征向量,分别计算第0、2、4、6列每一列像素值为0的点的个数,与模板进行比较,若小于阈值则认为该字符与模板相同。为了提高识别率,如果通过竖直特征向量未能识别成功,引入水平特征向量继续识别,原理与竖直特征向量相同。
另外,还可以通过局部特征进行识别。这对于加入了旋转干扰的验证码有很好效果。由于我写的脚本识别率已经达到了要求,所以并没有用到这个。
最后的结果是这样的:
关于使用python脚本怎么识别验证码就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。