谈谈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函数作用域的LEGB顺序
May 14 Python
深入浅析Python 中 is 语法带来的误解
May 07 Python
对Python的交互模式和直接运行.py文件的区别详解
Jun 29 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
python集合常见运算案例解析
Oct 17 Python
python 画条形图(柱状图)实例
Apr 24 Python
Python调用.net动态库实现过程解析
Jun 05 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
Django web自定义通用权限控制实现方法
Nov 24 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
anaconda python3.8安装后降级
Jun 11 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 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空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
javaScript 关闭浏览器 (不弹出提示框)
2010/01/31 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
python解析xml文件操作实例
2014/10/05 Python
Python实现的双色球生成功能示例
2017/12/18 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
详解Python的三种拷贝方式
2020/02/11 Python
Django实现前台上传并显示图片功能
2020/05/29 Python
django rest framework 过滤时间操作
2020/07/12 Python
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
优秀员工自荐信范文
2013/10/05 职场文书
高三自我评价
2014/02/01 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS