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性能优化的20条建议
Oct 25 Python
Python中的赋值、浅拷贝、深拷贝介绍
Mar 09 Python
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
python删除某个字符
Mar 19 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
Python动态语言与鸭子类型详解
Jul 01 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
python应用文件读取与登录注册功能
Sep 23 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
Apr 08 Python
tensorflow实现残差网络方式(mnist数据集)
May 26 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
Oct 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
PHP 字符串 小常识
2009/06/05 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
2015/08/07 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
简单了解Django模板的使用
2017/12/20 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
Python调用Redis的示例代码
2020/11/24 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
linux面试题参考答案(9)
2015/01/07 面试题
学生自我鉴定模板
2013/12/30 职场文书
单位授权委托书范文
2014/08/02 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
圣诞晚会主持词
2015/07/01 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android