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程序设计入门(3)数组的使用
Jun 16 Python
python基础教程之基本数据类型和变量声明介绍
Aug 29 Python
分分钟入门python语言
Mar 20 Python
儿童学习python的一些小技巧
May 27 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
May 30 Python
python3实现随机数
Jun 25 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
python3爬虫中异步协程的用法
Jul 10 Python
Python sqlalchemy时间戳及密码管理实现代码详解
Aug 01 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计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
2018/08/10 PHP
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
jquery图片上下tab切换效果
2011/03/18 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
JS字符串函数扩展代码
2011/09/13 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
jQuery实用技巧必备(下)
2015/11/03 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
Python中with及contextlib的用法详解
2017/06/08 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
手写一个python迭代器过程详解
2019/08/27 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
Python多线程thread及模块使用实例
2020/04/28 Python
支部书记四风问题自我剖析材料
2014/09/29 职场文书
经典导游欢迎词
2015/01/26 职场文书
创业计划书之酒吧
2019/12/02 职场文书
Python实现列表拼接和去重的三种方式
2021/07/02 Python
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB
JS 基本概念详细介绍
2021/10/16 Javascript
mysql分组后合并显示一个字段的多条数据方式
2022/01/22 MySQL