I'm processing some large volumetric image data that are present in three dimensional numpy arrays. I'll explain my task with two small 1D arrays. I have one image:
img = [5, 6, 70, 80, 3, 4, 80, 90]
and one segmented and labeled version of that image:
labels = [0, 0, 1, 1, 0, 0, 2, 2]
Each number in labels
represents an object in img
. Both arrays have the same dimensions. So in this example there's two objects in img
:
[5, 6, 70, 80, 3, 4, 80, 90]
and what I'm trying to do now is finding the location of the maximum value of each object, which in this case would be the 3
and 7
. Currently I loop over all labels, create a version of img
which contains only the object corresponding to the current label, and look for the maximum value:
for label in range(1, num_labels + 1):
imgcp = np.copy(img)
imgcp[labels != label] = 0
max_pos = np.argmax(imgcp)
max_coords = np.unravel_index(pos, imgcp.shape)
One problem with this approach is that copying img
in every step tends to create memory errors. I feel like memory management should prevent this, but is there a more memory efficient and possibly faster way to to this task?