1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > opencv ocr文字识别_用OpenCV和OCR识别图片中的表格数据

opencv ocr文字识别_用OpenCV和OCR识别图片中的表格数据

时间:2020-08-06 10:30:03

相关推荐

opencv ocr文字识别_用OpenCV和OCR识别图片中的表格数据

作者:jclian,喜欢算法,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!

在很多时候,我们的数据来源形式是多种多样的,有时候数据(或表格)也会呈现在图片中。那么,我们如何来获取图片中的有用数据呢?当一张图片中含有表格数据的时候,我们可以用OpenCV识别表格中的直线,然后再用OCR技术识别其中的文字。

本文仅作为如何识别图片中的表格的一个例子,希望能给读者一些启示。笔者用到的工具如下:

opencv

pyteressact

numpy

我们用opencv来识别表格中的直线,用pyteressact来识别单元格文字,用numpy做数值处理。我们要识别的示例图片(AI.png)如下:

示例图片 AI.png

我们分以下几步进行识别:

识别表格中的横线,即分割记录(每一行)的横线;

识别表格中的竖线,即每个列的分割线;

找到数据所在的单元格;

利用pyteressact识别单元格的文字。

识别表格中的横线

识别横线之前,我们先创建一个图片表格识别类(ImageTableOCR),如下:

#-*-coding:utf-8-*-

其中self.image为RGB模块的图片,self.gray为灰度模式的图片。

接下来,我们识别图片中的分割两条记录的横线。注意到,相邻两条记录之间的颜色是不一致的,因此,我们利用图片灰度化后,每一行像素的平均值的差的绝对值来作为相邻两条记录的分割线,这样就能检测出分割两条记录的横线了。具体的识别横线的函数的Python代码如下:(接以上代码)

#横向直线检测

首先对图片进行二值化处理,再进行两次中值滤波,这样是为了使相邻两条记录之间的像素区别尽可能大。然后对该图片中的每一行的像素进行检测, 以相邻两行的平均像素差大于120为标准, 识别出分割两条记录的横线。识别后的横线如下:(图片中的绿色线段)

识别横线后的图片

识别表格中的竖线

在这一步中,我们利用opencv中的Hough直线检测方法来检测图片中的竖线。完整的Python代码如下:(接以上代码)

#纵向直线检测

首先我们对灰度图片进行Canny边缘检测,在此基础上再利用Hough直线检测方法识别图片中的直线,要求识别的最大间距为30,线段长度最小为500,并且为竖直直线(x1 == x2),当然,也有一些人为的因素,那就是笔者自己添加了两条竖直直线([[13, 937, 13, 102]],[[756, 937, 756, 102]])。运行上述方法,输出的结果如下:

[[13, 937, 13, 102]]

[[75, 937, 75, 102]]

[[77, 937, 77, 102]]

[[270, 937, 270, 104]]

[[272, 937, 272, 102]]

[[756, 937, 756, 102]]

识别竖直直线后的图片如下:(图片中的红色线段)

识别竖线后的图片

可以看到,图片六条竖直的线段都已经完整标记出来了。

识别图片中的单元格

在识别图片中的单元格之前,我们先来识别每个单元格所在的顶点,也就是上述识别后的横线与竖线的交点。完整的Python代码如下:(接以上代码)

#顶点检测

顶点检测后的图片如下:(图片中的蓝色点即为每个单元格的顶点)

顶点检测后的图片

由此可见,我们识别出来的单元格的顶点是正确的。接着,我们把这些单元格取出来,代码如下:(接以上代码)

#寻找单元格区域

以第一个单元格为例,其图像如下:

第一个单元格的图片

识别单元格的文字

在识别出图片中表格的单元格后,我们可以对该单元格图片进行文字识别,我们使用的OCR工具为Teressact, 其Python的接口为pyteressact 。具体的Python代码如下:(接以上代码)

#识别单元格中的文字

识别后的结果如下:

I-->度一-->开放的人一智能服务平台

2-->肌讯-->互联网综合服务

3-->标为-->人一智能自动化业务、智能屹片

4-->阿里巴巴-->互联网综合服务

5-->平安集口-->人T智能金融研发平仄

6-->华大基因-->精准检测、医疗数据运营服务

d-->搜狗-->综合人T智能解决方案平台

8-->一科大讯飞-->智能语音技术

9-->一中利创汤-->智能终端平台技术

10-->珍山集团-->SaaS级智能营销云平台

i-->商汤科技-->人工智能视觉深度学习平台

12-->神州泰岳-->综合类软件产品及服务

13-->寒武红科技-->深度学对专用的智能盂片

14-->汉王科技-->文字识别技术与智能交工

15-->全志刑技-->智能芯片设计

16-->face旷视科技-->人T智能产品和行业解夷方案

17-->创略科技-->智能客户数据平台

18-->海云数据-->企业级大数据整体运营与分析服务

19-->影渭科技-->视觉技术、智能影像生产企业

20-->智蹈智能-->智能机器人技术提供和平台运萧

下面,我们来统计一下识别的准确率。在原来的表格中,一共是20个数字加上280个汉字(包括标点)加上10个英语字母(包括标点),对于识别的结果,其中数字类识别正确17个,汉字正确256个,英语字母8个,因此,总的识别的准确率为90.6% ,识别的结果还是可以的。

总结

本文仅作为如何识别图片中的表格的一个例子,希望能给读者一些启示。对于不同的图片表格,需要具体问题具体分析。

虽然笔者尽可能把整个过程写得简单明了,但其中的探索过程却是很复杂的。而且值得注意的是,在本文中的检测横线的方法仅适用于相邻两条记录有颜色差别的表格图片。

完整的Python代码如下,希望能给大家一些思考。

#-*-coding:utf-8-*-

热 门 推 荐为你的Python程序加密用Python开发计时器程序硬核 | 用Python给女朋友送一颗彩蛋用Pandas库实现MySQL数据库的读写推荐Python中文社区旗下的几个服务类公众号

免费成为社区注册会员,会员可以享受更多权益

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。