介紹如何在 Python 中處理 NumPy 與 VTK 兩種影像格式的互相轉換。
以下是在 Python 中將普通的 NumPy 陣列轉為 VTK 影像的範例。
import vtk import numpy as np # 建立三維 NumPy 陣列 npArr = np.zeros([75, 75, 75], dtype=np.uint8) npArr[0:35, 0:35, 0:35] = 50 npArr[25:55, 25:55, 25:55] = 100 npArr[45:74, 45:74, 45:74] = 150 # 建立 vtkImageImport dataImporter = vtk.vtkImageImport() # 將 NumPy 陣列轉為 Bytes arrBytes = npArr.tobytes() # 透過 vtkImageImport 將 Bytes 轉為 VTK 影像 dataImporter.CopyImportVoidPointer(arrBytes, len(arrBytes)) # 直接使用資料,不複製 #dataImporter.SetImportVoidPointer(arrBytes) # 設定影像類型為 unsigned char(uint8) dataImporter.SetDataScalarTypeToUnsignedChar() # 設定 Scalar Components 個數 dataImporter.SetNumberOfScalarComponents(1) # 設定影像大小 dataImporter.SetWholeExtent(0, 74, 0, 74, 0, 74) dataImporter.SetDataExtentToWholeExtent() # 設定 Voxel Size dataImporter.SetDataSpacing(1.0, 1.0, 2.0) # 設定 Origin dataImporter.SetDataOrigin(0, 350, 0) # 匯入影像 dataImporter.Update() # 取得 VTK 影像 vtkImage = dataImporter.GetOutput()
使用 itkwidgets
查看 VTK 影像:
# 使用 itkwidgets 查看 VTK 影像 import itkwidgets itkwidgets.view(vtkImage)
在 vtk.util.numpy_support
中的 numpy_to_vtk
函數可以很方便的將 NumPy 陣列轉為 VTK 影像,但是只能用於 2D 影像:
from vtk.util.numpy_support import numpy_to_vtk # 建立 2D 的 NumPy 陣列 npArr2D = np.zeros([75, 75], dtype=np.uint8) # 轉為 2D 的 VTK 影像 vtkImage2D = numpy_to_vtk(npArr)
若要將 VTK 影像轉為 NumPy 陣列,可以使用 vtk.util.numpy_support
中的 vtk_to_numpy
函數:
from vtk.util.numpy_support import vtk_to_numpy # 從 VTK 影像中取出 NumPy 資料 npArr2 = vtk_to_numpy(vtkImage.GetPointData().GetScalars()) # 設定陣列維度 npArr2 = npArr2.reshape(vtkImage.GetDimensions())