Python 使用vtk()加载nifti图像

Python 使用vtk()加载nifti图像,python,vtk,Python,Vtk,我正在尝试使用python在vtk中加载NIFTI图像。数据已经使用nibabel加载,我可以用pyplot可视化它(每个plot 1个切片,我的数据是一个数组)。但我想加载它有一个ImagePlaneWidget。。。像这样的 我无法加载imageplanewidget所需的数据(vtkDataSet)。。。我该怎么做 import nibabel as nib import matplotlib.pyplot as plt import vtk img = nib.load('image

我正在尝试使用python在vtk中加载NIFTI图像。数据已经使用nibabel加载,我可以用pyplot可视化它(每个plot 1个切片,我的数据是一个数组)。但我想加载它有一个ImagePlaneWidget。。。像这样的

我无法加载imageplanewidget所需的数据(vtkDataSet)。。。我该怎么做

import nibabel as nib
import matplotlib.pyplot as plt
import vtk

img = nib.load('image.nii.gz')
img_data = img.get_data()
print img_data.shape

def show_slices(slices):
    fig,axes = plt.subplots(1, len(slices))
    for i, slice in enumerate(slices):
        axes[i].imshow(slice.T, cmap="gray", origin="lower")

slice_0=img_data[100, :, :]
slice_1=img_data[:, 100, :]
slice_2=img_data[:, :, 100]
show_slices([slice_0, slice_1, slice_2])
plt.suptitle("Image")
plt.show()

plane = vtk.vtkImagePlaneWidget()
plane.SetInputData(img_data)

非常感谢,我是python和vtk的新手,您有两种可能性:

  • 直接从vtk读取器重新读取图像。我不确定vtKniftReader在当前(以及您的)python发行版中是否可用,而且nibabel似乎没有以vtk已知的格式导出文件
  • 使用imageimporter从数组(我猜img_数据是数组)导入图像请参见或中的示例
  • 和。。我能做到

    import vtk
    import nibabel as nib
    
    img = nib.load('image.nii.gz')
    img_data = img.get_data()
    img_data_shape = img_data.shape
    
    dataImporter = vtk.vtkImageImport()
    dataImporter.SetDataScalarTypeToShort()
    data_string = img_data.tostring()
    dataImporter.SetNumberOfScalarComponents(1)
    dataImporter.CopyImportVoidPointer(data_string, len(data_string))
    dataImporter.SetDataExtent(0, img_data_shape[0] - 1, 0, img_data_shape[1] - 1, 0, img_data_shape[2] - 1)
    dataImporter.SetWholeExtent(0, img_data_shape[0] - 1, 0, img_data_shape[1] - 1, 0, img_data_shape[2] - 1)
    dataImporter.Update()
    temp_data = dataImporter.GetOutput()
    new_data = vtk.vtkImageData()
    new_data.DeepCopy(temp_data)
    
    #outline
    outline=vtk.vtkOutlineFilter()
    outline.SetInputData(new_data)
    outlineMapper=vtk.vtkPolyDataMapper()
    outlineMapper.SetInputConnection(outline.GetOutputPort())
    outlineActor = vtk.vtkActor()
    outlineActor.SetMapper(outlineMapper)
    
    #Picker
    picker = vtk.vtkCellPicker()
    picker.SetTolerance(0.005)
    
    #PlaneWidget
    planeWidgetX = vtk.vtkImagePlaneWidget()
    planeWidgetX.DisplayTextOn()
    planeWidgetX.SetInputData(new_data)
    planeWidgetX.SetPlaneOrientationToXAxes()
    planeWidgetX.SetSliceIndex(100)
    planeWidgetX.SetPicker(picker)
    planeWidgetX.SetKeyPressActivationValue("x")
    prop1 = planeWidgetX.GetPlaneProperty()
    prop1.SetColor(1, 0, 0)
    
    planeWidgetY = vtk.vtkImagePlaneWidget()
    planeWidgetY.DisplayTextOn()
    planeWidgetY.SetInputData(new_data)
    planeWidgetY.SetPlaneOrientationToYAxes()
    planeWidgetY.SetSliceIndex(100)
    planeWidgetY.SetPicker(picker)
    planeWidgetY.SetKeyPressActivationValue("y")
    prop2 = planeWidgetY.GetPlaneProperty()
    prop2.SetColor(1, 1, 0)
    planeWidgetY.SetLookupTable(planeWidgetX.GetLookupTable())
    
    planeWidgetZ = vtk.vtkImagePlaneWidget()
    planeWidgetZ.DisplayTextOn()
    planeWidgetZ.SetInputData(new_data)
    planeWidgetZ.SetPlaneOrientationToZAxes()
    planeWidgetZ.SetSliceIndex(100)
    planeWidgetZ.SetPicker(picker)
    planeWidgetZ.SetKeyPressActivationValue("z")
    prop2 = planeWidgetY.GetPlaneProperty()
    prop2.SetColor(0, 0, 1)
    planeWidgetZ.SetLookupTable(planeWidgetX.GetLookupTable())
    
    #Renderer
    renderer = vtk.vtkRenderer()
    renderer.SetBackground(0, 0, 1)
    
    #RenderWindow
    renwin = vtk.vtkRenderWindow()
    renwin.AddRenderer(renderer)
    
    #Add outlineactor
    renderer.AddActor(outlineActor)
    renwin.SetSize(800,800)
    
    interactor = vtk.vtkRenderWindowInteractor()
    interactor.SetRenderWindow(renwin)
    
    #Load widget interactors and enable
    planeWidgetX.SetInteractor(interactor)
    planeWidgetX.On()
    planeWidgetY.SetInteractor(interactor)
    planeWidgetY.On()
    planeWidgetZ.SetInteractor(interactor)
    planeWidgetZ.On()
    
    interactor.Initialize()
    renwin.Render()
    interactor.Start()
    

    谢谢你的回答。。。我可以用尼伯尔。