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列表操作使用示例分享
Feb 21 Python
python通过函数属性实现全局变量的方法
May 16 Python
使用python3.5仿微软记事本notepad
Jun 15 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
python3下实现搜狗AI API的代码示例
Apr 10 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
python使用wxpy实现微信消息防撤回脚本
Apr 29 Python
python字符串和常用数据结构知识总结
May 21 Python
python实现函数极小值
Jul 10 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
python交互模式基础知识点学习
Jun 18 Python
python通过函数名调用函数的几种场景
Sep 23 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 file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
JQuery工具函数汇总
2015/06/15 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
js正则表达式replace替换变量方法
2016/05/21 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
python3 shelve模块的详解
2017/07/08 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
Python制作exe文件简单流程
2019/01/24 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
3种python调用其他脚本的方法
2020/01/06 Python
python 实现任务管理清单案例
2020/04/25 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
数字天堂软件测试面试题
2012/12/23 面试题
房地产广告策划方案
2014/05/15 职场文书
绿色环保标语
2014/06/12 职场文书
婚宴父亲致辞
2015/07/27 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书