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中用Spark模块的使用教程
Apr 13 Python
基于python实现微信模板消息
Dec 21 Python
python3实现公众号每日定时发送日报和图片
Feb 24 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
一篇文章搞懂Python的类与对象名称空间
Dec 10 Python
python实现文本界面网络聊天室
Dec 12 Python
python paramiko利用sftp上传目录到远程的实例
Jan 03 Python
python射线法判断检测点是否位于区域外接矩形内
Jun 28 Python
Python中利用LSTM模型进行时间序列预测分析的实现
Jul 26 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
Python pandas求方差和标准差的方法实例
Aug 04 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
Apr 14 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
关于php mvc开发模式的感想
2011/06/28 PHP
PHP里的中文变量说明
2011/07/23 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
NodeJs的fs读写删除移动监听
2017/04/28 NodeJs
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
python Django批量导入不重复数据
2016/03/25 Python
Python实现感知机(PLA)算法
2017/12/20 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
python中类的属性和方法介绍
2018/11/27 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
美国电视购物HSN官网:HSN
2016/09/07 全球购物
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
2015年教师党员自我评价材料
2015/03/04 职场文书
大学生逃课检讨书
2015/05/04 职场文书
离婚案件被告代理词
2015/05/23 职场文书