我确信您确实意识到这是一个活跃的研究领域,本文中描述的算法和方法是基础的,也许有更好/更具体的解决方案,或者完全启发式的,或者基于这些基本方法的。
我将尝试描述一些我之前使用过的方法,并在类似情况下获得了良好的结果(我们使用简单的 CAD 绘图来查找电网的逻辑图),我希望它会有用。
识别单元格中带有文本的红色矩形 (OCR)。
这对于您的解决方案来说是微不足道的,因为您的文档质量很高,并且您可以轻松地根据您的目的调整任何当前的免费 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.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://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-code.com/tutorials/detecting-simple-shapes-in-an-image/
http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html
顺便说一下,使用 EmguCV 将代码移植到 C# 很简单,所以不用担心
箭头的标识,包括方向和端点注释。线型(如果可能)。
有多种查找线段的方法(例如霍夫变换),这部分的主要问题是其他组件,因为它们通常也被检测为线,所以如果我们先找到组件并将它们从文档中删除,那么检测线就会很多更容易并且错误检测更少。
Approach
1-基于不同颜色的图层文档,并在每个所需的图层上执行以下阶段。
2- 使用 OCR 检测并提取文本,然后删除文本区域并重新创建不含文本的文档。
3-检测组件,基于轮廓分析和收集的组件数据库,然后删除检测到的组件(已知和未知类型,因为未知形状会增加下一阶段的错误检测)并重新创建没有组件的文档,此时如果情况良好检测我们应该只有线
4-检测线
5-此时,您可以根据检测到的位置从提取的组件、线条和标签创建逻辑图
希望这可以帮助