给定一个3D图像数组,返回一个索引列表,其值高于一个阈值,并且所有选择的索引之间有一个最小的距离?

问题描述 投票:0回答:1

我有一个代表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'中删除所有与数组中的其他坐标过于接近的坐标。检查每个坐标与其他坐标的对比是不可能的,因为由于图像非常大,这将花费太长时间。

有什么好办法吗?有什么办法吗?

python numpy
1个回答
0
投票

你可以用以下方法替换你的阈值检查

导入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.        ]]

EDIT每条评论:如果你想忽略沿途的距离,则每一条评论 z 轴,替换这一行。

diff = np.argwhere(np.sum((arr[i+1:,:]-arr[i,:])[:,0:2], axis=1)<=distance)
© www.soinside.com 2019 - 2024. All rights reserved.