На основе примера C ++ ReadDICOMSeries я переписал аналог с использованием Observer для перемещения между слайсами (гораздо лучше настроить класс vtkInteractorStyleImage).Вот простой пример, когда вы начинаете с 50-го среза и можете перейти к 60-му, нажав «k», или до 40-го, нажав «l»:
import sys
import numpy as np
import vtk
PathDicomDir = "/path/to/dicom/dir"
reader = vtk.vtkDICOMImageReader()
reader.SetDirectoryName(PathDicomDir)
reader.Update()
viewer = vtk.vtkImageViewer2()
viewer.SetInputData(reader.GetOutput())
viewer.SetSlice(50)
def Keypress(obj, event):
key = obj.GetKeySym()
if key == "e":
obj.InvokeEvent("DeleteAllObjects")
sys.exit()
elif key == "k":
viewer.SetSlice(60)
print("next")
elif key == "l":
print("prev")
viewer.SetSlice(40)
iren = vtk.vtkRenderWindowInteractor()
iren.AddObserver("KeyPressEvent", Keypress)
viewer.SetupInteractor(iren)
viewer.Render()
viewer.GetRenderer().ResetCamera()
viewer.Render()
iren.Start()
PS При запуске появляются два окна.Пожалуйста, дайте мне знать, как удалить один из них.