如何使用vtkImageReSlice?

问题描述 投票:0回答:1

我试图使用vtkImageReSlicer从3d vtkImageData对象中提取2d切片。但我似乎无法使配方正确。我做得对吗? 我对ResliceAxes Matrix也有点困惑。它代表一个切割平面吗?如果我移动ReSliceAxes原点它是否也会移动切割平面?当我在vtkImageReSlicer上调用Update时,程序崩溃了。但是当我不调用它时,输出是空的。

这是我到目前为止所拥有的。

#my input is any vtkactor that contains a closed curve of type vtkPolyData
ShapePolyData = actor.GetMapper().GetInput()
boundingBox = ShapePolyData.GetBounds()
for i in range(0,6,2):
     delta = boundingBox[i+1]-boundingBox[i]
     newBoundingBox.append(boundingBox[i]-0.5*delta)
     newBoundingBox.append(boundingBox[i+1]+0.5*delta)

voxelizer = vtk.vtkVoxelModeller()
voxelizer.SetInputData(ShapePolyData)
voxelizer.SetModelBounds(newBoundingBox)
voxelizer.SetScalarTypeToBit()
voxelizer.SetForegroundValue(1)
voxelizer.SetBackgroundValue(0)
voxelizer.Update()

VoxelModel =voxelizer.GetOutput()

ImageOrigin = VoxelModel.GetOrigin()
slicer = vtk.vtkImageReslice()
#Am I setting the cutting axis here. x axis set at 1,0,0 , y axis at 0,1,0 and z axis at 0,0,1
slicer.SetResliceAxesDirectionCosines(1,0,0,0,1,0,0,0,1)
#if I increase the z value, will the cutting plane move up?
slicer.SetResliceAxesOrigin(ImageOrigin[0],ImageOrigin[1],ImageOrigin[2])
slicer.SetInputData(VoxelModel)
slicer.SetInterpolationModeToLinear()
slicer.SetOutputDimensionality(2)
slicer.Update() #this makes the code crash

voxelSurface = vtk.vtkContourFilter()
voxelSurface.SetInputConnection(slicer.GetOutputPort())
voxelSurface.SetValue(0, .999)

voxelMapper = vtk.vtkPolyDataMapper()
voxelMapper.SetInputConnection(voxelSurface.GetOutputPort())
voxelActor = vtk.vtkActor()
voxelActor.SetMapper(voxelMapper)
Renderer.AddActor(voxelActor) 
python-3.x vtk
1个回答
1
投票

我从来没有使用过vtkImageReslice,但我已经使用vtkExtractVOI用于vtkImageData,这可以让你获得类似的结果,我想。以下是使用后者修改的示例:

ImageOrigin = VoxelModel.GetOrigin()
slicer = vtk.vtkExtractVOI()
slicer.SetInputData(VoxelModel)
#With the setVOI method you can define which slice you want to extract
slicer.SetVOI(xmin, xmax, ymin, ymax, zslice, zslice)
slicer.SetSampleRate(1, 1, 1)
slicer.Update()

voxelSurface = vtk.vtkContourFilter()
voxelSurface.SetInputConnection(slicer.GetOutputPort())
voxelSurface.SetValue(0, .999)

voxelMapper = vtk.vtkPolyDataMapper()
voxelMapper.SetInputConnection(voxelSurface.GetOutputPort())
voxelActor = vtk.vtkActor()
voxelActor.SetMapper(voxelMapper)
Renderer.AddActor(voxelActor) 
© www.soinside.com 2019 - 2024. All rights reserved.