在C#中查找单个路径以填充图像的所有着色区域

时间:2014-09-01 01:35:54

标签: c# algorithm image-processing aforge

我有一张黑白(二进制)图片。它包含一组黑色斑点,周围是白色。我正在尝试编写一个C#程序,它将找到一条穿过所有阴影区域的路径,同时尽可能多地留下白色区域。这与为任何给定图层找到3D打印机的工具头路径非常相似;它需要填充实体部分,而只需要在需要到达另一个单独的blob时进入空白区域。

例如,这是我创建的测试图像,其中包括我面临的大多数挑战(为简单起见,只有两个blob):

example blobs

我想找到一条穿过所有黑色区域的路径,而只穿过白色一次,在两个形状之间跳跃(它们最接近的地方)。我也希望路径尽可能短。

我的程序是用C#编写的,到目前为止我已经使用AForge进行图像处理,所以我已经可以访问它了。

到目前为止,我得到的最接近的是类似洪水填充的算法。它将从一个角落开始,找到最近的像素(水平第一个,然后垂直),继续路径。但是这些路径并不总是到处都是,而且越过这种路径通常会形成一条漫长且无关紧要的道路。我也试着追踪边缘并向内移动,但是当一个blob有一个非直线路径时它仍然不能很好地工作。搜索也没有提出太多;我尝试搜索与3D打印算法,洪水填充等有关的事情,但没有多少提出来。

那么,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

  1. 填充blob

    • 它们只是填充多边形
    • 将它们转换为闭合凸多边形
    • 的集合
    • 或三角测量
    • 然后渲染为closed polygon filling + triangle/convex polygon rasterisation
    • 展位使用相同的光栅化
    • 所以你会得到一组水平线或垂直线(取决于你如何编码)
    • 所以只需将它们连接到单个折线 enter image description here
    • 还有其他方法来填补这些,但这个方法最容易且容易出错
  2. blob之间的动作

    • 这确实是完整的TSP(见mcdowella答案)
    • 将所有已关闭的多边形作为单独的blob处理
    • 使用启发式(近距离连接blob)
    • 将移动长度限制为解决方案标准

答案 1 :(得分:1)

在黑色区域缩小到点的情况下,这似乎变成了旅行商问题,所以我怀疑没有简单的答案。

这向我建议你计算出所有黑色区域对之间的最近距离,然后对该距离矩阵上的旅行商问题使用一些近似解。搜索找到http://cgm.cs.mcgill.ca/~orm/mind2p.html中描述的最近距离算法。我们想到的TSP近似算法是基于http://en.wikipedia.org/wiki/Minimum_spanning_tree的算法,以及基于比特奇旅行的算法 - 例如在http://www.cs.helsinki.fi/u/jwkangas/daaa2013/sol-II.pdf