Blog:(Verification_Code_Identification)
步骤:
(1)获取批量验证码图片(利用某高校登录页面的验证码图片)
(2)为验证码图片做信息标注(手动标记,要确保百分百正确)
(3)利用Tesseract-OCR对验证码图片进行识别并测试识别效果
打开网址:.servlet,可以看到其验证码图片,且每刷新一次就会产生新的验证码图片
# 使用代理不断访问该网址获取验证码图片,并保存为png格式文件 from urllib import request import time import randomdef get_and_save_verify(i):try:url = '.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、创建ProxyHandlerproxy = random.choice(proxys)proxy_handler = request.ProxyHandler(proxy) # - 3、创建Openeropener = request.build_opener(proxy_handler) # - 4、导入Openerrequest.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)
将图片上的验证信息,加入至图片的名称内
分别用高斯滤波、中值滤波和双边滤波对图像进行降噪处理(不断调整参数,确定出对应方法的最优参数) - 利用双边滤波函数进行的处理效果较好
# 对数据的处理 blur = cv2.GaussianBlur(img, (3, 3), 0) # 高斯滤波函数 blur = dianBlur(img, 3) # 中值滤波函数 blur = cv2.bilateralFilter(img, 3, 560, 560) # 双边滤波函数
对识别结果进行数据清洗,将会提高识别的准确率
(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
将图像的识别结果与藏在图片文件名中的标签进行比对,测试识别的准确率
import pytesseract import cv2 import os import numpy as np import repath = './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 = sttrue_value = i[-8:-4]print(b + '-----' + true_value)if a == true_value:num += 1print('识别的准确率为:' + 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
转载于:.html
本文发布于:2024-02-02 21:59:40,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170688237946714.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |