python - 给定一个 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”中删除所有坐标,这些坐标太靠近其中的其他坐标。不可能检查每个坐标与其他坐标,因为图像非常大,需要很长时间。
有任何想法吗?谢谢
解决方案
您可以将阈值检查替换为:
将 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)
推荐阅读
- javascript - 如何在 Vue.js 中使用从一个钩子到另一个钩子的数据?
- c++ - mbed 结合两个程序
- java - 具有相同基础映射器的多个关联
- encryption - STM32 加密库的错误 SHA-1 哈希
- python - OpenCV 轮廓检测
- jquery - 如何检查在一个下拉列表中选择的选项是否在另一个下拉列表中选择
- android - AutoCompleteTextView 与带有文本过滤器的凌空
- android - 如何使用 webview 在线性布局或相对布局上设置按钮
- email - SMTP 客户端的主机名与 PTR 不匹配
- python - Python:是否可以比较函数导入来源?