Я работаю с большими 3D-изображениями (около 8000x5000x50), которые содержат от 1000 до 10000 помеченных сегментов, т.е. связанных областей целых чисел. Мне нужно найти центр масс для каждого объекта, но то, что я пробовал, слишком медленное. Использование SciPy center_of_mass()
функции, я просто накинут все ярлыки, как это:
coords = []
for label in range(1, n):
print("label " + str(label))
coord = ndimage.center_of_mass(labels, labels, label)
coords.append(coord)
Это отлично работает, но требуется 5 секунд на ярлык. Что может быть более быстрым способом?
Я нашел способ ускорить процесс, получив ограничивающие поля каждого помеченного объекта из большого исходного изображения (называемые labels
), вызвав center_of_mass()
на каждом из них индивидуально и переведя результат обратно в координатное пространство исходного изображения:
coords = []
# Get bounding boxes for all objects in the form of slices
objects = ndimage.find_objects(labels)
# Loop over all objects:
for l in range(1, n):
# Get individual bounding box
bb_slices = objects[l]
# Extract object
obj = labels[bb_slices]
# Compute centroid
coord = ndimage.center_of_mass(obj)
# Translate result from coordinate space of the bounding box back to the source image by simply adding the starting coordinate of each slice
coord_translated = (np.around(coord[0]).astype(np.uint8) + slices[0].start, np.around(coord[1]).astype(np.uint8) +
slices[1].start, np.around(coord[2]).astype(np.uint8) + slices[2].start)
coords.append(coord_translated)
Это занимает около 16 секунд для> 900 объектов по сравнению с по меньшей мере часом для исходного метода.