使用OpenCV检测表格

8
我经常处理扫描文件。这些文件包含表格(类似于Excel表格),需要手动输入到计算机中。更糟糕的是,这些表格可能具有不同数量的列。手动将它们输入到Excel中无疑是单调乏味的。
我认为,如果我可以编写一个OCR程序,就可以节省一周的工作时间。是否可以使用OpenCV检测标题文本区域并识别检测到的图像坐标后面的文本?
我能否借助OpenCV实现这一点,还是需要完全不同的方法?
编辑:示例表格实际上只是标准表格,类似于Excel和其他电子表格应用程序中所见的表格,请参见下面。

enter image description here


可以,但是要想获得100%完美的结果会很困难,除非你有明确定义的约束条件。你能展示一些扫描表格吗? - Miki
请您提供一两份扫描文档,扫描质量对最终结果有很大影响。 - Miki
1
这个问题有两个部分:
  1. 识别和提取表格
  2. OCR
第一部分相对容易,你可以找到像这样的教程:http://www.shogun-toolbox.org/static/notebook/current/Sudoku_recognizer.htmlOCR相对较难。从我的经验来看,它足够可靠,只需要在高质量扫描或印刷字体图像的情况下很少进行人工干预。制作OCR引擎有很多方法...从SVM到深度学习。你可以找到适合你专业知识的教程。
- Karan Dwivedi
@Datageek,我也在做类似的东西。如果您已经成功将每个单元格中有更多文字的行转换为数据,能否分享一下您的经验? - explorer
1个回答

6
这个问题似乎有点老了,但我也在解决类似的问题,并得出了自己的解决方案,现在在这里解释一下。
使用任何OCR引擎阅读文本都存在许多挑战,包括以下主要情况:
1.由于图像质量不佳/背景区域中存在不需要的元素/斑点而产生噪声。这将需要一些预处理,如噪声去除,可以使用高斯滤波器或常规中值滤波器方法轻松完成。这些也在opencv中提供。
2.图像方向错误:由于错误的方向,OCR引擎无法正确地分割图像中的行和单词,从而导致最差的准确性。
3.存在行:在进行单词或行分割时,OCR引擎有时也会尝试将单词和行合并在一起,从而处理错误的内容,因此给出错误的结果。还有其他问题,但这些是基本问题。
在这种情况下,我认为扫描图像质量相当好,可以使用以下步骤来解决问题。
  1. 简单的图像二值化将去除背景内容,只保留必要的内容,如下所示。 Binary image
  2. 现在我们需要删除线条,这种情况下是表格网格。这也可以使用连接组件识别并删除大的连接组件来完成。因此,我们需要馈送给OCR引擎的最终图像如下所示。

    enter image description here

  3. 对于OCR,我们可以使用Tesseract开源OCR引擎。我从OCR得到了以下结果:

    Caption title

    header! header2 header3

    row1cell1 row1cell2 row1cell3

    row2cell1 row2cell2 row2cell3

  4. 正如我们在这里看到的那样,结果相当准确,但存在一些问题,比如header!应该是header1,这是因为OCR引擎误解了!与1的含义。这个问题可以通过使用基于正则表达式的操作进一步处理结果来解决。

经过后处理OCR结果后,可以解析以读取行和列的值。
在这种情况下,为了分类工作表标题、标题和普通单元格值,可以使用它们的字体信息。

感谢您详细的回答,@flamelite。您知道有哪些开源代码可以实现这个功能吗?您是否已经发布了您的解决方案? - Datageek
1
我不确定是否有任何特定的开源应用程序可以执行所有上述步骤。我没有开发过一个可以一键完成所有这些事情的应用程序。 - flamelite
你能解释一下你是如何执行第二步,即删除表格的吗? - Mooncrater
1
您可以按照此处的描述 https://docs.opencv.org/3.1.0/d3/dc0/group__imgproc__shape.html#gae57b028a2b2ca327227c2399a9d53241 获取连接组件中所有像素的列表,然后将这些像素的颜色转换为背景颜色。 - flamelite
@flamelite,感谢您分享您的经验。我正在处理类似的事情。您是否也遇到过每个单元格都有更多单词的情况,这会使得确定单元格内容变得不可能,例如,当一行有8列且有10个单词时?如果是这样,您能否分享一下您是如何解决的? - explorer
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接