Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)

1、背景描述:

日常工作会遇到这样的问题,工作群中收到以截图方式转发的表格或文字信息,需要将其中大量的数据、文字等信息从图片中摘取下来,并以Excel表格的方式进行存储和统计处理。

2、流程简述:

  1. 识别图片中的信息(文字和数据)
    应用pytesseract识别图片中的文字(英文、中文)和数据并转换为字符串
  2. 按需求提取关键信息
    应用正则表达式提取有用的关键信息(文字和数据):如日期、地点、电话号码、数量等
  3. 整理为数据表格(DataFrame),并保存至Excel表格中
    整理提取的信息,合并为数据表格,并且写入和保存至Excel表格中

3. 测试环境的准备:

  1. 安装好pytesseract库和Pillow库
    pytesseract库:pip install pytesseract – 用于将图片中的文字、数据的识别并转换为字符串
    Pillow库:pip install pillow – 用于将输入的图片文件转换为image

  2. 下载tesseract-ocr的应用程序并安装好
    注意:请记录好安装地址,将用于更改系统配置和保存用于中文识别的数据文件
    Tessoract_OCR的下载地址:https://digi.bib.uni-mannheim.de/tesseract/
    在这里插入图片描述
    我的Tesseract-OCR安装路径为:C:\Program Files (x86)\Tesseract-OCR

  3. 下载用于中文识别的中文字库文件并且将它们拷贝到Tesseract-OCR中的"tessdata"文件夹中:
    如下图所示,tessdata文件夹路径为:C:\Program Files (x86)\Tesseract-OCR\tessdata
    Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)_第1张图片
    中文字库文件的下载地址: https://tesseract-ocr.github.io/tessdoc/Data-Files
    在这里插入图片描述
    chi_sim – 中文简体; chi_tra – 中文繁体

  4. 配置系统变量(2个操作步骤)
    步骤一:环境变量中的修改(path): 增加 C:\Program Files (x86)\Tesseract-OCR, 如下图所示
    Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)_第2张图片

    步骤二:因为需要使用中文辨识,需要配置系统变量:TESSDATA_PREFIX, 如下图所示
    TESSDATA_PREFIX变量设置为:C:\Program Files (x86)\Tesseract-OCR\tessdata
    Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)_第3张图片

  5. 修改相关文件路径(2个步骤)
    步骤一:路径的寻找:anaconda–>lib–>site-packages–>pytesseract 下的pytesserac.py文件:
    Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)_第4张图片

    步骤二:文件的修改:
    将tesseract_cmd = ‘tesseract.exe’ 修改为:tesseract_cmd = ‘C:/Program Files (x86)/Tesseract-OCR/tesseract.exe’
    Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)_第5张图片
    温馨提醒:环境准备的步骤比较复杂繁琐,但是在测试前必须要一一完成,否则系统会一直报错!!

4、示例演示(Python代码)

准备导入的测试图片为:
Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)_第6张图片

4.1 识别图片中的信息(文字和数据)

# 4.1 导入图片文件,转换为image,识别其中的
import pandas as pd
import pytesseract
from PIL import Image

# 设定好输入图片和输出表格文件的地址
infile = r"D:\1.png"
outfile = r"D:\result.xlsx"
# 将导入的图片转换为image, 
image = Image.open(infile)
# lang="chi_sim"是指使用中文数据来识别图片中的中文信息
result = pytesseract.image_to_string (image, lang='chi_sim')
result

Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)_第7张图片

小结:上述结果可以观察到:中文、英文字母和数字的辨析准确率还不错,有错误:“粑体1008”, 正确的信息是"粉体Y1008";另外,中文字体之间,中文字体与英文字母之间,以及文字信息与数据之间都是是空格的,因此在后面的信息截断时需要避开这些空格来截取信息。

4.2 根据需求提取关键信息

需求:提取产品的名称编号和对应的数量

# 4.2 提取图片中的产品名称编号和对应的数量
# 建立函数StringToList:将从图上读取的字符串信息(Str)整里为列表信息(List)
def StringToList(result):
    result = result.strip()
    # 由于中文字体之间、中文字体与英文字母之间,以及文字信息与数字之间都是空格,
    # 因此使用"," 作为每行数据信息的截断标识(一般情况是直接使用空格符" "来截断)
    pattern = re.compile("\n")
    line = pattern.sub(",", result)
    line += ","
    str_li = []
    str0 = ""
    for i in range(len(line)):
        if line[i] == ",":
            str_li.append(str0)
            str0 = ""
        else:
            str0 += line[i]
        i += 1
    return str_li

str_list = StringToList(result)
str_list

在这里插入图片描述

4.3 整理为数据表格(DataFrame),并保存至Excel表格中

由于列表中的元素中含有很多空格,因此不能直接使用空格来提取信息;观察到文字信息与数量之间是由空格的,因此从字段的右边开始,直接截取数字

# 4.3 提取文字信息及数据并整理为DataFrame数据表
# 建立信息提取及转换函数
def ListToDataframe(str_list):
    code, qty = [], []
    # 文字信息与数量之间是由空格的,因此从字段的右边开始截取数字
    for s in str_list:
        if s == "": continue
        s = s[::-1]
        # 考虑到字段中存在很多空格,因此设置split()的参数maxsplit=1
        # 即:只是对于第一个空格进行截取
        s = s.split(" ", maxsplit=1)
        ser2, ser1 = s[0], s[1]  
        ser1 = ser1[::-1]
        ser2 = ser2[::-1]
        code.append(ser1)
        qty.append(ser2)

    df = pd.DataFrame([code, qty]).T
    df.columns = ["产品编号", "数量"]
    return df
    
dataframe = ListToDataframe(str_list)
dataframe.to_excel(outfile)
dataframe

Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)_第8张图片
检查Excel表格:
Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)_第9张图片
小结:成功将数据提取并转换为Excel表格,遗憾的是,数据在转换过程中存在一些错误,辨识的准确率需要进一步提高,当前还需要人工的检查和修正。

5. 结束语:

使用pytesseract库对信息和数据进行提取,多次测试的结果发现,对于同一张图片的提取结果不会都一样,测试结果显示:信息提取的准确性与图片的清晰度、大小、填充颜色等因素有一定的相关性,当然也受限于执行中使用的chi-sim文件的数据质量。

你可能感兴趣的:(python)