基于python的验证码识别

在利用python对一些网站进行批量操作的时候,验证码是个绕不过去的东西,虽然现在网上有很多图像识别的api,但是可能不适用于你的项目,我为了批量爬取班上同学的学分绩点写了个简单的图像识别大家可以参考一下我的图像识别的思路。

1. 验证码图片的获取

想要分析验证码,首先就需要获取验证码进行分析,在谷歌浏览器上打开验证码所在页面,打开开发者工具,选择NetWork,然后刷新一下验证码,就可以得到验证码的url地址,具体可以参考伯乐在线上的python计算学分绩点。


有了验证码url以后,我们就可以利用python将验证码图片保存在本地,便于分析,代码如下。

import urllib
import urllib.request
import http.cookiejar  #自己分析出的验证码url
yzmurl = 'http://run.hbut.edu.cn/Account/GetValidateCode?time=1488614613244' #从数据包中分析出,处理post请求的url
posturl = 'http://run.hbut.edu.cn/Account/LogOn'hosturl = 'http://run.hbut.edu.cn/Account/LogOn?ReturnUrl=%2f' #主页url#加载cookie
cj = http.cookiejar.LWPCookieJar()
cookie_support = urllib.request.HTTPCookieProcessor(cj)
opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
urllib.request.install_opener(opener)  #打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
h = urllib.request.urlopen(hosturl) #获取验证码图片
picture = opener.open(yzmurl).read()#保存图片在本地
local = open('d://image.jpg', 'wb')
local.write(picture)
local.close()

2.将彩色图片变为黑白

图片识别因为彩色图片比较复杂,一般把图片变为黑白。先把图片用 ‘cconvert(“L”)’ 转化为256级灰度图像,再根据图片的阈值转化成黑白图像,阈值的合适与否直接影响到黑白图像的轮廓是否清晰从而影响图像识别的准确度。彩色图片转化为黑白详情请参考不剃头的一休哥,阈值的作用及求法请参考阮一峰大牛的相似图片搜索。我的代码如下。

from PIL import Image
#打开图片
im=Image.open("d:\\image.jpg")#将图片转化为灰度
imgry = im.convert("L")#计算阈值
threshold=thresholds(imgry)#转化为黑白图片
table = []
for i in range(256):if i < threshold:table.append(0)else:table.append(1)
out = imgry.point(table,'1')
#阈值计算函数,算法请看上面的链接
def thresholds(im):x,y=im.sizen=x*y#print(n)max=0for i in range(256):n1=0n2=0h2=0h1=0for m in im.getdata():if m>= i:n2+=1h2+=melse:n1+=1h1+=m#print(n1)#print(n2)if n1==0 or n2== 0:continuew1=n1/nw2=n2/nu1=h1/n1u2=h2/n2mile=w1*w2*(u1-u2)**2#print (mile)if mile >max:max=miletreshold=ielse:continue#print (max)return treshold

3.图片降噪

现在的验证码为了防止很轻易的被代码识别出来,往往会在制作验证码的时候加入很多噪声用来干扰,想要识别图片的话,就必须要降噪。
参考网上的文章之后,我用单位面积内点的密度来进行计算。于是首先计算单位面积内点的个数,将单位面积内点个数少于某一指定数的面积去除,剩余的部分基本上就是验证码字符的部分。详情请参照小五义的验证码降噪。

我的降噪代码

change=out.convert("P")
pointmidu(out)#计算规定面积内黑色像素的个数
def numpoint(im):w,h = im.sizedata = list( im.getdata() )mumpoint=0for x in range(w):for y in range(h):if data[ y*w + x ] !=255:#255是白色mumpoint+=1return mumpoint#计算3*3范围内点的密度,具体大小根据自己情况而定
def pointmidu(im):w,h = im.sizep=[]for y in range(0,h,3):if(y+3>h):d=helse:d=y+3for x in range(0,w,3):if(x+3>w):m=welse:m=x+3box = (x,y, m,d)im1=im.crop(box)a=numpoint(im1)if a<2:##如果3*3范围内小于2个点,那么将该部分全部换为白色。这个也是根据自己的情况来决定for i in range(x,m):for j in range(y,d):im.putpixel((i,j), 255)#保存降噪后的图片im.save('d:\image1.gif')

4.图片的分割

验证码识别是一个一个的识别,所以需要把验证码图片上的数字或字母分割出来,用windows自带的画板打开验证码图片,就可以粗略的找到分割点,之后再根据分割情况调整分割点。可以参考不剃头的一休哥。分割完之后,就可以进行识别了。

5.图像识别

图像分割完之后就可以进行识别了,要识别首先得有样本,所以先建立一个文件夹,然后在里面建立0-9的文件夹,用来存放样本,由于之前没有样本所以需要人工的识别几张分割好的图片,并把它放在对应的文件夹中,确保每个文件夹里至少有一张就可以了。
然后开始识别流程,识别用的是比较2个图片向量的余弦夹角,具体请参考wusuopuBUPT的专栏。
将要识别的图片与样本空间里所有的样本进行求余弦夹角,然后找出将结果进行排序,找出相似度最高的一个,如果相似度大于95%就抛弃,小于95%就保存在一个地方,写一个循环让这段代码执行一段时间,然后再人工的把保存的图片放在相应的文件夹中,这样样本就比较丰富,确保了识别的准确率,我这个的识别率是100%(当然我们学校的验证码全部由数字组成比较简单)。

图像识别代码如下(样本空间已经生成完毕)

from PIL import Image
import os
import time
import re
import math
import urllib
import urllib.request
import http.cookiejar
import string
from html.parser import HTMLParser
from urllib.parse import urlparse
from time import sleep
#import pytesseract#计算阈值
def thresholds(im):x,y=im.sizen=x*y#print(n)max=0for i in range(256):n1=0n2=0h2=0h1=0for m in im.getdata():if m>= i:n2+=1h2+=melse:n1+=1h1+=m#print(n1)#print(n2)if n1==0 or n2== 0:continuew1=n1/nw2=n2/nu1=h1/n1u2=h2/n2mile=w1*w2*(u1-u2)**2#print (mile)if mile >max:max=miletreshold=ielse:continue#print (max)return tresholddef numpoint(im):w,h = im.sizedata = list( im.getdata() )mumpoint=0for x in range(w):for y in range(h):if data[ y*w + x ] !=255:#255是白色mumpoint+=1return mumpoint#计算3*3范围内点的密度
def pointmidu(im):w,h = im.sizep=[]for y in range(0,h,3):if(y+3>h):d=helse:d=y+3for x in range(0,w,3):if(x+3>w):m=welse:m=x+3box = (x,y, m,d)im1=im.crop(box)a=numpoint(im1)if a<2:##如果3*3范围内小于2个点,那么将该部分全部换为白色。for i in range(x,m):for j in range(y,d):im.putpixel((i,j), 255)im.save('d:\image1.gif')def magnitude(concordance):total = 0for word,count in concordance.items():total += count ** 2return math.sqrt(total)#计算矢量之间的 cos 值
def relation(concordance1, concordance2):relevance = 0topvalue = 0for word,count in concordance1.items():if word in concordance2:topvalue += count * concordance2[word]return topvalue / (magnitude(concordance1) * magnitude(concordance2))#把图片转化为向量
def buildvector(im):d1 = {}count = 0for i in im.getdata():d1[count] = icount += 1return d1#验证码url
yzmurl = 'http://run.hbut.edu.cn/Account/GetValidateCode?time=1488614613244'   #从数据包中分析出,处理post请求的url
posturl = 'http://run.hbut.edu.cn/Account/LogOn' #主页url
hosturl = 'http://run.hbut.edu.cn/Account/LogOn?ReturnUrl=%2f' #加载cookie
cj = http.cookiejar.LWPCookieJar()
cookie_support = urllib.request.HTTPCookieProcessor(cj)
opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
urllib.request.install_opener(opener)  #打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
h = urllib.request.urlopen(hosturl)#获取验证码并保存在本地
picture = opener.open(yzmurl).read()
local = open('d://image.jpg', 'wb')
local.write(picture)
local.close()#加载训练集
iconset = ['0','1','2','3','4','5','6','7','8','9']
imageset = []
for letter in iconset:temp = []for img in os.listdir('./yzm/%s/'%(letter)):        temp.append(buildvector(Image.open("./yzm/%s/%s"%(letter,img))))imageset.append({letter:temp})#变为黑白图片
im=Image.open("d:\\image.jpg")
imgry = im.convert("L")
threshold=thresholds(imgry)
table = []
for i in range(256):if i < threshold:table.append(0)else:table.append(1)
out = imgry.point(table,'1')
change=out.convert("P")#降噪
pointmidu(change)#分割图片
im2=Image.open(r"d:\image1.gif")
letters = [(7,15),(16,24),(25,33),(35,43)]
ocr=[]
for letter in letters:im3 = im2.crop(( letter[0] , 0, letter[1],im2.size[1] ))#将图片与所有样本比较并排序guess = []for image in imageset:for x,y in image.items():if len(y) != 0:for i in range(len(y)):             guess.append( (relation(y[i],buildvector(im3)),x) )guess.sort(reverse=True)ocr.append(guess[0][1])#得到识别出来的验证码
yzm=''
for i in range(len(ocr)):yzm+=ocr[i]
print(yzm.strip())  

第一次写技术类文章,写的不好请多多包涵

基于python的验证码识别相关推荐

  1. 基于Python的验证码识别技术

    基于Python的验证码识别技术 作者:强哥 概述 前言 准备工作 识别原理 图像处理 切割图像 人工标注 训练数据 检测结果 搞笑一刻 福利一刻 推荐阅读 前言 很多网站登录都需要输入验证码,如果要 ...

  2. 毕业设计 - 题目:基于python的验证码识别 - 机器视觉 验证码识别

    文章目录 0 前言 1 项目简介 2 验证码识别步骤 2.1 灰度处理&二值化 2.2 去除边框 2.3 图像降噪 2.4 字符切割 2.5 识别 3 基于tensorflow的验证码识别 3 ...

  3. python验证码识别库底色深_基于机器学习的验证码识别

    基于机器学习的验证码识别 目录说明 ├── . ├── catpcha_images 验证码采集存储目录 ├── thred_images二值化图片存储目录 ├── noised_images降噪图片 ...

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

    关于利用python进行验证码识别的一些想法 - 小五义 - 博客园 关于利用python进行验证码识别的一些想法 转载请注明:@小五义http://www.cnblogs.com/xiaowuyi ...

  5. python人脸识别训练模型_开源 | 基于Python的人脸识别:识别准确率高达99.38%!

    原标题:开源 | 基于Python的人脸识别:识别准确率高达99.38%! 该库使用 dlib 顶尖的深度学习人脸识别技术构建,在户外脸部检测数据库基准(Labeled Faces in the Wi ...

  6. python名片识别_基于Python的名片识别接口调用代码实例

    基于Python的名片识别接口调用代码实例 代码描述:基于Python的名片识别接口调用代码实例 #!/usr/bin/python # -*- coding: utf-8 -*- import js ...

  7. 【摸鱼神器】基于python的BOSS识别系统

    [摸鱼神器]基于python的BOSS识别系统 前言 一.整体设计 二.调用摄像头 三.人脸识别 1. 构建白名单库 2. 人脸匹配 四.切换屏幕 五.完整代码 写在最后 前言 Tip:本文仅供技术学 ...

  8. python 实现验证码识别

    python 实现验证码识别 环境安装 1.1 python安装(此处不详细介绍,自行百度) 1.2 安装Tesseract-OCR 第一步:依赖安装 第二步:下载安装Leptonica 第三步: 下 ...

  9. 基于Python的人脸识别课堂考勤系统(毕设)

    一个菜鸟搞毕业设计的过程分享,可能对迷茫的你起到一点点作用! 序言 在着手开发项目之前我们一定要对系统进行一个初步的规划,比如系统可以实现什么功能,是否需要开发GUI页面(大部分导师都会让你搞一个,仅 ...

最新文章

  1. Swift 3 新特性
  2. Mybatis使用总结
  3. web前端开发职业技能证书_1+x证书web前端开发职业技能等级标准1
  4. java printwriter实例_PrintWriter做过滤流+FileWriter案例分析
  5. linux反序列化漏洞,思科多个产品Java反序列化漏洞(CVE-2015-6420)
  6. OSChina 周三乱弹——真相往往令人内牛满面
  7. 2021青海省普通高考成绩查询,青海省教育考试网:2021年青海高考成绩查询入口、查分系统...
  8. IDEA中控制台中文乱码问题
  9. matplotlib制作多张图
  10. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第4节 maven生命周期和概念模型图_09maven概念模型图...
  11. 物流配送信息管理系统java_基于jsp的物流配送管理系统-JavaEE实现物流配送管理系统 - java项目源码...
  12. xapp1025仿真
  13. Ajax传参里面含有特殊字符
  14. 英语复数名词的变化规则
  15. 特价机票退票费高达80% 律师称航班延误应补偿-特价机票-退票费-霸王条款
  16. 苹果4如何添加时间插件_Pr快速批量制作和添加字幕,节省时间还不用插件的做法...
  17. 头牌知产介绍速冻水饺商标属于哪一类
  18. 远程IO模块16DO开关量输出采集远程模块
  19. Python基础(类与对象)
  20. 新浪cn邮箱设置收件和发件服务器信息,新浪cn邮箱如何设置

热门文章

  1. SAP750版本设置免输密码登录方式
  2. ADO.NET系列之操作XML
  3. 移动端 范围筛选html,移动端多项筛选中的「不限选项」,到底该怎么用?
  4. r语言中mpg数据_零基础生信入门第一课——R语言数据清洗,超详细讲解,建议收藏!...
  5. 92. 递归实现指数型枚举
  6. Magento产品增加自定义属性
  7. 这是您现在可以免费获得的115张Coursera证书(在冠状病毒大流行期间)
  8. 通用业务平台设计(五):预警平台建设
  9. C#在控件中绘制矩形、圆、线段等(切换不同的图片,自定义翻页控件,通过委托监控某个字段)
  10. android 驾考软件开发,安卓模拟驾考游戏软件