Учитывая массив трехмерного изображения, вернуть список индексов со значением выше порога и минимальным расстоянием между всеми выбранными индексами? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть массив 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', которые затем слишком близки к другим координатам внутри него. Невозможно сравнить каждую координату с другими координатами, так как из-за большого размера изображения это займет слишком много времени.

Есть идеи? Спасибо

1 Ответ

0 голосов
/ 08 мая 2020

Вы можете заменить проверку порога на:

import numpy as np

arr = np.argwhere(original_array> threshold)

Остальное зависит от вашего arr размера и типа данных (укажите размер изображения и dtype, чтобы помочь лучше). Если количество точек выше порога не слишком велико, вы можете использовать:

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

И проверьте пороговое значение расстояния. Если это большое количество точек, вы можете проверить его через итерацию al oop (я обычно стараюсь избегать изменения массива переменных l oop внутри l oop, но это сэкономит вам много места в памяти и времени в случае большого изображения):

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...