OCR 从图片表格中提取数据

自作多情 提交于 2020-07-29 08:50:37

需求分析

一些图片格式的表格数据,需要从中提取完整数据。 需求分析

解题思路

图片中数据位置规则,应该是 Excel 等软件直接导出的。

第一步想到的是互联网上是否直接有该文件提供?因为是中文数据,用 Baidu,Sogou 等几个搜索引擎尝试找了几个关键词,都没有找到。

然后试了一下互联网上几个可以试用的表格 OCR 工具,对于这种有一些些独特格式的表格,没有很好的识别能力,识别结果感人。

最终方案是自己处理图片,切割出独立的图片块数据,做 OCR 识别出内容,这样可以有很好的识别率。

OCR 工具调研

  • tesseract (github #OCR top )
  • easyocr (开源 OCR 新秀)
  • baidu-aip

tesseracteasyocr 都是开源的 OCR 项目,安装完成之后还需要下载模型文件,体积都很大,考验网络稳定性。

baidu-aip 是百度提供的 AI 相关的 api SDK,在百度ai平台上申请账号后提供一些免费额度使用,因为是在线识别,速度会比较快。腾讯也有相关的文字识别 api,免费额度小很多。

识别流程

去除水印

图像的水印深度比字体浅,通过将图像转换成灰度后可以过滤掉浅色的像素即可完全去除水印

img = cv2.imread('1.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.where((gray<200),gray,255)
Image.fromarray(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))

去除水印

分割图像

将图像中的文字块提出来,行可以通过像素点判断,列的位置通过将图片到如 PS ,人工确定每列的具体位置。

OCR 识别

文字可以直接用工具中的对应语言识别,纯数值识别就很容易被干扰。 tesseract 可以通过设置 tessedit_char_whitelist 限定识别的必须为数值。 easyocr 设置 allowlist 限制识别的结果范围。 baidu-aip 没有相关的设置,这个误差就没法避免了。 为了减小不确定性,每个文字块使用3个 OCR 引擎都识别一遍,民主选择结果。

最后

将数据通过 pandas 保存到文件

pf = pd.DataFrame(retData)
pf.to_csv("./out/1.csv", index=False)

demo : https://gitee.com/ider001/ocrDemo.git

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!