谈谈Python进行验证码识别的一些想法


Posted in Python onJanuary 25, 2016

用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章。我大体看了一下,主要方法有几类:一类是通过对图片进行处理,然后利用字库特征匹配的方法,一类是图片处理后建立字符对应字典,还有一类是直接利用ocr模块进行识别。不管是用什么方法,都需要首先对图片进行处理,于是试着对下面的验证码进行分析。

一、图片处理

谈谈Python进行验证码识别的一些想法

这个验证码中主要的影响因素是中间的曲线,首先考虑去掉图片中的曲线。考虑了两种算法:
第一种是首先取到曲线头的位置,即x=0时,黑点的位置。然后向后移动x的取值,观察每个x下黑点的位置,判断前后两个相邻黑点之间的距离,如果距离在一定范围内,可以基本判断该点是曲线上的点,最后将曲线上的点全部绘成白色。试了一下这种方法,结果得到的图片效果很一般,曲线不能完全去除,而且容量将字符的线条去除。
第二种考虑用单位面积内点的密度来进行计算。于是首先计算单位面积内点的个数,将单位面积内点个数少于某一指定数的面积去除,剩余的部分基本上就是验证码字符的部分。本例中,为了便于操作,取了5*5做为单位范围,并调整单位面积内点的标准密度为11。处理后的效果:

谈谈Python进行验证码识别的一些想法

二、字符验证

这里我使用的方法是利用pytesser进行ocr识别,但由于这类验证码字符的不规则性,使得验证结果的准确性并不是很高。具体哪位大牛,有什么好的办法,希望能给指点一下。

三、准备工作与代码实例

1、PIL、pytesser、tesseract

(1)安装PIL:下载地址:http://www.pythonware.com/products/pil/
(2)pytesser:下载地址:http://code.google.com/p/pytesser/,下载解压后直接放在代码相同的文件夹下,即可使用。
(3)Tesseract OCR engine下载:http://code.google.com/p/tesseract-ocr/,下载后解压,找到tessdata文件夹,用其替换掉pytesser解压后的tessdata文件夹即可。

2、具体代码

#encoding=utf-8
###利用点的密度计算
import Image,ImageEnhance,ImageFilter,ImageDraw
import sys
from pytesser import *
#计算范围内点的个数
def numpoint(im):
w,h = im.size
data = list( im.getdata() )
mumpoint=0
for x in range(w):
for y in range(h):
if data[ y*w + x ] !=255:#255是白色
mumpoint+=1
return mumpoint
#计算5*5范围内点的密度
def pointmidu(im):
w,h = im.size
p=[]
for y in range(0,h,5):
for x in range(0,w,5):
box = (x,y, x+5,y+5)
im1=im.crop(box)
a=numpoint(im1)
if a<11:##如果5*5范围内小于11个点,那么将该部分全部换为白色。
for i in range(x,x+5):
for j in range(y,y+5):
im.putpixel((i,j), 255)
im.save(r'img.jpg')
def ocrend():##识别
image_name = "img.jpg"
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.save("1.tif")
print image_file_to_string('1.tif') 
if __name__=='__main__':
image_name = "1.png"
im = Image.open(image_name)
im = im.filter(ImageFilter.DETAIL)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
##a=remove_point(im)
pointmidu(im)
ocrend()

本人的这个方法,最终识别率确实不高,写出来,哪位高手有好的思路或者做法,望不惜赐教!

Python 相关文章推荐
Python中的MongoDB基本操作:连接、查询实例
Feb 13 Python
Python中转换角度为弧度的radians()方法
May 18 Python
Python选课系统开发程序
Sep 02 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
python频繁写入文件时提速的方法
Jun 26 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
Django 后台带有字典的列表数据与页面js交互实例
Apr 03 Python
python语言的优势是什么
Jun 17 Python
Python字典实现伪切片功能
Oct 28 Python
matplotlib更改窗口图标的方法示例
Feb 03 Python
python 爬取哔哩哔哩up主信息和投稿视频
Jun 07 Python
python之基数排序的实现
Jul 26 Python
基于Python Shell获取hostname和fqdn释疑
Jan 25 #Python
21行Python代码实现拼写检查器
Jan 25 #Python
Python字符串、元组、列表、字典互相转换的方法
Jan 23 #Python
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 #Python
Python爬虫模拟登录带验证码网站
Jan 22 #Python
Fiddler如何抓取手机APP数据包
Jan 22 #Python
Python爬虫抓取手机APP的传输数据
Jan 22 #Python
You might like
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
基于javascript代码实现通过点击图片显示原图片
2015/11/29 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
jQuery实现全选、反选和不选功能
2017/08/16 jQuery
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
详解Python文件修改的两种方式
2019/08/22 Python
python numpy 反转 reverse示例
2019/12/04 Python
python3的pip路径在哪
2020/06/23 Python
Melijoe时尚童装德国官网:Melijoe德国
2016/09/03 全球购物
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
护理学中专毕业生求职信
2013/11/11 职场文书
服务标语大全
2014/06/18 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
个人维稳承诺书
2015/05/04 职场文书
服装店员工管理制度
2015/08/07 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫
解决redis批量删除key值的问题
2022/03/23 Redis