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

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

猜你喜欢

转载自www.cnblogs.com/YSPXIZHEN/p/12497887.html