使用OpenCV检测表

Dat*_*eek 5 opencv vision computer-vision

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

如果我能把程序放到OCR上,我想我可以节省一周的工作时间.是否可以使用OpenCV检测标题文本区域,并检测检测到的图像坐标后面的文本.

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

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

在此输入图像描述

fla*_*ite 5

这个问题看起来有点旧,但我也在研究类似的问题并得到了我自己的解决方案,我在这里解释.

对于使用任何OCR引擎阅读文本,有很多挑战,以获得良好的准确性,包括以下主要情况:

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

  2. 图像方向错误:由于方向错误,OCR引擎无法正确分割图像中的线条和单词,从而导致精度最差.

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

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

  1. 简单的图像二值化将删除背景内容,只留下必要的内容,如此处所示. 二进制图像
  2. 现在我们必须删除在这种情况下是表格网格的行.这也可以使用连接组件识别并删除大型连接组件.因此,我们需要提供给OCR引擎的最终图像将如下所示.

    在此输入图像描述

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

    标题标题

    头球攻门!header2 header3

    row1cell1 row1cell2 row1cell3

    row2cell1 row2cell2 row2cell3

  4. 正如我们在这里看到的那样,结果非常准确,但是有些问题就像标题一样 !这应该是header1,这是因为OCR引擎误解了!通过使用基于Regex的操作进一步处理结果,可以解决此问题.

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

此外,在这种情况下,为了对表格标题,标题和正常单元格值进行分类,可以使用它们的字体信息.