介紹如何在 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 陣列的做法也非常類似,都是使用 GetArrayFromImageGetArrayViewFromImage 函數。

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())

參考資料