使用OpenCV Python测量点到掩模的距离

6
假设我有一个物体的掩码和一个点。我想找到离该点最近的物体掩码上的点。
例如,在我的图纸中,有一个物体,即图像中的蓝色形状(假设内部也是物体掩码的一部分)。红点是我想要找到与物体掩码最接近的距离的点。

image

所以,我想找到粗绿线,因为它是到口罩的最短距离,而不是其他线(粉色,橙色等)。我可以使用以下方法之一来实现此目的:
  • 一种低效的方法是找到所有像素到该点的距离,使用类似于此(暴力法)。
  • 另一种方法是创建许多向口罩的线,其角度差为epsilon,并找到该线上最靠近的点,这也不是很好。
  • 我可以在边缘上创建线,并找到对象边界上每条线的最近点。(这可能没有我想象的那么容易,首先我需要找到外边界等。)
但是,这些方法都不太优雅。我想知道更优雅和最有效的确定方法是什么?

1
查看形态学距离变换。 - fmw42
2个回答

2
你可以使用pointPolygonTest来找到蓝色掩模区域和任意点之间的最近距离
  1. 找到蓝色区域的轮廓,这将是我们的多边形
  2. 如果将距离标志设置为true,则可以找到点和多边形之间的最近距离
  3. closestDist = cv2.pointPolygonTest(contours[0], redPoint, True)

  4. 从此函数中得到的另一个信息是,如果距离为负,则该点在多边形外部,如果该点在多边形边缘上,则距离为0,如果该点在多边形内部,则距离为正数

好的,我今天会检查这个。 - smttsp

1

你可以使用二分搜索的方法:

  • 假设P是你的点,考虑以P为圆心的圆
  • 选择面罩上的任意点M,则通过M的圆将与面罩相交
  • 现在重复执行,如果圆与面罩相交,则减小半径,否则增加半径(按二分搜索的方式)

如果您的面罩没有很好地连接起来,则此方法将无法工作。但是,如果不是这种情况,那么我认为您无法比暴力搜索更好...

总成本应该是圆与面罩相交的线性检查时间乘以二分搜索的对数。


我非常喜欢这个想法。但是,我如何判断圆形是否与掩码相交?有简单的方法吗? - smttsp
1
只需计算两个半圆 y=f(x) 的方程并在其上行走像素即可。 - Julien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接