日常工作会遇到这样的问题,工作群中收到以截图方式转发的表格或文字信息,需要将其中大量的数据、文字等信息从图片中摘取下来,并以Excel表格的方式进行存储和统计处理。
安装好pytesseract库和Pillow库
pytesseract库:pip install pytesseract – 用于将图片中的文字、数据的识别并转换为字符串
Pillow库:pip install pillow – 用于将输入的图片文件转换为image
下载tesseract-ocr的应用程序并安装好
注意:请记录好安装地址,将用于更改系统配置和保存用于中文识别的数据文件
Tessoract_OCR的下载地址:https://digi.bib.uni-mannheim.de/tesseract/
我的Tesseract-OCR安装路径为:C:\Program Files (x86)\Tesseract-OCR
下载用于中文识别的中文字库文件并且将它们拷贝到Tesseract-OCR中的"tessdata"文件夹中:
如下图所示,tessdata文件夹路径为:C:\Program Files (x86)\Tesseract-OCR\tessdata
中文字库文件的下载地址: https://tesseract-ocr.github.io/tessdoc/Data-Files
chi_sim – 中文简体; chi_tra – 中文繁体
配置系统变量(2个操作步骤)
步骤一:环境变量中的修改(path): 增加 C:\Program Files (x86)\Tesseract-OCR, 如下图所示
步骤二:因为需要使用中文辨识,需要配置系统变量:TESSDATA_PREFIX, 如下图所示
TESSDATA_PREFIX变量设置为:C:\Program Files (x86)\Tesseract-OCR\tessdata
修改相关文件路径(2个步骤)
步骤一:路径的寻找:anaconda–>lib–>site-packages–>pytesseract 下的pytesserac.py文件:
步骤二:文件的修改:
将tesseract_cmd = ‘tesseract.exe’ 修改为:tesseract_cmd = ‘C:/Program Files (x86)/Tesseract-OCR/tesseract.exe’
温馨提醒:环境准备的步骤比较复杂繁琐,但是在测试前必须要一一完成,否则系统会一直报错!!
# 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
小结:上述结果可以观察到:中文、英文字母和数字的辨析准确率还不错,有错误:“粑体1008”, 正确的信息是"粉体Y1008";另外,中文字体之间,中文字体与英文字母之间,以及文字信息与数据之间都是是空格的,因此在后面的信息截断时需要避开这些空格来截取信息。
需求:提取产品的名称编号和对应的数量
# 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数据表
# 建立信息提取及转换函数
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
检查Excel表格:
小结:成功将数据提取并转换为Excel表格,遗憾的是,数据在转换过程中存在一些错误,辨识的准确率需要进一步提高,当前还需要人工的检查和修正。
使用pytesseract库对信息和数据进行提取,多次测试的结果发现,对于同一张图片的提取结果不会都一样,测试结果显示:信息提取的准确性与图片的清晰度、大小、填充颜色等因素有一定的相关性,当然也受限于执行中使用的chi-sim文件的数据质量。