Blog:https://blog.csdn.net/qq_40962368/article/details/89312429(Verification_Code_Identification)
步骤:
(1)获取批量验证码图片(利用某高校登录页面的验证码图片)
(2)为验证码图片做信息标注(手动标记,要确保百分百正确)
(3)利用Tesseract-OCR对验证码图片进行识别并测试识别效果
一、爬取某高校页面的验证码图片100张
打开网址:http://jwxt.qlu.edu.cn/verifycode.servlet,可以看到其验证码图片,且每刷新一次就会产生新的验证码图片
# 使用代理不断访问该网址获取验证码图片,并保存为png格式文件 from urllib import request import time import random def get_and_save_verify(i): try: url = 'http://jwxt.qlu.edu.cn/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 = cv2.medianBlur(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