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在windows下实现备份程序实例
Jul 04 Python
Python简单实现Base64编码和解码的方法
Apr 29 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
Python中if elif else及缩进的使用简述
May 31 Python
Python基础知识点 初识Python.md
May 14 Python
Python中print函数简单使用总结
Aug 05 Python
python实现读取excel文件中所有sheet操作示例
Aug 09 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
python梯度下降算法的实现
Feb 24 Python
python制作一个简单的gui 数据库查询界面
Nov 19 Python
关于Python错误重试方法总结
Jan 03 Python
python使用torch随机初始化参数
Mar 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
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
使用PHP实现二分查找算法代码分享
2011/06/24 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
制作特殊字的脚本
2006/06/26 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
Node.js模块加载详解
2014/08/16 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
Python交换变量
2008/09/06 Python
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
NumPy.npy与pandas DataFrame的实例讲解
2018/07/09 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
图文详解matlab原始处理图像几何变换
2021/07/09 Python
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL