【发布时间】:2021-08-18 22:39:49
【问题描述】:
如何使用 SimpleITK 将 3D MRI 图像转置到新的图像视图,但保持初始视图中的纵横比?这是我的代码:
def show_n_slices(array, start_from=0, step=10, columns=6, figsize=(18,10)):
""" Plot N slices of a 3D image.
:param array: N-dimensional numpy array (i.e. 3D image)
:param start_from: slice index to start from
:param step: step to take when moving to the next slice
:param columns: number of columns in the plot
:param figsize: figure size in inches
"""
array = np.swapaxes(array, 0, 2)
fig, ax = plt.subplots(1, columns, figsize=figsize)
slice_num = start_from
for n in range(columns):
ax[n].imshow(array[:, :, slice_num], 'gray')
ax[n].set_xticks([])
ax[n].set_yticks([])
ax[n].set_title('Slice number: {}'.format(slice_num), color='r')
slice_num += step
fig.subplots_adjust(wspace=0, hspace=0)
plt.show()
def print_sitk_info(itk_image):
""" Prints SimpleITK image information
:param itk_image: SimpleITK image object.
"""
print(f"[INFO]: Shape - {itk_image.GetSize()}")
print(f"[INFO]: Spacing - {itk_image.GetSpacing()}")
print(f"[INFO]: Origin - {itk_image.GetOrigin()}")
print(f"[INFO]: Direction - {itk_image.GetDirection()}\n")
print("[INFO]: Image Info before Resampling to Isotropic Resolution:")
print_sitk_info(itk_image)
show_n_slices(sitk.GetArrayFromImage(itk_image), start_from=20, step=5)
这是我尝试转置图像轴以获得不同图像视图的代码:
array2 = array.transpose(2, 0 ,1)
itk_image2 = sitk.GetImageFromArray(array2)
itk_image2.SetOrigin(itk_image.GetOrigin())
itk_image2.SetSpacing(itk_image.GetSpacing())
itk_image2.SetDirection(itk_image.GetDirection())
array2 = sitk.GetArrayFromImage(itk_image2)
print_sitk_info(itk_image2)
show_n_slices(array2, start_from=30, step=5)
我在这里做错了什么?接下来我需要重新采样图像大小吗?
编辑 [基于 Dave Chens 的回答]:
按正确顺序添加间距的结果:
array2 = array.transpose(2, 0 ,1)
spacing = itk_image.GetSpacing()
itk_image2 = sitk.GetImageFromArray(array2)
itk_image2.SetOrigin(itk_image.GetOrigin())
itk_image2.SetSpacing([spacing[2], spacing[0], spacing[1]])
itk_image2.SetDirection(itk_image.GetDirection())
array2 = sitk.GetArrayFromImage(itk_image2)
print_sitk_info(itk_image2)
show_n_slices(array2, start_from=30, step=5)
SimpleITK 的结果PermuteAxesImageFilter:
pa = sitk.PermuteAxesImageFilter()
pa.SetOrder([2, 0 , 1])
i = pa.Execute(itk_image)
print_sitk_info(i)
show_n_slices(sitk.GetArrayFromImage(i), start_from=30, step=5)
【问题讨论】:
标签: image-processing itk simpleitk medical-imaging