как дополнить массив 3d, если он меньше указанного размера - PullRequest
0 голосов
/ 23 сентября 2018

Я работаю над изображениями компьютерной томографии и хочу извлечь небольшой участок, например, из места сканирования на раке (16,40,40) (z, y, x), иногда местоположение находится по углам и не может получитьразмер, который решил раньше, для решения этой проблемы пытался сделать отступы со всех сторон, вот мой код:

M,N,P=(16,40,40)
temp_img = np.ndarray([16,40,40],dtype=np.float32)

                center = np.array([node_z, node_y, node_x])   # nodule center
                v_center = np.rint((center-origin)/spacing)  # nodule center in voxel space (still x,y,z ordering)

                temp_imgtemp_img[:,:,:] = img_array[int(v_center[0]-(M/2)):int(v_center[0]+(M/2)),\
                                   int(v_center[1]-(N/2)):int(v_center[1]+(N/2)),\
                                   int(v_center[2]-(P/2)):int(v_center[2]+(P/2))]
                m,n,p=temp_img.shape
                a1,a2,b1,b2,c1,c2=0,0,0,0,0,0

                if (m,n,p) != (M,N,P):
                    if m != M:
                        a=M-m
                        a1=a/2
                        a2=a-a1

                    if n != N:
                        b=N-n
                        b1=b/2
                        b2=b-b1

                    if p != P:
                        c=P-p
                        c1=c/2
                        c2=c-c1   

                transform=((a1,a2),(b1,b2),(c1,c2))
                temp_img = np.pad(temp_img,transform,'linear_ramp')

                plt.imshow(temp_img[5], cmap='gray')
                plt.title('image')
                plt.grid(which='major', linewidth='0.8', color='red')
                plt.show()

, но я получаю ошибку:

TypeError: `pad_width` must be of integral type.

путем изменения *От 1007 * до a1=a//2, как предлагается в одном из ответов ниже, проблема решена, но я получаю новую ошибку:

could not broadcast input array from shape (20,50,50) into shape (25,50,50)

, которая означает, что моя реальная проблема не решена, потому что, когда попробовал это решениезначение округляется, и форма становится меньше или больше, чем указанная форма.

1 Ответ

0 голосов
/ 23 сентября 2018

Отсюда и ошибка:

a1=a/2

Если a нечетно, a1 будет числом с плавающей запятой.Таким образом, вы должны сделать усеченное деление, например a//2 или округление, и привести обратно к int, как int(round(a/2)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...