谈谈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虚拟环境Virtualenv使用教程
May 18 Python
python中的字典使用分享
Jul 31 Python
详解python 字符串和日期之间转换 StringAndDate
May 04 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
python zip()函数使用方法解析
Oct 31 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
Python 如何测试文件是否存在
Jul 31 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 Python
pandas实现导出数据的四种方式
Dec 13 Python
pytest进阶教程之fixture函数详解
Mar 29 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 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安全编程之加密功能
2006/10/09 PHP
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
12个非常有创意的JavaScript小游戏
2010/03/18 Javascript
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
Python的几种主动结束程序方式
2019/11/22 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
python游戏开发的五个案例分享
2020/03/09 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
html5中JavaScript removeChild 删除所有节点
2014/05/16 HTML / CSS
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
几道PHP面试题
2013/04/14 面试题
网络安全类面试题
2015/08/01 面试题
应聘教师推荐信
2013/10/31 职场文书
心理健康心得体会
2014/01/02 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
最新个人职业生涯规划书
2014/01/22 职场文书
庆国庆活动总结
2014/08/28 职场文书
稽核岗位职责
2015/02/10 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android