谈谈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实现文件名批量替换和内容替换
Mar 20 Python
python实现的阳历转阴历(农历)算法
Apr 25 Python
粗略分析Python中的内存泄漏
Apr 23 Python
Python实现的多线程http压力测试代码
Feb 08 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
Python分治法定义与应用实例详解
Jul 28 Python
pandas中apply和transform方法的性能比较及区别介绍
Oct 30 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
python实现连连看游戏
Feb 14 Python
python实现批量提取指定文件夹下同类型文件
Apr 05 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 Python
python开发制作好看的时钟效果
May 02 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
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
Javascript valueOf 使用方法
2008/12/28 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
vue 组件简介
2020/07/31 Javascript
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
python中正则表达式与模式匹配
2019/05/07 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
美国经典刺绣和字母儿童服装特卖:Smocked Auctions
2018/07/16 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
新三好学生主要事迹
2014/01/23 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
市场营销战略计划书
2014/05/06 职场文书
大学辅导员述职报告
2015/01/10 职场文书
 Python 中 logging 模块使用详情
2022/03/03 Python