python识别验证码教程(Python3.5 + sklearn利用SVM自动识别字母验证码方法示例)
python识别验证码教程
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例前言
最近正在研究人工智能,为了加深对算法的理解,决定写个自动设别验证码的程序。看了看网上的demo,大部分都是python2的写法,而且验证码的识别都是用的数字做例子,那我就写个基于python3字母识别的程序,不过一路写下来碰到不少坑,大家感兴趣的话可以慢慢看。
图片识别有几个比较大的步骤是必须完成的:
1、有大量的验证码图片作为样本
2、图片要进行处理 流程是:灰度化==》二值化==》字符切割==》识别分类
3、图像识别要提取特征值,然后把图片二值化的数据当做样本做训练,最后基于样本完成对新验证码的识别
一、大量验证码准备
因为要写字母识别,所以需要大量的字母验证码,正好之前做过某电商的项目,印象中是纯字母的查了下果然是的所以就用那个网站作为例子了。
获取验证码方法很简单,找到验证码动态生成的地址,
然后调用python的urllib.request获得图片然后保存就好了
二、图片的灰度化和二值化
其实为了增强识别率,我们将彩色的图片灰度化,
这样就变成了黑白两色,黑的是255白的是0,这样更容易让机器来识别。
灰度化和二值化之前、后的效果图
三、图片的分割
经过观察验证码可以发现,验证码是4位的字母,
同时验证码直接是有空白分隔的(后面的验证码有黏连的单独讲)
这里使用垂直投影法,根据投影进行图片的切割。这个算法讲起来太复杂,看代码吧。。。
效果如下,反正就是切成了4个图片
四、识别分类
这里因为图片太多了,要对每个图片分26个字母的哪一个太麻烦,所以借用google的tesseract这个ocr的软件,用它来帮我识别下图片是哪个字母(当然它识别的成功率不高,不然也不用人工智能了),然后识别错误的我再手动分类。
经过ocr识别和人工分类后,我的temp目录下就变成了这样的,每个目录下都是正确的字母图片
五、提取特征值
将字母的文件夹图片取出,提取特征值然后存储到文本文件里
六、机器训练
这里使用sklearn.svm这个支持向量机的算法,来对数据进行分类。
svm的算法是啥,可以看看知乎大神的讲解https://www.zhihu.com/question/21094489 ,
通过fit进行训练后,将训练的结果保存到pkl文件里,其实里面都是0和1的特征值
七、最后的验证就很简单了
找个验证码图片,调用之前的方法,变成二值化的数据,然后用svm进行识别,就能得到正确的结果了
八、滴水算法(解决黏连问题)
这个验证码也不是完全都有空格分割好的,可能是长这样的,字母直接黏在一起了
这样的字母为了分割出来,就要用滴水算法,模拟水滴重力下落的过程,自动切分图片。
可以看我的water.py文件里面是详细的算法。
讲讲碰到的坑
1、python3不能用opencv了,尤其是cv2.cv方法只是python2用的,不用他换个python写法一样可以实现
2、原始图片有蓝色边,刚开始老识别错误,后来发现问题后,要先进行切割,保证只有字母是有颜色的,其它区域是白色的。
这个是cutimg方法的作用
3、使用google的ocr时,使用了python的pytesseract,这个要先在电脑安装tesseract-ocr,然后要在程序里指定路径才行,
不然会报错误的。pytesseract.pytesseract.tesseract_cmd = 'e:/program files (x86)/tesseract-ocr/tesseract'
4、pytesseract.image_to_string(cur_img, config='-psm 7 outputbase letters')
这个letters是我自己创建的,位置在e:\program files (x86)\tesseract-ocr\tessdata\configs 这里的letters是用来
约束识别范围的,比如我设置tessedit_char_whitelist abcdefghijklmnopqrstuvwxyz
这就表示只识别字母,这样
就会把1,0之类的变成l和o了
最后附上github的源码地址 https://github.com/zjy090/verifycode
下次研究遗传算法ga的实现等写好了也写个demo分享给大家
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开心学习网的支持。
原文链接:https://blog.csdn.net/zjy105/article/details/78499912
- python转pdf教程(Python实现将HTML转成PDF的方法分析)
- python socket 库(Pythony运维入门之Socket网络编程详解)
- python处理excel基础教程第3讲(Python Excel处理库openpyxl使用详解)
- python中读取文件怎么操作(Python实现的读取文件内容并写入其他文件操作示例)
- python弹球游戏编写过程(python实现坦克大战游戏 附详细注释)
- nginx事件模型有几种(Python实现监控Nginx配置文件的不同并发送邮件报警功能示例)
- python 提取微信消息(python实现文件助手中查看微信撤回消息)
- pythonprint什么意思啊(Python中print和return的作用及区别解析)
- python 制作图片文字识别(如何使用Python进行OCR识别图片中的文字)
- python下的sql处理(python中aioysql异步操作MySQL的方法)
- pythonsql注入检测(Python版Mssql爆破小脚本)
- python爬虫怎么爬取vip资源(Python网络爬虫之爬取微博热搜)
- python循环创建字典(Python字典的基本用法实例分析创建、增加、获取、修改、删除)
- python 3.10 循环语法(Python3.4学习笔记之常用操作符,条件分支和循环用法示例)
- python字符串之基本操作小练习(Python数据类型之String字符串实例详解)
- python 接口测试怎么校验json数据(python接口自动化十七--Json 数据处理---一次爬坑记详解)
- 荣耀手表 GS 3 真机亮相 不支持无线充电(荣耀手表GS3)
- 通过体温就能为智能手表充电 原来是用NASA在空间站用的黑科技(通过体温就能为智能手表充电)
- 智能手表兼容Windows和Android 无需充电挑战苹果(智能手表兼容Windows和Android)
- 一天一冲也算表 麦步,一款待机 21 天的智能手表体验评测(一天一冲也算表)
- 魅族智能手表充电座曝光 Type-C 接口,线座分离设计(魅族智能手表充电座曝光)
- 华为 Watch GT2 Pro 智能手表曝光,新增支持无线充电(华为WatchGT2)
热门推荐
- 在linux中实现可加载的内核模块(Linux实现驱动模块传参过程解析)
- docker进入容器的命令(Docker 最常用的镜像命令和容器命令详解)
- ftp服务器设置好无法访问(登陆FTP服务器feat命令错误的解决方法[登陆后不能得到文件列表的解决办法])
- python函数调用传递数组数据(python调用c++传递数组的实例)
- dedecms怎么添加alt标签(dedecms 取消栏目列表页文章标题设置推荐后的加粗)
- 安装mysql中要注意什么问题(安装Mysql时可能会遇到的一些疑难杂症)
- keydown、keypress、keyup的使用
- 更改docker容器的ip地址(docker容器通过ping直接运行获取公网IP操作)
- SQL SERVER中根据身份证号获取出生日期
- 护卫神主机大师教程(护卫神主机大师Linux登录账户密码忘记的解决办法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9