大家好,我是小小明。
最近很多朋友和同事问我如何将图片转Excel表格,老实说这方面现成的工具基本都不好使,不过百度AI有支持进行表格图片识别的接口,我们只要按照百度AI的要求传入相应的数据进行识别即可。
需求与技术点
需求,有两张超长的表格图片:
现在希望将其识别后转成Excel表格。
经查询两张图片的分辨率分别为791×7616和791×7531,可见其长度非常宽。
本文涉及的技术点:
- 图片分段切片
- 图片数据转base64编码
- keyring密钥环的使用
- 百度AI表格识别接口的使用
- 分段表格的合并
主要难点:图片切分如何保证切分处包含完整的单元格
百度AI接口
首先我们进入百度AI,查看开放能力-》文字识别-》表格文字识别:
https://ai.baidu.com/tech/ocr_others/table
查看技术文档:
https://ai.baidu.com/ai-doc/OCR/Ik3h7y238
关于Access Token主要需要注册百度AI账号,创建应用后在应用列表里获取ak和sk:
然后就可以通过指定接口读取。
下面演示一下如何通过python代码获取access_token。
我之前已经通过keyring存储过ak和sk:
关于keyring的安装和使用:https://pypi.org/project/keyring/
所以我可以这样获取ak和sk:
接口对图片数据的要求是:base64编码,编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式。
个人经过实际测试发现,虽然接口支持最大4096像素的识别,但真传入长度超过1000多像素的时候,识别准确率极度下降,所以我们需要对图片进行一定的切分,并转换为base64编码。
下面我们开始测试图片的切片和转换:
图片切分
首先读取一张图片进行测试:
然后现在我们写一个切片算法进行切分:
上述切分算法,以每张图860像素为基准进行切分,不是开头的图片上面补25个像素,保证每个单元格都完整出现在每张图片里。切割效果演示:
注意:前面说了图片切分处如何保证切分处包含完整的单元格是个难点,我最终如何解决这个问题呢?我个人是通过将每张切分图片向前补一些像素来完成这个效果。到底补多少个像素最合适呢,经测试补充单元格内部高度的像素是能保证包含每个单元格的。
对于上图最佳像素补充值是30,可以用截图软件量一下。
当然,如果有条件的话可以实现精准的找到黑线位置进行切分,但这样实现编码起来比较复杂。在补像素已经能够得到效果时,无需进行更复杂的编码。
图片转base64编码
下面我们再准备一个将图片转换为base64编码字符串的方法:
表格图片识别接口
前面查看百度AI的文档看到,API提供了同步和异步两种识别方式,经过实测发现异步不仅编码复杂反而因为网络传输原因比同步接口更慢,所以接下来我们只使用同步接口进行演示。
在用前面的方面获取access_token后,我们测试一下识别第一张图片:
使用同步接口进行识别(指定了is_sync='true'
):
可以看到识别结果中,对于边框不完整的图片数据不会参与识别(最后一条小米集团没有被识别)。
这正是我们想要的效果,说明在下一张切分图片补齐缺少部分的方法可行。
封装一下,再识别第二张图片:
非常好,正好衔接了。
下面可以批量识别该图片的所有图片片段:
可以看到,识别耗时为30秒。
从252条数据以及结尾编号250来看,每行数据都被识别到了,现在将结果保存下来:
批量表格图片识别代码
上面我们经过测试,已经成功识别单张长表格图片,下面我们封装一下上面的过程:
最后识别一下第二张图片并保存:
可以看到250条数据全部都识别出来了。
最终结果合并
下面我们再把两张图片的结果合并一下:
含标题共502条数据,数据条数都正确。
更多Excel合并操作示例:
各类Excel表格批量合并问题的实现思路与案例
至此我们就完成了表格图片到Excel表格转换。
注意:百度AI的表格文字识别每日只有50次免费使用机会,需要珍惜识别资源。
图形化界面开发
考虑以后使用方便,我们可以考虑开发一个简单的界面。
输入参数分别为百度AI的ak和sk,以及图片位置和Excel表保存位置,共四个参数,一个确定按钮。
最终设计界面如下:
界面程序代码:
table_orc.py
的内容:
识别失败时会有如下提示: