Python实现基于PIL和tesseract的验证码识别功能示例
本文实例讲述了Python实现基于PIL和tesseract的验证码识别功能。分享给大家供大家参考,具体如下:
之前搞这个搞了一段时间,后面遇到了点小麻烦,导致识别率太低了,最多也就百分之20的样子。心灰意冷,弃了一段时间。上次在论坛看到一篇大牛的关于PIL对图片各种处理各种算法的博突然又想起了这个,又随便搞了下,大大提高了识别率啊。先给代码:
原图:
im = Image.open("C:UsersAdministratorDesktoppython\3.png") #调色 enhancer = ImageEnhance.Contrast(im) im = enhancer.enhance(2) #把图片调成只有黑白两个颜色,处理后每个像素色用8位表示 im = im.convert('1') im.show() #测试查看
经过上面处理后:
现在到了关键的一步,这图上好多好多小黑点,要一个一个全部去除我估计我代码写到吐血都写不出来。但是要去除一部分还是可以的。
xsize, ysize = im.size #长、宽 #对照片里的所有像素点:如果像素色不是白色并且右边的一个像素点像素色是白色(RGB(255,255,255))或者像素色不是白色并且下方的一个像素点是白色的,统一变成白色 for i in range(ysize-1): for j in range(xsize-1): if (im.getpixel((j, i)) !=255&im.getpixel((j+1,i))==255): im.putpixel((j,i),255); if(im.getpixel((j,i)) != 255&im.getpixel((j,i+1))==255): im.putpixel((j, i), 255); im.show(); #再看看效果
处理完之后:
之前那些黑色的小点点已经去的差不多了,但是这样也是有代价的啊- - 把图片里面的字的一些像素色也去掉了一些,现在拿这张图片去用tesseract识别的话其实对于tesseract来说跟之前那张没有去小黑点的图片识别难度差不了多少,然后后面又想了个办法补救了一下:
#把上面我们变成白色的小黑点给他补一点回来- - for i in range(ysize - 1): for j in range(xsize - 1): if (im.getpixel((j, i))!=255&im.getpixel((j+1,i)) !=255): im.putpixel((j, i), 0); if (im.getpixel((j, i))!=255&im.getpixel((j,i+1)) !=255): im.putpixel((j, i), 0); im.show(); #再看看效果
处理完之后:
比上面的图清晰了蛮多。这个时候再去对照下刚开始的那种图的话,对识别程序来说清楚了不止是一点点啊。
不过尽管如此,识别率还是不怎么样,我估计也就百分之50左右的识别率,还是太低了,可能是因为我去掉了一些关键的像素点的色,因为我也不知道tesseract具体的对比库是怎么样的,所以估计我又要弃了。有想过再继续对图片切割旋转,甚至还想过找人工智能的朋友给我拿去训练训练,不过那样还是偏离我本意了,而且我也不是很喜欢搞学术的东西。不管怎么样我这个感觉还是有点用的,说不定拿去做一下切割识别率大大提高也是有可能的。
最后如果有大牛偶然看到我这篇博的话还望不吝赐教。
更多关于Python相关内容可查看本站专题:《Python数学运算技巧总结》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
- weblogic安全配置二三事
- 开发自己的Data Access Application Block[下篇]
- 【CSS】格仔背景
- 这年头真的还有USB设备是安全的吗?
- js的动态加载、缓存、更新以及复用(一)使用范围:遇到的问题:目标:页面结构:正文
- js的动态加载、缓存、更新以及复用(二)恼人的命名冲突
- 以【猫叫、老鼠跑、主人醒】为例子,使用 javascript 来实现 观察者模式 (有在线演示)
- Debian/Ubuntu-shell脚本来管理iptables安全策略
- Pegasus间谍套件内部原理及流程剖析
- 用node.js实现ORM的一种思路
- iOS“远程越狱”间谍软件Pegasus技术分析
- 学习HTML5之表单
- 基于jQuery的ajax对WebApi和OData的封装我们还是先来看看要求在看看目标:思路封装方式
- js的动态加载、缓存、更新以及复用(四)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Docker(二)基础使用
- Spring Boot实现加载自定义配置文件
- SpringBoot整合Dubbo
- SpringBoot统计实时在线人数
- 人工智能之Python人脸识别技术--face_recognition模块
- Redis的使用--(二)与Spring的整合
- Milvus 实战|利用 Milvus 搭建基于图的推荐系统
- k8s基本使用
- 淮师2017校园新闻爬取&&WordCloud年度词云分析
- 13 | Tornado源码分析:BaseIOStream 对象(下)
- 谈谈线程
- springboot整合定时框架-Elastic-job-lite
- hashMap的循环姿势你真的使用对了吗?
- SpringBoot整合常用技术
- SpringBoot整合Quartz实现定时任务(单任务、多任务)