图形验证码内容识别——pytesseract

  • 一、目的
  • 二、实现方式
  • 三、环境准备
  • 四、代码实现
  • 五、拓展


一、目的

我们工作中会遇到一些需要把图片中的文字识别出来使用的例子,比如:图形验证码、提取图片中的文章等

如果工作量比较小或者不需要重复执行的话人工就可以啦,但是恰恰一些场景是需要我们实现自动化识别的

这就很烦,急需一个来实现此功能的方法,我们常用的是OCR识别,但是怎么识别?

pytesseract的语言参数 pytesseract 训练_调用函数

二、实现方式

本文主要是通过python的pytesseract库来实现图片中文字的识别,

实际是通过pytesseract调用tesseract的OCR来进行识别图片中的文案内容,然后把识别出的内容进行打印等操作

三、环境准备

  • pytesseract库
  • 安装:pip install pytesseract【因为要调用pytesseract库所以需要提前安装】
  • tesseract
  • 安装:
  • 语言包讲述 :在安装时记得选择语言包,我们常用的是英文、中文(默认是英文):eng、chi_sim(可以在安装包路径\tessdata下查看是.traineddata文件,缺少的话也可以单独下载:https://developer.aliyun.com/article/832266
  • 设置pytesseract.py调用OCR路径: 【安装好pytesseract之后调用会报错原因是没有指定OCR的路径】
    修改文件:pytesseract库所在文件夹的pytesseract.py文件(没设置路径报错文件点击跳转可以快速进入)

四、代码实现

import pytesseract

def images_to_string(num):
	# 打开本地图片,或者网络获取也可以
    name = '验证码\\'+ str(num) +'.png'
    img1 = Image.open(name)
	
    # 获取图片的长宽用于复杂背景图片文字的定位提取
    w, h = img1.size
    print('Original image size: %sx%s' % (w, h))
    # 因为是PNG图片,像素不是直接以RGB保存的,PNG的每个像素里还有透明度
    
    img1rbg = img1.convert('RGB')

    # 读取全部的像素数据
    src_strlist = img1rbg.load()

    # 获取主干颜色用于提取出确定颜色的文字,防止背景干扰
    # 可以打开图片然后画图工具标一下就能获取到想要颜色的坐标
    data = src_strlist[119, 26]
    print(data)

    # 双层循环开始替换全部的像素点颜色确保只保留符合我们要求的文字颜色
    for x in range(0, w):
        for y in range(0, h):
            # 判断当前点颜色是否等于主干颜色
            co = src_strlist[x, y]
            if co[0] < 30 and co[1] <30 :
                src_strlist[x, y] = (0, 0, 0)
            else:
                src_strlist[x, y] = (255, 255, 255)
    # 输出处理过的图片,用于查看
    nume01 = '验证码\\处理\\'+str(num)+ '.png'
    img1rbg.save(nume01)

    # 直接调用内存里的PIL image对象进行图片识别,这里lang是声明识别文字使用的语言包,默认是英文,chi_sim代表中文
    text = pytesseract.image_to_string(img1rbg,lang='chi_sim')
    # 打印结果
    print(text)
   # 保存 识别出的文字到文本
    with open('验证码\\11.txt','ab') as fier:
        fier.write('\n'.encode())
        fier.write(('这是第几张图片'+str(num)).encode())
        fier.write('\n'.encode())
        fier.write(text.encode())

# 调用函数,提取本地15张图片中的文字到TXT文件
for num in range(15):
    images_to_string(num)

五、拓展

遗留问题:对于规整的文案识别清晰度很高,但是对于一些崎岖的文字/数字识别很容易出问题。