使用Python基于OpenCV的验证码识别

锁时之盒使⽤Python基于OpenCV的验证码识别步骤:信号转换器
(1)获取批量验证码图⽚(利⽤某⾼校登录页⾯的验证码图⽚)
(2)为验证码图⽚做信息标注(⼿动标记,要确保百分百正确)
(3)利⽤Tesseract-OCR对验证码图⽚进⾏识别并测试识别效果
⼀、爬取某⾼校页⾯的验证码图⽚100张
# 使⽤代理不断访问该⽹址获取验证码图⽚,并保存为png格式⽂件from urllib import request
import time
import random
def get_and_save_verify(i):
磁疗远红外try:
url = 'jwxt.qlu.edu/verifycode.servlet'
request.urlretrieve(url, './verify_pictures/' + 'verify_' + str(i) + '.png')        print('第' + str(i) + '张图⽚下载
成功')
except Exception:
print('第' + str(i) + '张图⽚下载失败')
def get_proxy():
# 使⽤代理步骤
# - 1、设置代理地址
proxys = [{'http': '39.137.69.10:8080'},
{'http': '111.206.6.101:80'},
{'http': '120.210.219.101:8080'},
{'http': '111.206.6.101:80'},
{'https': '120.237.156.43:8088'}]
# - 2、创建ProxyHandler
proxy = random.choice(proxys)
proxy_handler = request.ProxyHandler(proxy)
# - 3、创建Opener
opener = request.build_opener(proxy_handler)
# - 4、导⼊Opener
request.install_opener(opener)
if __name__ == '__main__':
for i in range(1, 101):
get_proxy()
time.sleep(random.randint(1, 4))
get_and_save_verify(i)
⼆、对验证码图⽚⼿动信息标注
将图⽚上的验证信息,加⼊⾄图⽚的名称内
三、基于Tesseract-OCR识别验证码并评估准确率
1)降噪处理
分别⽤⾼斯滤波、中值滤波和双边滤波对图像进⾏降噪处理(不断调整参数,确定出对应⽅法的最优参数) - 利⽤双边滤波函数进⾏的处理效果较好
# 对数据的处理
blur = cv2.GaussianBlur(img, (3, 3), 0)  # ⾼斯滤波函数
blur = dianBlur(img, 3)  # 中值滤波函数
blur = cv2.bilateralFilter(img, 3, 560, 560)  # 双边滤波函数
2)数据清洗
对识别结果进⾏数据清洗,将会提⾼识别的准确率
(1)验证码中的信息是由字母和数字组成,不存在特殊字符,由于图⽚中含有部分噪⾳,导致识别出现较⼤误差,如果去除识别结果中的特殊字符,只保留数字和字母,识别的效果会在⼀定程度上改进
(2)真实数据都是只占四个位置,所以,可以在第⼀条的基础上,对字符的数量进⾏限制,设置为⼩于等于4
(3)真实数据中不存在⼤写字母,将识别结果⼀律转换为⼩写
# 对结果的处理
st = re.sub(r'[^A-Za-z0-9]+', '', a)
st = st.lower()
if len(st) > 4:
b = st[-4:]
else:
b = st
3)识别&评估
将图像的识别结果与藏在图⽚⽂件名中的标签进⾏⽐对,测试识别的准确率
import pytesseract
import cv2
import os
import numpy as np
import re
path = './verify_pictures/'
数字天线>网络滤波器file_name = []
for k in os.walk(path):
file_name = k[-1]
print('识别值' + '-----' + '真实值')
num = 0
for i in file_name:
img = cv2.imdecode(np.fromfile(path + i, dtype=np.uint8), 1)
# 对数据的处理
blur = cv2.bilateralFilter(img, 3, 560, 560)  # 双边滤波函数    a = pytesseract.image_to_string(blur)
# 对结果的处理
st = re.sub(r'[^A-Za-z0-9]+', '', a)
st = st.lower()
if len(st) > 4:
b = st[-4:]
else:
b = st
true_value = i[-8:-4]
print(b + '-----' + true_value)
if a == true_value:
num += 1
print('识别的准确率为:' + str(num / 31))
识别值-----真实值
vxz2-----vxz2
zvil-----zv11
-----x1zz
3b3m-----3b3m
-----nvnz
venx-----vcmx
x32n-----x32n
vc3c-----vc3c
2zzz-----2zzz
bz11-----bz11
b13m-----b13m
-----nx1z
ncx1-----ncx1
ninz-----xnnz
nxve-----nxvc
lyiz-----1v1z
3nvv-----3nvv
-
----xzcn
xxzb-----xxzb
ninn-----n1nn
viv2-----v1v2
xlbn-----x1bn
3z12-----3z12
nnev-----nncv
cz3m-----cz3m
inx1-----1mx1
zx3c-----zx3c
2vbn-----2vbn
全自动文具盒
nxn-----nxxn
nvwn-----1mvn
z31z-----z31z
识别的准确率为:0.2903225806451613

本文发布于:2024-09-23 04:34:47,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/219769.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:识别   验证码   结果   处理   字母   数字
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议