谈谈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实现的百度站长自动URL提交小工具
Jun 27 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
基于wxpython开发的简单gui计算器实例
May 30 Python
Python中的__slots__示例详解
Jul 06 Python
异步任务队列Celery在Django中的使用方法
Jun 07 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
Python使用Pandas库常见操作详解
Jan 16 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
appium+python adb常用命令分享
Mar 06 Python
用python给csv里的数据排序的具体代码
Jul 17 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微信红包生成代码分享
2016/10/06 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
javascript设置连续两次点击按钮时间间隔的方法
2014/10/28 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
Python转码问题的解决方法
2008/10/07 Python
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
Python反转序列的方法实例分析
2018/03/21 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
德国婴儿服装和婴儿用品购买网站:Baby Sweets
2019/12/08 全球购物
军训考核自我鉴定
2014/02/13 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis