计算图像蒙版中点到一组点的最小距离

时间:2018-09-29 08:37:56

标签: python numpy image-processing pixel opencv3.0

我有一个这样的图像遮罩(differenceM): enter image description here

对于每个单个白色像素(像素值!= 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函数,它将仅检查第一个参数中的true和false值...因此,我编写np.where()函数的方式将不起作用。

我已经考虑过使用嵌套的for循环来解决此问题,但是我试图避免使用for循环,因为我要处理很多图像。

我可以要求解决此问题的建议吗?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

(评论不足)对于距离,您可能需要scipy.spatial.distance.cdist( X, Y )。您可以通过以下简单方法计算最小距离:

from scipy.spatial import distance

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

对于np。在哪里可以提供更多数据结构?多数情况下,一个简单的布尔型掩码会完成此任务...

答案 1 :(得分:0)

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

diffMaskNewArray = np.transpose(np.nonzero(binaryThreshMask))

获取值不为零的点。使用该点数组,我遍历了该数组中的每个点,并将其与蒙版的边界点数组进行了比较,并使用:

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

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