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 快速排序代码
Nov 23 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
python实现多线程抓取知乎用户
Dec 12 Python
Python中如何优雅的合并两个字典(dict)方法示例
Aug 09 Python
Python基于回溯法子集树模板解决选排问题示例
Sep 07 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
python自动保存百度盘资源到百度盘中的实例代码
Aug 26 Python
python多线程并发及测试框架案例
Oct 15 Python
Python通过2种方法输出带颜色字体
Mar 02 Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 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多线程抓取网页实现代码
2010/07/22 PHP
深入array multisort排序原理的详解
2013/06/18 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
Angular2自定义分页组件
2017/04/19 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
python 函数传参之传值还是传引用的分析
2017/09/07 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
pandas中去除指定字符的实例
2018/05/18 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
成品库仓管员岗位职责
2014/04/06 职场文书
服务承诺书格式
2014/05/21 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
政协工作总结2015
2015/05/20 职场文书
二十年同学聚会感言
2015/07/30 职场文书
详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)
2021/07/01 HTML / CSS
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js