Вы можете заменить проверку порога на:
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)