2011-09-20 56 views
10

比方说,我有一些位图数据(黑色),在这些位图数据上已经有一些线条以矢量格式(绿色)绘制。这些线大致遵循位图数据的形状。在一些地方,线条相交。如何在两条线的交点旁找到4点

所以我想要做的是,知道绿线交点的位置,我如何找到A,B,C和D的位置?

请参见下面的一些例子:

enter image description here

我不知道如何给定线的随机定位解决这个问题并且有时他们甚至没有内部的黑色形状。但是,我想必须有某种方法。任何建议?

+0

你能更加精确:绿色线交叉点应该在**里面吗?A,B,C,D还是A,B,C,D如图所示? – 2011-09-20 05:28:29

+0

使用位图执行此操作可能变得困难/缓慢。你不能把输入作为矢量图形吗? –

+1

我没有看到绿线如何帮助;在图片2中,它们相交于B&C –

回答

3

最简单的方法我能想到的是这样的:

  1. 过滤图像删除绿线。一个简单的方法是使用某种稀疏来填充相邻像素的背景颜色。

  2. 现在你应该有一个只包含黑色(宽)线和白色背景的图像。

  3. 使用角点检测算法再次过滤图像,例如Harris detector。这会给你四个角落。

注:

  1. 根据输入数据时,你可能会超过四个角落。在任何情况下,验证您提取的四个角都确实是交叉点的可能角落是个好主意。

  2. 同样,这是一个非常粗糙的方法,但是如果输入数据和示例图片一样干净,并且绿线和黑线之间的距离不是太大,我认为它可能工作。

0

首先,让我说我对这个问题一无所知,也没有任何经验。所以这只是我的猜测。但我会开始忽视绿线 - 这,顺便说一句,也不像

顺便说一句,这有没有做任何道路?

所以,走绿线。在此之后,像上述四种方法中的任何一种一样,选取一个小方块,直到完成所有这些方块,然后查找具有最大像素黑/白比例的方块。那些应该是那些有“十字路口”的人。通过映射那些与白色像素接壤的黑色像素,您应该拥有道路/场地边界。之后,确定这些点应该很容易。

就像我说的,疯狂的猜测。有趣的问题 - 想知道这些知识丰富的队伍会出现什么。

0

首先,您必须从原始图像中提取边缘以获取描述黑白边框的多边形。

然后,您遍历这些边的点并计算到两条绿线的交点的逐点距离。四个最小的距离来自你正在寻找的点。

这是回答您的问题吗?还是我误解了一些东西?

如果您只想要4个角落,则不需要绿线:只需从边缘提取中取出边界,然后使用Savitzky-Golay滤波器进行平滑处理,然后计算逐点曲率。 刚刚提取曲率最大的点。

0

您需要矢量化二值图像。我们的大学项目是正确的主题 - Corners Toolbox Allowing Processing Binary Images in a Compressed Form(不要被名称混淆 - “压缩”在这里意味着二进制图像首先转换为所谓的角落链表)。

1)将图像转换为角点(参见上述链接的第4章)。然后,您可以使用角点的线插值(第5.5章) - 您可以修改我们的算法,以查看更大线条中的大斜率变化(〜90度)。

2)你不需要绿线。您可以使用骨架化算法来查找黑色部分的骨架(请参阅第5.4章),并用线条插入此骨架(请参阅上述链接的第5.5章)。

如果您对这个项目感兴趣,我可以问同事我们是否可以提供源代码。

0

最简单的方法是镂空。首先分开绿色和黑色/白色图像。在两幅图像上运行一个骨架算法(在OpenCV中也是一个非常简单的形态学操作),并确定交点(可以在骨架图像中使用一个简单的8邻域像素计数来完成:也就是说,对于每个黑像素计数多少像素连接水平,垂直或对角线,如果这个值> = 4,它是一个交叉点)。现在为这些镂空点做一个最近邻居匹配,然后就完成了。

2

我假设你知道如何获得(绿色)矢量线相交的坐标(x,y),所以我将省略那部分。

从最接近(x,y)的像素开始,逐个像素地以方形螺旋(或您喜欢的其他搜索模式)向外行进。在每个步骤中,检查您是否在仅有一个白色Moore neighbour的黑色像素上。如果是这样,那么黑色像素和它的白色邻居触摸(可能是一个共同的角落)的地方是你的一个点(称之为A)。继续前进,直到找到三个(B,C,D)。这些将是最接近绿色交叉点的四个这样的点 - 在您的问题中显示的四个示例中,它们可以正常工作。

但是,如果绿色交叉点是两个黑色交叉点之间的中间点,则该算法将失败;在这种情况下,它将混合来自两个黑色交叉点的点。如果你担心这一点,那么只要你找到了A点,这次重新启动你的行进螺旋,以A为中心,并且进行到你找到B,C,D为止。这实际上是“捕捉“到最近的黑色交叉点。

您可以添加更多的巧妙,以避免搜索同一地区两次;重新启动或重新集中你的搜索模式,一旦你找到了B,并且一旦你找到了C,等等......取决于你想要/需要的想法。

0

您应该能够找到绿线交叉的点以及黑线通过侵蚀(缩小到点)过程交叉的中点。然后使用最接近的一对点算法来查找哪条黑线与绿线交叉点最接近。

然后,您可以从黑线相交处开始搜索。您需要一个优先级队列,根据距离最近的黑线交叉点的距离处理点。将四个相邻点放在队列中的黑线交点处。对于队列中的每个点,您需要检查它是否是白色像素(我们需要那些),检查它之前没有被访问过(在这种情况下跳过),然后将其四个相邻像素添加到队列。前四个白色像素应该是你想要的那个(假设你有一个很好的找到交点的镂空/缩小方法),但是你应该真正采用白色像素,直到找到前四个不相邻的像素。