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

Blog:https://blog.csdn.net/qq_40962368/article/details/89312429

步骤

(1)获取批量验证码图片(利用某高校登录页面的验证码图片)

(2)为验证码图片做信息标注(手动标记,要确保百分百正确)

(3)利用Tesseract-OCR对验证码图片进行识别并测试识别效果

一、爬取某高校页面的验证码图片100张

使用Python基于OpenCV的验证码识别_第1张图片

打开网址: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

 

转载于:https://www.cnblogs.com/5211314jackrose/p/11307763.html

你可能感兴趣的:(python,人工智能)