我正在处理CT扫描图像,我想从癌症的扫描位置提取一个小补丁,例如(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.
通过将以下问题的答案之一中的a1=a/2
更改为a1=a//2
可以解决上述问题,但出现新错误:
could not broadcast input array from shape (20,50,50) into shape (25,50,50)
这意味着我的真正问题没有解决,因为尝试此解决方案时,值被四舍五入,并且形状变得比指定形状小或乞讨。
答案 0 :(得分:1)
错误源于此:
a1=a/2
如果a为奇数,则a1将为浮点数。因此,您应该进行a//2
之类的截断除法,或者舍入为int(round(a/2))
之类的舍入并返回int。