Что я хочу сделать, это обрезать том, чтобы удалить все ненужные данные. Например, скажем, у меня есть объем 100x100x100, заполненный нулями, за исключением объема 50x50x50, который заполнен единицами. Как получить обрезанный том 50x50x50 из оригинала?
Вот наивный метод, который я придумал.
import numpy as np
import tensorflow as tf
test=np.zeros((100,100,100)) # create an empty 100x100x100 volume
rand=np.random.rand(66,25,34) # create a 66x25x34 filled volume
test[10:76, 20:45, 30:64] = rand # partially fill the empty volume
# initialize the cropping coordinates
minx=miny=minz=0
maxx=maxy=maxz=0
maxx,maxy,maxz=np.subtract(test.shape,1)
# compute the optimal cropping coordinates
dimensions=test.shape
while(tf.reduce_max(test[minx,:,:]) == 0): # check for empty slices along the x axis
minx+=1
while(tf.reduce_max(test[:,miny,:]) == 0): # check for empty slices along the y axis
miny+=1
while(tf.reduce_max(test[:,:,minz]) == 0): # check for empty slices along the z axis
minz+=1
while(tf.reduce_max(test[maxx,:,:]) == 0):
maxx-=1
while(tf.reduce_max(test[:,maxy,:]) == 0):
maxy-=1
while(tf.reduce_max(test[:,:,maxz]) == 0):
maxz-=1
maxx,maxy,maxz=np.add((maxx,maxy,maxz),1)
crop = test[minx:maxx,miny:maxy,minz:maxz]
print(minx,miny,minz,maxx,maxy,maxz)
print(rand.shape)
print(crop.shape)
Это печатает:
10 20 30 76 45 64
(66, 25, 34)
(66, 25, 34)
, чтоправильно. Однако это занимает слишком много времени и, вероятно, неоптимально. Я ищу лучшие способы достижения того же.
NB:
Подобъем не обязательно должен быть кубоидом, он может иметь любую форму.
Я хочу сохранить зазоры внутри подобъема, только удалить то, что находится "за пределами" обрезаемой формы.