Python 计算图像遮罩中的点到一组点的最小距离

Python 计算图像遮罩中的点到一组点的最小距离,python,numpy,image-processing,pixel,opencv3.0,Python,Numpy,Image Processing,Pixel,Opencv3.0,我有一个像这样的图像掩码差异: 对于每一个白色像素值!=0,我要计算从该像素到一组点的最小距离。点集是外部轮廓上的点,将存储为[x_val y_val]的numpy数组。我正在考虑这样做: ... def calcMinDist(dilPoints): ... #returns 2d array (same shape as image) def allMinDistDil(dilMask): dilPoints = getPoints(dilMask) ...

我有一个像这样的图像掩码差异:

对于每一个白色像素值!=0,我要计算从该像素到一组点的最小距离。点集是外部轮廓上的点,将存储为[x_val y_val]的numpy数组。我正在考虑这样做:

...
def calcMinDist(dilPoints):
    ...

#returns 2d array (same shape as image)
def allMinDistDil(dilMask):
    dilPoints = getPoints(dilMask)
    ...
    return arrayOfMinValues

#more code here

blkImg = np.zeros(maskImage.shape,dtype=np.uint8)
blkImg.fill(0) 

img_out = np.where(differenceM,allMinDistDil(dilatedMask),blkImg)

....
但问题是,为了计算从像素点到从getPoints函数获得的一组点的最小距离,我需要传入像素点索引?也但是如果我的理解是正确的,使用这个where函数,它只检查第一个参数中的真值和假值……所以我编写np.where函数的方法不起作用

我考虑过使用嵌套for循环来解决这个问题,但我试图避免使用for循环,因为我有很多图像要处理


我可以问一下解决这个问题的建议吗?任何帮助都将不胜感激

没有足够的代表评论您可能想要的距离。您可以使用以下简单方法计算最小距离:

from scipy.spatial import distance

def min_distance(points, set_of_points):
    return distance.cdist(np.atleast_1d(point), set_of_points).min()

至于np,在哪里可以提供更多关于数据结构的信息?大多数情况下,一个简单的布尔掩码将完成任务…

而不是使用np.where函数查找不为零的特定像素,我应用了:

diffMaskNewArray = np.transpose(np.nonzero(binaryThreshMask))
获取值不是零的点。使用此点数组,我迭代了此数组中的每个点,并将其与遮罩的边界点数组进行比较,并使用:

shortestDistDil = np.amin(distance.cdist(a, b, 'euclidean'))

查找点和边界点集之间的最小距离。

你好,部分原因是您有缩进错误,所以理解有困难。

hi@kevinkayaks,我可以问一下哪些部分吗?另外,我可以问一下缩进误差在哪里吗?也许我会编辑代码使其更清晰。谢谢你的建议@Mstaino!但实际上,我对np.where部分比cdist部分更为困惑。也许下次我应该更清楚地表达我的问题。没问题,也许添加一个数据样本是有用的,因为numpy中的图像格式可能会有所不同。很高兴你找到了解决办法。干杯