使用 OpenCV 检测表

Posted

技术标签:

【中文标题】使用 OpenCV 检测表【英文标题】:Detect table with OpenCV 【发布时间】:2016-01-31 20:05:40 【问题描述】:

我经常使用扫描的文件。这些论文包含我需要手动输入计算机的表格(类似于 Excel 表格)。为了使任务变得更糟,表格可以具有不同数量的列。至少可以说,将它们手动输入 Excel 是很平常的。

我想如果我可以将一个程序用于 OCR,我可以为自己节省一周的工作时间。是否可以使用 OpenCV 和 OCR 检测标题文本区域,检测图像坐标后面的文本。

我可以在 OpenCV 的帮助下实现这一点,还是需要完全不同的方法?

编辑:示例表实际上只是一个标准表,类似于您在 Excel 和其他电子表格应用程序中看到的,见下文。

【问题讨论】:

是的,你可以。但是很难得到 100% 完美的结果,除非你有明确的约束条件。你能展示一些你扫描的表格吗? 您能提供一两份扫描文件吗?扫描质量对最终结果有很大影响。 这个问题有2个部分: 1. 识别和提取表格 2. OCR 第一部分比较容易,你可以找到类似的教程:shogun-toolbox.org/static/notebook/current/… OCR 比较难。根据我的经验,它足够可靠,只有在高质量扫描或打印字体图像的情况下才需要很少的人工干预。制作 OCR 引擎的方式有很多……从 SVM 到深度学习。您可以找到适合您专业知识的教程。 @Datageek,我也在做类似的事情。当每个单元格有更多单词时,如果您设法将行转换为数据,您能分享一下您的经验吗? 【参考方案1】:

这个问题似乎有点老了,但我也在研究一个类似的问题,并得到了我自己的解决方案,我在这里解释一下。

对于使用任何 OCR 引擎读取文本,在获得良好准确性方面存在许多挑战,其中包括以下主要情况:

    由于图像质量差/背景区域中存在不需要的元素/斑点而存在噪点。这将需要一些预处理,如噪声去除,可以使用高斯滤波器或正常中值滤波方法轻松完成。这些也可以在opencv 中找到。

    图像方向错误:由于方向错误,OCR 引擎无法正确分割图像中的线条和文字,导致准确度最差。

    存在行:在进行单词或行分割时,OCR 引擎有时还会尝试将单词和行合并在一起,从而处理错误的内容,从而给出错误的结果。 还有其他问题,但这些是基本问题。

在这种情况下,我认为扫描图像质量非常好且简单,可以使用以下步骤解决问题。

    简单的图像二值化将删除背景内容,只留下必要的内容,如下所示。

    现在我们必须删除在这种情况下是表格网格的线。这也可以使用连接组件和删除大型连接组件来识别。所以我们需要输入到 OCR 引擎的最终图像将如下所示。

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

    字幕标题

    标题! header2 header3

    行1单元1行1单元2行1单元3

    行2单元1行2单元2行2单元3

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

在对 OCR 结果进行后处理后,可以对其进行解析以读取行和列值。

在这种情况下,也可以使用它们的字体信息对工作表标题、标题和正常单元格值进行分类。

【讨论】:

感谢@flamelite 的详细回答。你知道任何可以做到这一点的开源代码吗?您是否发布了您的解决方案? 我不确定是否有任何特定的开源应用程序会执行上述所有步骤。我没有开发任何可以一键完成上述所有操作的应用程序。 您能解释一下您是如何执行第二步的,即移除表格吗? 您可以按照此处docs.opencv.org/3.1.0/d3/dc0/… 的描述获取连接组件中所有像素的列表,然后将这些像素颜色转换为背景颜色。 @flamelite,感谢您分享您的经验。我正在研究类似的东西。您是否还处理过每个单元格会有更多单词的情况,这会使计算单元格内容变得不可能,例如,当有 8 列的行有 10 个单词时?如果是这样,您能分享一下您是如何解决的吗?

以上是关于使用 OpenCV 检测表的主要内容,如果未能解决你的问题,请参考以下文章

视觉检测使用opencv编写一个图片缺陷检测流程

人脸检测实战:使用opencv加载深度学习模型实现人脸检测

使用 OpenCV 进行斑点检测

使用 OpenCV 检测停车位

如何用opencv实现人脸检测与跟踪

如何使用opencv自带工具训练人脸检测分类器