Укладка двух 3D-массивов numpy вдоль медианы оси z и сохранение размера меньшего массива

#python #image #numpy #stack #concat

#python #изображение #numpy #стек #конкатенация

Вопрос:

Я хочу сложить два набора изображений (im-series1 = 32x32x16 и im_series2 = 32x32x21) на основе медианы оси z и сохранить смежные значения относительно формы im-series1 1.

введите описание изображения здесь

Ответ №1:

Что вам нужно сделать, это сначала обрезать im_series2, а затем сложить. Обратите внимание, что существует два способа обрезки im_series для соответствия im_series1, оба являются «медианными».

 import numpy as np
im_series2 = np.ones((32, 32, n)) # this is im_series2 as an example
mid = n // 2
im_series2 = im_series2[:, :, mid-8:mid 8] # this is the cropping. [:,:,2:-3] is also valid
print(im_series2.shape)
im_series1 = np.ones((32, 32, 16)) # this is im_series1 as an example
print(im_series1 .shape)
c = np.concatenate((im_series1 , im_series2), axis=-1) # this concatenates them on the z_axis
print(c.shape)
  

Это выводит:

 (32, 32, 16)
(32, 32, 16)
(32, 32, 32)
  

Комментарии:

1. Спасибо, есть ли более общий способ сделать это для стеков изображений? Что-то вроде im_series1(32x32x16), im_series2 (32x32x21), im_series3 (32x32x26), … ->im_series1(32x32x16), im_series2 (32x32x16), im_series3 (32x32x16), …

2. Вы заметили, что есть два способа обрезки im_series2 (см. Мой комментарий в третьей строке), оба в порядке? В вашем более общем случае могу ли я предположить, что последний канал всегда имеет форму 16 5 * x , т.е. 16,26,31,36,41 … ?

3. они оба работают для этого примера. Нет, последний канал имеет произвольную длину. В идеале мне нужна функция, которая принимает медиану последнего канала и расширяет ее на некоторое число в обоих направлениях.

4. хорошо, смотрите мой отредактированный ответ. Это должно работать и для общего случая. Если это решает ваш вопрос, отметьте его как таковой 🙂