2015-03-23 4 views
3

Я пытаюсь масштабировать 3D-массив размером 64x64x64 (с большим размером без куба), сохраняя соотношение сторон.Массив 3D-массива

Я сделал то же самое в 2D массив как это:

pad = Input.size[1]-Input.size[0] 
padLeft = math.ceil(pad/2) 
padRight = math.floor(pad/2) 

if(pad > 0): 
    paddedInput = np.pad(Input, ((0,0), (padLeft,padRight)), 'constant', constant_values=(0,0)) 
else: 
    paddedInput = np.pad(Input, ((math.fabs(padLeft),math.fabs(padRight)), (0,0)), 'constant', constant_values=(0,0)) 

Output = misc.imresize(paddedInput,(InputHeight,InputHeight)) 

Есть ли способ, чтобы достичь того же в N (= 3) размеры?

Edit: Моя попытка преобразования в 3D:

pad = np.zeros((3,1)) 
pad[0,0] = max(Input.shape) - Input.shape[0] 
pad[1,0] = max(Input.shape) - Input.shape[1] 
pad[2,0] = max(Input.shape) - Input.shape[2] 

paddedInput = np.zeros((max(Input.shape),max(Input.shape),max(Input.shape))) 
print(paddedInput.shape) 

for dimension in range(0,3): 
    padLeft = math.ceil(pad[dimension,0]/2) 
    padRight = math.floor(pad[dimension,0]/2) 
    if((padLeft > 0) or (padRight > 0)): 
     if dimension == 0: 
      paddedInput = np.pad(Input, ((padLeft,padRight),(0,0),(0,0)), 'constant', constant_values=0) 
     elif dimension == 1: 
      paddedInput = np.pad(paddedInput, ((0,0), (padLeft,padRight),(0,0)), 'constant', constant_values=0) 
     elif dimension == 2: 
      paddedInput = np.pad(paddedInput, ((0,0),(0,0), (padLeft,padRight)), 'constant', constant_values=0) 
print(paddedInput.shape) 

Это работает, но размеры, которые получают мягкие обиты с двойным количеством, они должны быть ...

+0

Какие оси вы хотите расширить? – wwii

ответ

2

Ответ использовать подушку, а затем numpy.ndarray.resize():

pad = np.zeros((3,1)) 
pad[0,0] = max(Input.shape) - Input.shape[0] 
pad[1,0] = max(Input.shape) - Input.shape[1] 
pad[2,0] = max(Input.shape) - Input.shape[2] 

paddedInput = np.zeros((max(Input.shape),max(Input.shape),max(Input.shape))) 

paddedInput = np.pad(Input, ((int(math.ceil(pad[0,0]/2)), 
    int(math.floor(pad[0,0]/2))),(int(math.ceil(pad[1,0]/2)), 
    int(math.floor(pad[1,0]/2))),(int(math.ceil(pad[2,0]/2)), 
    int(math.floor(pad[2,0]/2)))), 'constant', constant_values=0) 

paddedInput.resize((64,64,64)) 

Делать накладку на одной строке исправляет ошибки Были.

2

Посмотрите на zoom в scipy.ndimage. Здесь вы указываете коэффициенты масштабирования вдоль каждой оси, а не конечный размер куба, но это легко понять.

inarr = np.ones((32,32,32)) 
outarr = ndimage.zoom(inarr, 2) 
outarr.shape 
(64, 64, 64) 
+0

Можете ли вы привести пример? Моя попытка с test = ndimage.interpolation.zoom (Input, float (Input.shape [0])/target.shape [0]) дает результат, который слишком велик, но сбрасывание фракции дает (0,0,0) size – user2290362

+0

Возможно, вы страдаете от целочисленного деления? Вы не сказали, какими были ваши размеры ввода. – mdurant

+0

Около 190, 60, 170. В идеале я хотел бы сохранить соотношение сторон, я не думаю, что масштабирование позволяет это? Вот почему я заполнил свой 2D-пример – user2290362

Смежные вопросы