【问题标题】:Load nifti image with vtk ()使用 vtk () 加载 nifti 图像
【发布时间】:2015-06-24 03:42:24
【问题描述】:

我正在尝试使用 python 在 vtk 中加载 NIFTI 图像。数据已经使用 nibabel 加载,我可以使用 pyplot 将其可视化(每个图 1 个切片,我的数据是 ndarray)。但我想加载它有一个 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 的新手

【问题讨论】:

    标签: python vtk


    【解决方案1】:

    而且..我可以做到...

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

    【讨论】:

      【解决方案2】:

      你有两种可能:

      1. 直接从 vtk 阅读器重新读取图像。我不确定 vtkNiftiReader 在当前(和您的)python 发行版中是否可用,并且似乎 nibabel 不会以 vtk 已知的格式导出文件
      2. 使用 imageimporter 从数组中导入图像(我猜 img_data 是一个数组)参见http://wiki.scipy.org/Cookbook/vtkVolumeRenderinghttps://github.com/cni/psych204a/blob/master/vtk_render.py 中的示例

      【讨论】:

      • 感谢您的回答...我可以用 nibabel 做到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多