谈谈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实现多线程采集的2个代码例子
Jul 07 Python
Python配置文件解析模块ConfigParser使用实例
Apr 13 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
python spyder中读取txt为图片的方法
Apr 27 Python
在cmd中运行.py文件: python的操作步骤
May 12 Python
pandas DataFrame实现几列数据合并成为新的一列方法
Jun 08 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
关于PyTorch源码解读之torchvision.models
Aug 17 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
Oct 18 Python
Python数据可视化图实现过程详解
Jun 12 Python
python opencv肤色检测的实现示例
Dec 21 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 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/07/08 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
php使用pack处理二进制文件的方法
2014/07/03 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
Django 多环境配置详解
2019/05/14 Python
pygame实现成语填空游戏
2019/10/29 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
css3 transform属性详解
2014/09/30 HTML / CSS
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
化工专业个人的求职信范文
2013/11/28 职场文书
大型会议策划方案
2014/05/17 职场文书
销售队伍口号
2014/06/11 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS