在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中测量点到掩码的距离的主要内容,如果未能解决你的问题,请参考以下文章