python验证码识别模块

Python043

python验证码识别模块,第1张

只需要简单几步操作即可拥有两大通用识别模块,让你在工作中畅通无阻。

测试图片 test1.png

测试图片 test2.jpg

以上参数两者选其一即可,默认 model_type 为 ModelType.OCR, 若指定 conf_path 参数则优先使用自定义模型。

注意: 因模块过新,阿里/清华等第三方源可能尚未更新镜像,因此手动指定使用境外源,为了提高依赖的安装速度,可预先自行安装依赖:tensorflow/numpy/opencv-python/pillow/pyyaml

输出结果:

OCR和验证码识别的速度基本都在10ms左右,低配CPU可能需要15-20ms。本模块仅支持单行识别,如有多行识别需求请自行采用目标检测预裁图片。

用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章。我大体看了一下,主要方法有几类:一类是通过对图片进行处理,然后利用字库特征匹配的方法,一类是图片处理后建立字符对应字典,还有一类是直接利用ocr模块进行识别。不管是用什么方法,都需要首先对图片进行处理,于是试着对下面的验证码进行分析。

一、图片处理

这个验证码中主要的影响因素是中间的曲线,首先考虑去掉图片中的曲线。考虑了两种算法:

第一种是首先取到曲线头的位置,即x=0时,黑点的位置。然后向后移动x的取值,观察每个x下黑点的位置,判断前后两个相邻黑点之间的距离,如果距离在一定范围内,可以基本判断该点是曲线上的点,最后将曲线上的点全部绘成白色。试了一下这种方法,结果得到的图片效果很一般,曲线不能完全去除,而且容量将字符的线条去除。

第二种考虑用单位面积内点的密度来进行计算。于是首先计算单位面积内点的个数,将单位面积内点个数少于某一指定数的面积去除,剩余的部分基本上就是验证码字符的部分。本例中,为了便于操作,取了5*5做为单位范围,并调整单位面积内点的标准密度为11。处理后的效果:

二、字符验证

这里我使用的方法是利用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,ImageDrawimport 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()

1.找地址

首先,我们要找到这个网站生成验证码的地址,这个地址我们可以通过查看他的源代码来实现。

1.找地址

首先,我们要找到这个网站生成验证码的地址,这个地址我们可以通过查看他的源代码来实现。

就以某大学教务网为例,这个教务网的模板很多学校都在采用:

我就截取表单的验证码部分即可。

<td align="center" rowspan="3" >

<img  id="imgCode" src="../sys/ValidateCode.aspx" 

onclick="changeValidateCode(this)" alt="单击可更换图片!" 

style="CURSOR: pointer">

<br>看不清,则单击图片!                                 

</td>123456123456

这里就可以知道,地址就是../sys/ValidateCode.aspx

组合一下地址就是http://jwmis.lmu.cn/sys/ValidateCode.aspx

也就是我们等一下要用到的地址了。

我们可以查看一下那个网页。

2.处理图片

去查看了一下那个地址

果不其然,都是乱码,因为验证码分为两种。

1)直接处理成JPG/GIF/PNG或者其他格式,然后直接读取到一个图片地址。

2)接收用户触发,然后生成,再直接处理成图像,不读取到一个图片地址。

我们这里是第二种,我们要自己来读取他,到本地,再手动输入验证码。

# -*- coding: utf-8 -*-

import urllib2

#验证码的处理#

#验证码生成页面的地址#

im_url = 'http://jwmis.lmu.cn/sys/ValidateCode.aspx'

#读取验证码图片#

im_data = urllib2.urlopen(im_url).read()

#打开一个Code.PNG文件在D盘,没有的话自动生成#

f=open('d:\\Code.png','wb')

#写入图片内容#

f.write(im_data)

#关闭文件#

f.close()1234567891011121312345678910111213

这里包括两个部分:

1)打开那个生成验证码图片的页面,读取

2)将读取到的内容,保存成图片,下载到本地

我们这里的地址是可以随便写的,保存在你想保存的地方。

到这里我们就完成了验证码的一小部分。

by–LoDog

希望能帮到你!