在OpenCV python中测量点到掩码的距离

Posted

技术标签:

【中文标题】在OpenCV python中测量点到掩码的距离【英文标题】:Measuring the distance of a point to a mask in OpenCV python 【发布时间】:2021-02-17 16:59:24 【问题描述】:

假设我有一个对象和一个点的掩码。我想找到最接近该点的对象遮罩点。

例如,在我的绘图中,有一个物体,图像中的蓝色形状(假设里面也是物体蒙版的一部分)。而红点是我想从中找到距离对象遮罩最近的点。

所以,我想找到粗绿线,因为它是与蒙版的最短距离,而不是其他蒙版(粉红色、橙色等)。我可以使用以下方法之一来做到这一点:

一种低效的方法是使用something like this(蛮力)查找所有像素到该点的距离。 另一种方法是创建多条朝向具有 epsilon 角度差的蒙版的线,并找到该线上最近的点,这也不是很好。 我可以在边缘上创建线,并在对象边界上找到每条线的最近点。 (这可能没有我想的那么简单,首先需要找到外边框等)

但是这些方法都不是优雅的。我想知道确定这一点的更优雅和最有效的方法是什么?

【问题讨论】:

看形态距离变换 【参考方案1】:

你可以做一种二分搜索:

让我们把 P 称为你的观点并考虑以 P 为中心的圆 选择蒙版上的任意一点 M,通过 M 的圆将与蒙版相交 现在重复直到收敛,如果圆与掩码相交,则减小半径,否则增加它(按二分搜索类型数量)

如果你的面具没有很好地连接,这将不起作用,但如果不是这种情况,我怀疑你能比蛮力做得更好......

二分搜索的圆形掩码交叉检查时间日志的总成本应该是线性的。

【讨论】:

我非常喜欢这个想法。但是,我如何判断一个圆圈是否与蒙版相交?有没有简单的方法? 只需计算 2 个半圆 y=f(x) 的方程并在其上行走像素。【参考方案2】:

您可以使用pointPolygonTest 查找蓝色蒙版区域与任意点之间的最近距离

    找到蓝色区域的轮廓,这将是我们的多边形

    如果将距离标志设置为true,则可以找到点与多边形之间的最近距离

    closestDist = cv2.pointPolygonTest(contours[0], redPoint, True)

    我们可以从这个函数中得到的另一个信息是,如果距离为负,则点在多边形外,如果点在多边形边缘,距离为 0,如果点在多边形内部,距离为正多边形

【讨论】:

太好了,我今天会检查这个。

以上是关于在OpenCV python中测量点到掩码的距离的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 测量图像中对象之间的距离

OpenCV错误:bitwise_and抛出掩码和图像大小不同的错误

模板匹配:为 minMaxLoc 创建掩码的有效方法?

实验6Python-OpenCV宽度测量

实验6Python-OpenCV宽度测量

OpenCV测量物体的尺寸技能 get~