使用python识别验证码

  公司的登录注册等操作有验证码,测试环境可以让开发屏蔽掉验证码,但是如果到线上的话就要想办法识别验证码或必过验证码了。

  识别验证码主要分为三部分,一、对验证码进行二值化。二、将二值化后的图片分割。三、进行识别。理论上在识别之前有一个标准化的操作,是将图片进行旋转等操作,尽量将字符弄成一样的格式,方便识别,避免随进图片的差异。

  用这个验证码作为例子:。下面是代码:

  一、打开图片,将图片二值化。

  图片是由RGB三个通道组成的,图片的验证码和他的干扰,比如点或横线等,RGB的阙值有很大的区别,我们可以使用PS工具查看,选取一个大概的临界点,在代码中进行判断,判断属于验证码部分的阙值,赋值为(255,255,255,255)黑色。如果不是在这个阙值范围内的赋值为(0,0,0,255)白色。从而将噪点去掉。

#coding=utf-8
from PIL import
Image
from operator import itemgetter
import
os
img=Image.open(‘code.jpg‘)
print
img.format,img.size,img.mode
img=img.convert("RGBA")
pixdata=img.load()
for
y in xrange(img.size[1]):
for x in xrange(img.size[0]):

if pixdata[x,y][0]<140 or pixdata[x,y][1]<140 or
pixdata[x,y][2]<140:
pixdata[x,y]=(0,0,0,255)

else:
pixdata[x,y]=(255,255,255,255)

说明:对像素pixdata[x,y]的阙值判断,前文中说明过[0],[1],[2]分别代表了RGB,140是用PS看出来的,验证码位置的像素,RGB都比较低,而噪点的RGB值比较高。可以适当的调一下。

下图是取验证码一点的像素点:

下面是噪点的RGB:

二、将二值化后的图片进行分割,分割成独立字符

#存为字库
j = 1
for i in
range(4):
x = 0 + i*13
y = 6
img.crop((x, y,
x+13, y+18)).save("%d.jpg" % j)
j += 1

分割后的结果如下图:

说明:验证码图片的大小是固定的,一个验证码4个字符,将他分成等大小的四个图片,13为一个字符所占的宽度,18为一个字符所占的高度,但是这样截出来的图片不是很精确。

三、识别验证码,这步也是最关键的。

#识别
fontMods =
[]#fontMods,图片库,文件名,带后缀
mode=[]#mode,图片库,去掉后缀的文件名
font=[]#font,分割后的四个图片
s=os.sep
root="C:\Users\min.sun\Desktop"+s+"num"+s#文件路径,s区分在linux或windows系统下的分割符"/"或"\"
sname=os.listdir("C:\Users\min.sun\Desktop/num")#获取文件夹下文件或文件夹的名称,带后缀
#fname,存储文件名区分名和后缀的元组,例(5,jpg)。mode存储文件名,不带后缀
#分割文件名和后缀名

#遍历文件,将库中的文件名存入

for rt, dirs, files in
os.walk(root):
for f in files:
fname =
os.path.splitext(f)
mode.append(fname[0])

for i in range(0,4):

fontMods.append(Image.open(root+s+sname[i]))
result=[]
for i
in range(1,5):
font.append(Image.open("%d.jpg" % i))
for i
in font:
points ={}
d=0
for mod in
fontMods:
diffs = 0
for yi in range(18):

for xi in range(13):
if i.getpixel((xi,
yi))!=mod.getpixel((xi, yi)):

diffs=diffs+1
#print "diffs:" + str(diffs)

#points[diffs]=mode
points[diffs]=mode[d]

d=d+1
points=sorted(points.iteritems(), cmp=lambda
x,y:cmp(x[0],y[0]), reverse = False )

result.append(points[0][1])

a="".join(result)
print "The result
is:",a
print "over"

  说明:做识别首先要有一个库,来比对,这里做的方法是取像素点,判断和库中的图片是否一样,取不同个数最少的一个图片作为结果。

以上步骤就是验证码识别的一个简单过程,不过识别率很低,只是作为一个学习,还是可以了考虑用其他方法来识别验证码。

使用python识别验证码

时间: 2024-10-13 02:09:13

使用python识别验证码的相关文章

python识别验证码

1.python识别验证码依赖 tesseract-ocr-setup-3.02.02.exe,所以首先需要安装 tesseract-ocr-setup-3.02.02.exe 2.然后安装pytesseract,通过pytesseract调用tesseract-ocr来识别验证码.pip install pytesseract 运行代码: import requestsfrom PIL import Imagefrom StringIO import StringIOimport pytess

Ubuntu上python识别验证码遇到的问题

python有专门图片识别的库我用的是pytesseract pytesseract说明 Python-tesseract is a wrapper for google's Tesseract-OCR( http://code.google.com/p/tesseract-ocr/ ). It is also useful as astand-alone invocation script to tesseract, as it can read all image typessupporte

Python识别网站验证码

http://drops.wooyun.org/tips/6313 Python识别网站验证码 Manning · 2015/05/28 10:57 0x00 识别涉及技术 验证码识别涉及很多方面的内容.入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足. 验证码图像处理 验证码图像识别技术主要是操作图片内的像素点,通过对图片的像素点进行一系列的操作,最后输出验证码图像内的每个字符的文本矩阵. 读取图片 图片降噪 图片切割 图像文本输出 验证字符识别 验证码内的字符识别主要以机

关于利用python进行验证码识别的一些想法

转载:@小五义http://www.cnblogs.com/xiaowuyi 用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章.我大体看了一下,主要方法有几类:一类是通过对图片进行处理,然后利用字库特征匹配的方法,一类是图片处理后建立字符对应字典,还有一类是直接利用ocr模块进行识别.不管是用什么方法,都需要首先对图片进行处理,于是试着对下面的验证码进行分析.        一.图片处理 这个验证码中主要的影响因素是中间的曲线,首先考虑去掉图片中的曲线.考

python网络爬虫之如何识别验证码

有些网站的登录方式是验证码登录的方式,比如今天我们要测试的网站专利检索及分析. http://www.pss-system.gov.cn/sipopublicsearch/portal/uilogin-forwardLogin.shtml 登录此类网站的关键是识别其中的验证码.那么如何识别验证码呢.我们首先来看下网页源代码.在网页中,验证码的是通过下载一个图片得到的.图片的下载地址是src=/sipopublicsearch/portal/login-showPic.shtml 我们从实际的fi

python之验证码识别 特征向量提取和余弦相似性比较

0.目录 1.参考2.没事画个流程图3.完整代码4.改进方向 1.参考 https://en.wikipedia.org/wiki/Cosine_similarity https://zh.wikipedia.org/wiki/%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E6%80%A7 Cosine similarityGiven two vectors of attributes, A and B, the cosine similarity, cos(θ),

C#识别验证码技术-Tesseract

相信大家在开发一些程序会有识别图片上文字(即所谓的OCR)的需求,比如识别车牌.识别图片格式的商品价格.识别图片格式的邮箱地址等等,当然需求最多的还是识别验证码.如果要完成这些OCR的工作,需要你掌握图像处理.图像识别的知识,需要用到图形形态学.傅里叶变换.矩阵变换.贝叶斯决策等很多复杂的理论,这让绝大部分人都会望而却步. Tesseract这个开源项目的出现让我们普通人也可以涉足OCR的开发.Tesseract可以从图片中识别出文字内容,但不要以为Tesseract可以智能的识别出各种奇形怪状

在VS2010下编译和使用tesseract_ocr识别验证码

对于自动识别验证码,使用trsseract是个不错的选择,有兴趣的的朋友可以试试. 编译tesseract 官网提供了vs2008的编译说明和工程,但在vs2010下的编译时基本相同的,因此我使用的方法就是把vs2008工程转换为vs2010工程, 同时把编译过程中遇到的问题以及解决方法和大家分享一下,希望对正准备使用trsseract库的朋友有所帮助. 下载代码 google code下载一下源代码,并建立build目录. tesseract-ocr-3.02.02.tar.gz   tess

Python 爬验证码

主要实现功能: - 登陆网页 - 动态等待网页载入 - 验证码下载 非常早就有一个想法,就是自己主动依照脚本运行一个功能.节省大量的人力--个人比較懒.花了几天写了写,本着想完成验证码的识别,从根本上解决这个问题,仅仅是难度太高,识别的准确率又太低.计划再次告一段落. 希望这次经历能够与大家进行分享和交流. 注:代码中的 username与password都是无效的! Python打开浏览器 相比与自带的urllib2模块,操作比較麻烦.针对于一部分网页还须要对cookie进行保存,非常不方便.