需求分析
一些图片格式的表格数据,需要从中提取完整数据。
解题思路
图片中数据位置规则,应该是 Excel 等软件直接导出的。
第一步想到的是互联网上是否直接有该文件提供?因为是中文数据,用 Baidu,Sogou 等几个搜索引擎尝试找了几个关键词,都没有找到。
然后试了一下互联网上几个可以试用的表格 OCR 工具,对于这种有一些些独特格式的表格,没有很好的识别能力,识别结果感人。
最终方案是自己处理图片,切割出独立的图片块数据,做 OCR 识别出内容,这样可以有很好的识别率。
OCR 工具调研
- tesseract (github #OCR top )
- easyocr (开源 OCR 新秀)
- baidu-aip
tesseract
和 easyocr
都是开源的 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
来源:oschina
链接:https://my.oschina.net/u/2248663/blog/4405800