在图像中识别Visio图形

4
提供SCADA解决方案时,我们经常会收到最终用户规范的结构控制图(如下所示的类似Visio流程图),通常以PDF格式或作为图像提交。
为了在C#中访问这些内容,我希望使用OpenCV库之一。
我正在研究模板识别,但是似乎不适合开始将其馈入机器学习算法以教它识别预先知道的特定框和箭头形状。
我查看了一些库的多边形函数。 但是,从下面的示例中可以看出,当元素之间没有间隔时,系统会将整个内容视为一个大多边形,存在危险。
注释可能是任何90度旋转,我想使用OCR识别它们以及矩形内的内容。
由于我在这方面没有任何经验,这应该是明显的,所以我希望有人能指点我去适当的兔子洞。 如果有多种方法,请选择数学最少的方法。
更新: 这是我所说类型的图像示例。
需要解决的问题是:
- 识别具有单元格文本的红色矩形(OCR)。 - 识别箭头,包括方向和端点注释。 如果可能,还要识别线型。 - 组件的模板匹配。 - 如果模板匹配失败,则退回到某些折线实体或其他东西。

好的,你到目前为止尝试了什么?除非你展示出你所做的并描述你所面临的问题,否则我们无法真正帮助你。事实是:这个问题与编程无关。真的不是。你需要咨询计算机视觉/图像处理专家。这不是一个简单的问题,我很抱歉。我可以想到一些解决方案,但我仍然不知道哪种方法最好。这次我宁愿保守秘密,但只要去谷歌/必应搜索一下,你就会有一些解决方法的想法。真的! - karlphillip
现在也是承诺投入计算机视觉的好时机,这是一个新的StackExchange提案。这种类型的问题在那里可能会很棒。 - karlphillip
@karlphillip 计算机视觉领域非常广阔(我已经承诺参与SE提案)。有许多子学科似乎是可能的方法,但当考虑样本绘图时,我看到了立即的概念挑战,这些挑战在我的看法中是显而易见的。如果有一个计算机视觉论坛,我肯定会花时间在那里进行研究和提问。这个问题更多的是关于找到正确的事情要做,而不是如何正确地做这件事。你真的试过谷歌搜索吗?你会惊讶于能找到的信息是多么少。 - Tormod
2个回答

3
我相信您已经意识到这是一个活跃的研究领域,本文中描述的算法和方法是基础的,可能有更好/更具体的解决方案,可以完全基于这些基础方法或启发式解决方法。

我将尝试描述一些我以前使用过并在类似情况下获得良好结果的方法(我们曾经处理简单的CAD图纸来查找电网的逻辑图),希望这对您有用。

识别带有文字的红色矩形(光学字符识别)。

对于您的解决方案来说,这个问题很容易解决,因为您的文档质量很高,您可以轻松地调整任何当前免费的OCR引擎(例如Tesseract)以实现您的目的,在90度、180度等情况下不会出现问题,像Tesseract这样的引擎会检测它们(您需要配置引擎,在某些情况下您需要提取检测到的边界并将其单独传递给OCR引擎),您只需要进行一些训练和微调就可以达到最大的准确性。

组件的模板匹配。

大多数模板匹配算法对比例尺敏感,而具有比例不变性的算法非常复杂,因此,如果您的文档在比例和大小上有所变化,我认为您不能通过使用简单的模板匹配算法获得非常准确的结果。

由于您的形状特征非常相似且稀疏,因此无法从SIFT和SURF等算法中获取良好的结果和唯一的特征。

我建议您使用轮廓线,您的形状是简单的,并且您的组件是通过组合这些简单的形状而成的,通过使用轮廓线,您可以找到这些简单的形状(例如矩形和三角形),然后根据组件形状检查轮廓线是否与先前收集的轮廓线相符,例如您的一个组件是由四个矩形组合而成的,因此您可以将相对轮廓线保持在一起,并在检测阶段稍后针对您的文档进行检查。

有很多关于轮廓线分析的文章,我建议您看一下这些文章,它们会给您提供如何使用轮廓线来检测简单和复杂形状的线索:

http://www.emgu.com/wiki/index.php/Shape_%28Triangle,_Rectangle,_Circle,_Line%29_Detection_in_CSharp

http://www.codeproject.com/Articles/196168/Contour-Analysis-for-Image-Recognition-in-C

http://opencv-code.com/tutorials/detecting-simple-shapes-in-an-image/

http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_contours/py

顺便说一下,使用EmguCV将代码移植到C#是微不足道的,所以不用担心。

箭头的识别,包括方向和端点注释。如果可能的话,还要考虑线型。

有几种方法可以找到线段(例如Hough变换),但在这个部分的主要问题是其他组件通常也被检测为线条,因此如果我们先找到组件并将它们从文档中删除,检测线条就会更容易,误检测也会少得多。

方法

1- 根据不同颜色对文档进行分层,并在每个所需的层上执行以下阶段。

2- 使用OCR检测和提取文本,然后删除文本区域并重新创建没有文本的文档。

3- 基于轮廓分析和收集的组件数据库检测组件,然后删除检测到的组件(已知和未知类型都要删除,因为未知形状会增加下一阶段的误检测),并重新创建没有组件的文档,在这一时刻,如果检测良好,我们应该只有线条。

4- 检测线条

5- 此时,您可以根据检测位置从提取的组件、线条和标签创建逻辑图。

希望这些有所帮助。


这很有帮助。谢谢。是否有关于如何从图形中提取简单形状进行轮廓识别的建议?该方法似乎容易受到形状和箭头之间没有空隙的影响,因此具有连接箭头的折线形状将有可能被算法误认为是一个单独的形状。 - Tormod
有不同类型的轮廓逼近,我相信在这种情况下,使用简单逼近(在OpenCV中为CHAIN_APPROX_SIMPLE)可以去除冗余点(例如直线上的点),并压缩轮廓(请查看http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html的最后一张图),通过仅使用关键部分上的点,您可以将先前提取的点与所需组件的相对位置与所提供文档中生成的轮廓区域进行比较。 - user3473830
通过这样做,只需要匹配轮廓区域中所需的点,这在碰撞或连接形状的情况下可能会有更多的点,在这种情况下,我们通常会在轮廓区域中找到更多的组件。希望这可以帮助。 - user3473830
谢谢。我将此标记为答案。我希望不久之后能够启动开发工作来实现这一点。到那时候,我希望能够有运行样本和问题分解。可能会找外部承包商。 - Tormod

2
我无法回答你所有四个问题,但第一个问题“识别带有文本的红色矩形(OCR)”听起来并不难。以下是我的解决方案:
步骤1:将彩色图像分成3层:红色、蓝色和绿色,仅使用红色层进行以下操作。
步骤2:对红色层进行二值化处理。
步骤3:对二值化结果进行连通组件分析,并保留每个连通组件的统计信息(例如blob的宽度和高度)。
步骤4:丢弃大的blob,仅保留与文本相对应的blob。还可以使用布局信息丢弃虚假的文本blob(例如,文本始终在大blob中,文本blob具有水平书写风格等)。
步骤5:对文本组件执行OCR。在执行OCR时,每个blob都会给出一个置信度级别,这可以用于验证它是否为文本组件。

哦,对于造成的混淆我感到抱歉。我之前说“红色”是因为嵌入图像中它们是红色的。但是在这个软件要处理的图像中它们可能不是红色的。 - Tormod

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