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自然语言编码转换模块codecs介绍
Apr 08 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
python win32 简单操作方法
May 25 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
Python下调用Linux的Shell命令的方法
Jun 12 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
May 31 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
使用TensorFlow-Slim进行图像分类的实现
Dec 31 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
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
如何防止回车(enter)键提交表单
2014/05/11 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
jQuery编写网页版2048小游戏
2017/01/06 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
使用jQuery如何写一个含验证码的登录界面
2019/05/13 jQuery
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
对于Python的框架中一些会话程序的管理
2015/04/20 Python
python3 拼接字符串的7种方法
2018/09/12 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
应届毕业生应聘自荐信
2013/12/07 职场文书
园林施工员岗位职责
2013/12/11 职场文书
家长会邀请书
2014/01/25 职场文书
打架检讨书300字
2014/02/02 职场文书
聘任书模板
2014/03/29 职场文书
劳动竞赛口号
2014/06/16 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
个人整改措施书面材料
2014/10/24 职场文书
爱晚亭导游词
2015/02/09 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
欧元符号 €
2022/02/17 杂记
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记