介紹如何在 Python 中處理 NumPy、SimpleITK 與 ITK 三種影像格式的互相轉換。
SimpleITK 轉換為 NumPy 與 ITK
若要將 SimpleITK 格式轉換為單純的 NumPy 陣列,可以使用 GetArrayFromImage 或是 GetArrayViewFromImage。
import SimpleITK as sitk
import itk
import numpy as np
# 以 SimpleITK 讀取影像檔案
sitkImage = sitk.ReadImage("my_image.nrrd")
# SimpleITK 轉為 NumPy 陣列(複製影像)
npImage = sitk.GetArrayFromImage(sitkImage)
# SimpleITK 轉為 NumPy 陣列(共用記憶體)
npImageView = sitk.GetArrayViewFromImage(sitkImage)
若要轉換成 ITK 格式,可以將 NumPy 陣列轉為 ITK 格式之後,再由 SimpleITK 的影像中將影像的 origin、spacing 與 direction 資訊複製過來。
# NumPy 陣列轉為 ITK 影像
IMAGE_DIMENSION = 3
itkImage = itk.GetImageFromArray(npImage,
is_vector = sitkImage.GetNumberOfComponentsPerPixel() > 1)
itkImage.SetOrigin(sitkImage.GetOrigin())
itkImage.SetSpacing(sitkImage.GetSpacing())
itkImage.SetDirection(itk.GetMatrixFromArray(
np.reshape(np.array(sitkImage.GetDirection()), [IMAGE_DIMENSION]*2)))
ITK 轉換為 NumPy 與 SimpleITK
將 ITK 影像轉為 NumPy 陣列的做法也非常類似,都是使用 GetArrayFromImage 或 GetArrayViewFromImage 函數。
import SimpleITK as sitk
import itk
import numpy as np
# 以 ITK 讀取影像檔案
itkImage = itk.imread("my_image.nrrd")
# ITK 轉為 NumPy 陣列(複製影像)
npImage = itk.GetArrayFromImage(itkImage)
# ITK 轉為 NumPy 陣列(共用記憶體)
npImageView = itk.GetArrayViewFromImage(itkImage)
將 ITK 轉換為 SimpleITK 格式的作法也很類似,將 NumPy 陣列轉為 SimpleITK 格式之後,再複製影像的 origin、spacing 與 direction 資訊。
# NumPy 陣列轉為 SimpleITK 影像
sitkImage = sitk.GetImageFromArray(npImage,
isVector=itkImage.GetNumberOfComponentsPerPixel() > 1)
sitkImage.SetOrigin(tuple(itkImage.GetOrigin()))
sitkImage.SetSpacing(tuple(itkImage.GetSpacing()))
sitkImage.SetDirection(itk.GetArrayFromMatrix(itkImage.GetDirection()).flatten())
