我相信你确实意识到这是一个活跃的研究领域,这篇文章中描述的算法和方法是基础的,也许有更好/更具体的解决方案,或者完全启发式或基于这些基础方法。
我将尝试描述一些我以前使用过的方法,并在类似的情况下得到了很好的结果(我们在简单的 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.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_contours_begin/py_contours_begin.html
顺便说一句,使用 EmguCV 将代码移植到 c# 是微不足道的,所以不用担心
箭头的标识,包括方向和端点注释。行类型,如果可能的话。
寻找线段有几种方法(例如霍夫变换),这部分的主要问题是其他组件,因为它们通常也被检测为线,所以如果我们先找到组件并从文档中删除它们,检测线会很多更容易,并且错误检测要少得多。
方法
1- 基于不同颜色的图层文档,并在每个所需图层上执行以下阶段。
2- 使用 OCR 检测和提取文本,然后删除文本区域并重新创建没有文本的文档。
3-检测组件,基于轮廓分析和收集的组件数据库,然后删除检测到的组件(已知和未知类型,因为未知形状会增加您在下一阶段的错误检测)并重新创建没有组件的文档,此时以防万一检测我们应该只有行
4-检测线
5-此时,您可以根据检测到的位置从提取的组件、线条和标签中创建逻辑图
希望这可以帮助