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

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

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

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

  图片是由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识别验证码的更多相关文章

  1. python识别验证码——PIL,pytesser,pytesseract的安装

    1.使用Python识别验证码需要安装Python的图像处理模块(PIL.pytesser.pytesseract) (安装过程需要pip,在我的Python中已经安装pip了,pip的安装就不在赘述 ...

  2. Python爬虫入门教程 60-100 python识别验证码,阿里、腾讯、百度、聚合数据等大公司都这么干

    常见验证码 之前的博客中已经解决了一些常见验证码的问题,但是验证码是层出不穷的,目前解决验证码除了通过常规手段解决以外,还可以通过人工智能领域的深度学习去解决 深度学习?! 无疑对爬虫coder提高了 ...

  3. python 识别验证码自动登陆

    # python 3.5.0 # 通过Chrom浏览器访问发起请求 # 需要对应版本的Chrom和chromdriver # 作者:linyouyi from selenium import webd ...

  4. python识别验证码——一般的数字加字母验证码识别

    1.验证码的识别是有针对性的,不同的系统.应用的验证码区别有大有小,只要处理好图片,利用好pytesseract,一般的验证码都可以识别 2.我在识别验证码的路上走了很多弯路,重点应该放在怎么把图片处 ...

  5. python识别验证码

    1.tesseract-ocr安装 tesseract-ocr windows下载地址 http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr- ...

  6. Python识别验证码,基于Tesseract实现图片文字识别

    一.简介 Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[li ...

  7. python 识别验证码

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/instal ...

  8. Python识别网站验证码

    http://drops.wooyun.org/tips/6313 Python识别网站验证码 Manning · 2015/05/28 10:57 0x00 识别涉及技术 验证码识别涉及很多方面的内 ...

  9. python 基于机器学习识别验证码

    1.背景    验证码自动识别在模拟登陆上使用的较为广泛,一直有耳闻好多人在使用机器学习来识别验证码,最近因为刚好接触这方面的知识,所以特定研究了一番.发现网上已有很多基于machine learni ...

随机推荐

  1. java对含有中文的字符串进行Unicode编码

    public class MyUtil { public static void main(String[] args) throws Exception { String s = "a中a ...

  2. [原]DataGridView 回车不换行代码 AND 编辑时的字符控制

    // 让 dataGridView1 在遇到回车时不响应 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { ...

  3. 6-3-3ios自动化-数据驱动

    https://testerhome.com/topics/14247 #!/usr/bin/env python3 # coding:utf-8 from appium import webdriv ...

  4. Python- 解决PIP下载安装速度慢 让PIP源使用国内镜像,提升下载速度和安装成功率。

    原文: https://www.cnblogs.com/microman/p/6107879.html 对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间. ...

  5. 第15章 高并发服务器编程(2)_I/O多路复用

    3. I/O多路复用:select函数 3.1 I/O多路复用简介 (1)通信领域的时分多路复用 (2)I/O多路复用(I/O multiplexing) ①同一线程,通过“拨开关”方式,来同时处理多 ...

  6. webpack(2)--Entry

    Entry entry是配置模块的入口,可以抽象成输入,webpack执行构建的第一步将从入口开始搜寻及递归解析出所有入口依赖的模块. 注意: entry是必填,若不填写则将导致webpack报错退出 ...

  7. SpringJdbc之queryForXXX大全解读

      一.查询单个字段  Object queryForObject(String sql, Object[] args, Class requiredType)  其中Class requiredTy ...

  8. python中的运算符及表达式及常用内置函数

    知识内容: 1.运算符与表达式 2.for\while初步了解 3.常用内置函数 一.运算符与表达式 python与其他语言一样支持大多数算数运算符.关系运算符.逻辑运算符以及位运算符,并且有和大多数 ...

  9. 8.rem适配

    <!DOCTYPE html> <!--lang="en" : 英语 :声明当前页面的语言类型.--> <html lang="en&quo ...

  10. 1_Utilities__deviceQuery + 1_Utilities__deviceQueryDrv + 1_Utilities__topologyQuery

    使用 Runtime API 和 Driver API 检测设备相关属性.并检测了设备之间的拓扑以及主机与设备之间的拓扑(是否支持跨设备原子操作). ▶ 源代码:Runtime API #includ ...