【验证码识别】 图像处理+tesserocr识别

本文介绍了如何利用tesseract和tesserocr进行验证码识别,包括安装过程、验证码批量爬取、图像处理以及识别精度分析。通过Python的PIL库去除噪声,并在不同验证码类型上进行识别实验,单字符识别精度在45%-65%之间。
摘要由CSDN通过智能技术生成

1.tesseract和tesserocr安装

tesseract
tesserocr

注意版本

  • 这里需要注意两者的版本相容问题

首先装 tesseract

安装

  • 一键安装过后可在箭头处添加语言包,但是由于语言包增加多了的话对之后的验证码识别会有影响,(比如本来只有 62个字符 26+26+10,但是增加了语言包会识别出其他的字符),所以我只下了中文包。然后一键安装完毕。

其次装 tesserocr

  • 前面提到要使两者版本相容,版本不一样会装不起。
  • 建议将下好的tesserocr放在用户目录 C:\Users\XXX 下,因为terminal打开的时候默认是用户目录,所以比较方便安装,除非你想手动进入其他目录。
  • 进入终端输入如下:pip install tesserocr-2.4.0-cp37-cp37m-win_am.whl(后面的这句根据版本要改你懂的=w=)。
  • 下面进行tesserocr识别测试:把这张图 image.png 保存在用户目录下在这里插入图片描述
    在这里我直接打开终端的python输入验证了…
import tesserocr
from PIL import Image
img = Image.open('image.png')
print(tesserocr.image_to_text(img))

在这里插入图片描述

  • 划重点:因为当时并不知道tesserocr的包已经在电脑里面,pycharm里面没有找到,pycharm也不能下tesserocr。但其实pip install的不在pycharm目录里面,而在电脑里面一个文件夹 例如:D:\Anaconda3\Lib\site-packages里面,所以之后pycharm调用的话必须要复制粘贴进pycharm的包目录: .\venv\Lib\site-packages

2.验证码批量爬取

|- Img_download.py
|- image_from_web 储存爬取后图片

import os  # 创建文件夹需要用
import requests  # http客户端
from PIL import Image
IMAGE_URL = "http://my.cnki.net/elibregister/CheckCode.aspx" # 备用图片网址

def img_download(n, address):
	"""
	获取验证码
	n 获取图片数量
	address 图片保存地址
	"""
    os.makedirs('./' + str(address) + '/', exist_ok=True)
    for a in range(n):
        print('No' + str(a) + 'image is downloading')
        r = requests.get(IMAGE_URL)
        with open('./' + str(address) + '/img' + str(a) + '.png', 'wb') as f:
            f.write(r.content)
        Image.open('./' + str(address) + '/img' + str(a) + '.png').save('./' + str(address) + '/img' + str(a) + '.png')

img_download(1000, 'image_from_web')

3.验证码图像处理并识别

图像处理文件

|- img_manage.py
|- image_done 储存处理后图片

import os  # 创建文件夹需要用
# import pytesseract
# pytesseract.pytesseract.tesseract_cmd = r"D:\tesseract_4.0\tesseract.exe"
from PIL import Image
import matplotlib.pyplot as plt
import tesserocr

def sum_9_region_new(img, x, y):
    """
    9邻域框,以当前点为中心的田字框,黑点个数
    :param x:
    :param y:
    :return:
    """
    # todo 判断图片的长宽度下限
    cur_pixel = img.getpixel((x, y))  # 当前像素点的值
    width = img.width
    height = img.height

    if cur_pixel == 1:  # 如果当前点为白色区域,则不统计邻域值
        return 0

    if y == 0:  # 第一行
        if x == 0:  # 左上顶点,4邻域
            # 中心点旁边3个点
            sum = cur_pixel \
                  + img.getpixel((x, y + 1)) \
                  + img.getpixel((x + 1, y)) \
                  + img.getpixel((x + 1, y + 1))
            return 4 - sum
        elif x == width - 1:  # 右上顶点
            sum = cur_pixel \
                  +
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值