介紹如何在 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())
參考資料:ITK