Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码) | 您所在的位置:网站首页 › 文字转换为7行4列的表格 › Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码) |
1、背景描述:
日常工作会遇到这样的问题,工作群中收到以截图方式转发的表格或文字信息,需要将其中大量的数据、文字等信息从图片中摘取下来,并以Excel表格的方式进行存储和统计处理。 2、流程简述: 识别图片中的信息(文字和数据) 应用pytesseract识别图片中的文字(英文、中文)和数据并转换为字符串按需求提取关键信息 应用正则表达式提取有用的关键信息(文字和数据):如日期、地点、电话号码、数量等整理为数据表格(DataFrame),并保存至Excel表格中 整理提取的信息,合并为数据表格,并且写入和保存至Excel表格中 3. 测试环境的准备:安装好pytesseract库和Pillow库 pytesseract库:pip install pytesseract – 用于将图片中的文字、数据的识别并转换为字符串 Pillow库:pip install pillow – 用于将输入的图片文件转换为image 下载tesseract-ocr的应用程序并安装好 注意:请记录好安装地址,将用于更改系统配置和保存用于中文识别的数据文件 Tessoract_OCR的下载地址:https://digi.bib.uni-mannheim.de/tesseract/ 下载用于中文识别的中文字库文件并且将它们拷贝到Tesseract-OCR中的"tessdata"文件夹中: 如下图所示,tessdata文件夹路径为:C:\Program Files (x86)\Tesseract-OCR\tessdata 配置系统变量(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’ 准备导入的测试图片为: 小结:上述结果可以观察到:中文、英文字母和数字的辨析准确率还不错,有错误:“粑体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数据表 # 建立信息提取及转换函数 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
使用pytesseract库对信息和数据进行提取,多次测试的结果发现,对于同一张图片的提取结果不会都一样,测试结果显示:信息提取的准确性与图片的清晰度、大小、填充颜色等因素有一定的相关性,当然也受限于执行中使用的chi-sim文件的数据质量。 |
CopyRight 2018-2019 实验室设备网 版权所有 |