2015-06-09 1 views
3

Я пытаюсь загрузить изображение NIFTI в vtk с помощью python. Данные уже загружаются с использованием nibabel, и я могу визуализировать его с помощью pyplot (1 срез на каждый участок, мои данные - ndarray). Но я хочу загрузить его с ImagePlaneWidget ... что-то вроде этого.Загрузить изображение nifti с vtk()

enter image description here

Я не могу загрузить данные как 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 и ВТК

ответ

1

У вас есть две возможности:

  1. Перечитайте изображение непосредственно от читателя ВТК. Я не уверен, что vtkNiftiReader доступен в текущем (и в вашем) дистрибутиве python, и не кажется, что nibabel экспортирует файлы в формате, известном как vtk
  2. Используйте imageimporter для импорта изображения из массива (Я предполагаю, что img_data массив) приведен пример в http://wiki.scipy.org/Cookbook/vtkVolumeRendering или https://github.com/cni/psych204a/blob/master/vtk_render.py
+0

Спасибо за ваш ответ ... Я могу сделать это с nibabel. – kakaw

4

И .. я могу это сделать ...

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

Этот код должен иметь гораздо больше +1 !!! – SeF