如何在OpenCV中找到行的端点?

时间:2017-02-14 20:03:15

标签: opencv image-processing

我有一个由线条组成的图像;如何使用OpenCV找到端点?

线条宽约20像素。它们转动,分支,并且可以成角度(尽管大多是水平和垂直)。请注意,霍夫不会工作,因为我的线条不直。 (也许这会使它们成为轮廓?)

我看了this answer,但它找到了极端点,而不是终点。我看了this,但我认为goodFeaturesToTrack()也会选择角落。也许使用细化算法,虽然OpenCV似乎没有?

下图显示了样本输入(蓝色)和所需的端点(洋红色)。

Lines with endpoints marked

4 个答案:

答案 0 :(得分:3)

I speak Chinese, while my English is poor

所以我只是发布我的核心步骤。

查找行端点的一般方法是:

  1. Binary灰色图片。
  2. 找到二进制图像的skeleton
  3. 在骨架上执行hit-miss操作(所有终点)或goodFeaturesToTrack(所有角落包括终点)。
  4. 注意:

    您应该选择一个好的skeleton方法,以确保端点不会缩小(我的示例为shrink)。

    结果就是这样。

    enter image description here

    这是一个使用hit-miss查找特殊点的演示。 enter image description here

答案 1 :(得分:2)

您可以按照here所述创建形态骨架(您谈到的细化算法),我的实现是here。然后你可以遍历骨架,只是以各种方式寻找它的结尾。

答案 2 :(得分:1)

对我来说最简单的方法是将图像细化为1px厚度,然后使用命中和未命中变换来检测端点。不幸的是,OpenCV中没有实现这些功能。通过命中或未命中变换也可以获得细化。您只需要在以下链接中详细描述: http://homepages.inf.ed.ac.uk/rbf/HIPR2/thin.htm

如果您对此有任何问题,请告诉我,因为我已全部实施。命中或错过变换可能非常古老而简单,但它是一个非常强大的工具。

答案 3 :(得分:1)

如果你的端点总是水平或垂直,你也可以尝试用一个简单的内核(方形应该等于你的线宽)和背景(宽度应该等于相邻端点之间的最小距离)来卷积图像。 。方形和背景的颜色(或强度)应与图像上的颜色(或强度)匹配。

在这种情况下,端点将沿着“两侧”沿着3“边”,线段和角“”匹配内核,其他形状应该具有较弱的响应。通过适当地阈值响应,您应该能够获得端点位置。

这种方法应该比你当前确定的方法更简单,更快(如果实施得当),但根据输入可能会有一些怪癖。不幸的是,我没有时间尝试实施它。