谈谈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爬取读者并制作成PDF
Mar 10 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
Python 备份程序代码实现
Mar 06 Python
python executemany的使用及注意事项
Mar 13 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
Jul 12 Python
python爬虫_微信公众号推送信息爬取的实例
Oct 23 Python
Python并发之多进程的方法实例代码
Aug 15 Python
实例讲解python中的序列化知识点
Oct 08 Python
python 多个参数不为空校验方法
Feb 14 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
Aug 15 Python
python自动发微信监控报警
Sep 06 Python
pycharm导入源码的具体步骤
Aug 04 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
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
Python数据类型详解(一)字符串
2016/05/08 Python
Python模拟登陆实现代码
2017/06/14 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
linux面试题参考答案(8)
2015/08/11 面试题
海量信息软件测试笔试题
2015/08/08 面试题
导游实习生自荐书
2014/01/28 职场文书
先进工作者获奖感言
2014/02/08 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
工作作风承诺书
2014/08/30 职场文书
车辆年审委托书范本
2014/09/18 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android