首页 > 解决方案 > 给定一个 3D 图像数组,返回一个索引列表,其值高于阈值且所有选定索引之间的距离最小?

问题描述

我有一个表示 3D 图像的 3D numpy 数组,我想从中创建一个列表,其中包含所有 (x,y,z) 坐标/索引元组,它们都高于某个值,并且与其他坐标有一定距离也高于该特定值。因此,如果坐标 (3,4,5) 和 (3,3,3) 都高于该值,但最小距离为 4,则只有这些坐标中的一个会添加到新数组中(不管哪个) .

我想过做这样的事情:

arr = [(x,y,z) for x in range(x_dim) for y in range(y_dim) for z in range(z_dim) if original_arr[z][y][x]>threshold

获取 arr,其中包含所有高于阈值的坐标。我坚持如何从数组“arr”中删除所有坐标,这些坐标太靠近其中的其他坐标。不可能检查每个坐标与其他坐标,因为图像非常大,需要很长时间。

有任何想法吗?谢谢

标签: pythonnumpy

解决方案


您可以将阈值检查替换为:

将 numpy 导入为 np

arr = np.argwhere(original_array> threshold)

其余的取决于您的arr大小和数据类型(请提供图像大小和 dtype 以更好地帮助)。如果高于阈值的点数不是太高,您可以使用:

from sklearn.metrics.pairwise import euclidean_distances
euclidean_distances(arr,arr)

并检查距离阈值。如果点数很多,可以通过循环迭代进行检查(我通常会尽量避免在循环内更改循环变量数组,但这会在大图像的情况下为您节省大量内存空间和时间):

arr = np.argwhere(original_array>threshold)
for i in range(arr.shape[0]):
  try:
    diff = np.argwhere(np.sum(arr[i+1:,:]-arr[i,:], axis=1)<=distance)
    arr = np.delete(arr, diff+i+1, axis=0)
  except IndexError as e:
    break

您的arr遗嘱包含您想要的坐标:

示例代码的输出:

original_array = np.arange(40).reshape(10,2,2).astype(np.int32)
threshold = 5
distance = 3

arr:

[[1 1 0]
 [4 1 1]
 [8 1 1]]

最终点之间的距离矩阵:

[[0.         3.16227766 7.07106781]
 [3.16227766 0.         4.        ]
 [7.07106781 4.         0.        ]]

编辑:根据评论,如果您想忽略沿z轴的距离,请替换此行:

diff = np.argwhere(np.sum((arr[i+1:,:]-arr[i,:])[:,0:2], axis=1)<=distance)

推荐阅读