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 HTMLParser模块解析html获取url实例
Apr 08 Python
Python中一些自然语言工具的使用的入门教程
Apr 13 Python
编写自定义的Django模板加载器的简单示例
Jul 21 Python
python字典操作实例详解
Nov 16 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
django初始化数据库的实例
May 27 Python
python2 与 pyhton3的输入语句写法小结
Sep 10 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 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
多重?l件?合查?(一)
2006/10/09 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
PHP对象实例化单例方法
2017/01/19 PHP
php头像上传预览实例代码
2017/05/02 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
js实现带圆角的多级下拉菜单效果
2015/08/28 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
浅谈Express.js解析Post数据类型的正确姿势
2019/05/30 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
pytorch中index_select()的用法详解
2021/01/06 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
管理心得体会
2013/12/28 职场文书
探亲假请假条
2014/04/11 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android