python脚本实现验证码识别


Posted in Python onJune 07, 2018

最近在折腾验证码识别。最终的脚本的识别率在92%左右,9000张验证码大概能识别出八千三四百张左右。好吧,其实是验证码太简单。下面就是要识别的验证码。

python脚本实现验证码识别python脚本实现验证码识别

我主要用的是Python中的PIL库。

首先进行二值化处理。由于图片中的噪点颜色比较浅,所以可以设定一个阈值直接过滤掉。这里我设置的阈值是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')

处理后的图片如下。

python脚本实现验证码识别

阈值不同产生的不同效果:

python脚本实现验证码识别

接下来对图片进行分割。遍历图片中所有像素点,计算每一列像素为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脚本实现验证码识别

最终在模板库只有25条的情况下,识别率在92%左右(总共测试了一万六千张验证码)。好吧,只能说验证码太简单。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中使用成员运算符的示例
May 13 Python
python 采集中文乱码问题的完美解决方法
Sep 27 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
python中map的基本用法示例
Sep 10 Python
python用pandas数据加载、存储与文件格式的实例
Dec 07 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 Python
Python Matplotlib绘图基础知识代码解析
Aug 31 Python
Python和Bash结合在一起的方法
Nov 13 Python
python实现xml转json文件的示例代码
Dec 30 Python
Python实现聚类K-means算法详解
Jul 15 Python
python 创建一个空dataframe 然后添加行数据的实例
Jun 07 #Python
使用Python处理Excel表格的简单方法
Jun 07 #Python
python实现验证码识别功能
Jun 07 #Python
通过Pandas读取大文件的实例
Jun 07 #Python
Pandas:DataFrame对象的基础操作方法
Jun 07 #Python
Python中偏函数用法示例
Jun 07 #Python
网红编程语言Python将纳入高考你怎么看?
Jun 07 #Python
You might like
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP 金额数字转换成英文
2010/05/06 PHP
php常用数学函数汇总
2014/11/21 PHP
PHP输出日历表代码实例
2015/03/27 PHP
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
JS 修改URL参数(实现代码)
2013/07/08 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
C#的几个面试问题
2016/05/22 面试题
小学语文国培感言
2014/03/04 职场文书
公司业务员岗位职责
2014/03/18 职场文书
财务会计专业求职信
2014/06/09 职场文书
庆元旦活动总结
2014/07/09 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
V Rising 服务器搭建图文教程
2022/06/16 Servers