如何找到两条线交叉点旁边的4个点

时间:2011-09-20 05:17:59

标签: algorithm math graphics image-processing geometry

假设我有一些位图数据(黑色),其中某些线条以矢量格式(绿色)手绘。这些线大致遵循位图数据的形状。在某些地方,线条相交。

所以我要做的是,知道绿线交叉点的位置,我怎样才能找到A,B,C和D的位置?

见下面的一些例子:

enter image description here

我不知道如何处理这个问题,因为线条随机定位,有时它们甚至不在黑色形状内。但是,我想必须有一些方法。有什么建议吗?

7 个答案:

答案 0 :(得分:3)

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

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

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

  3. 使用角点检测算法(例如Harris detector)再次过滤图像。这将为您提供四个角落。

  4. 注意:

    1. 根据输入数据,您可能会获得四个以上的角落。在任何情况下,最好确认您提取的四个角确实是交叉点的可能角落。

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

答案 1 :(得分:2)

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

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

但是,如果绿色交叉点位于两个黑色交叉点之间,则该算法将失败;在这种情况下,它将混合来自两个黑色交叉点的点。如果你担心这一点,那么一旦你找到A点,重新开始你的行进螺旋,这次以A为中心,然后行进,直到你找到B,C,D。这将有效“捕捉到最近的黑色十字路口。

您可以添加更多聪明,以避免两次搜索同一区域;一旦找到B,重新启动或重新聚焦搜索模式,一旦找到C等,再重新启动或重新聚焦搜索模式...取决于您想要/需要获得的花哨程度。

答案 2 :(得分:0)

首先,我要说我对这个问题一无所知,也没有任何经验。所以这只是我的猜测。但我首先要忽视绿线 - 顺便说一下,这似乎也不是

顺便问一下,这对道路有什么用吗?

所以,走绿线。在那之后,拿一个像你上面的4个中的任何一个小方块,直到你经历所有这些,并寻找具有最大黑/白像素比率的那些。那些应该是具有“十字路口”的人。通过映射与白色像素边界的黑色像素,您应该具有道路/场边界。在那之后,确定这些点应该很容易。

像我说的那样,疯狂的猜测。有趣的问题 - 想知道知识渊博的人将会提出什么。

答案 3 :(得分:0)

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

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

这回答了你的问题吗?或者我误解了什么?

如果您只想要4个角,则不需要绿线:只需从边缘提取边界,然后使用Savitzky-Golay滤镜平滑,并计算逐点曲率。 只需提取最大曲率的点。

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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