2

有没有办法使用 vtk 从切割平面的 3D 坐标和相关数据(可以是倾斜的)获取 2D 图像?

这是我的代码片段,它读取结构化网格并设置剖切面:

self._reader = vtk.vtkXMLStructuredGridReader()
self._reader.SetFileName(filename)
self._reader.Update()

self._reader.GetOutput().GetPointData().SetActiveScalars("Intensity")

plane = vtk.vtkPlane()
plane.SetOrigin(self._reader.GetOutput().GetCenter())
plane.SetNormal(0, 0, 1)

planeCut = vtk.vtkCutter()
planeCut.SetInput(self._reader.GetOutput())
planeCut.SetCutFunction(plane)

# THIS GIVES THE 3D COORDINATES OF THE POINTS OF THE CUT PLANE
print planeCut.GetOutput().GetPoints()
# THIS GIVES THE DATA ASSOCIATED WITH EACH OF THE POINTS
planeCut.GetOutput().GetPointData().GetAttribute(0)

cutMapper = vtk.vtkPolyDataMapper()
cutMapper.SetInputConnection(planeCut.GetOutputPort())
cutMapper.SetLookupTable(table)
cutMapper.SetScalarRange(0,100)

cutActor = vtk.vtkActor()
cutActor.SetMapper(cutMapper)

self._renderer.AddActor(cutActor)

self._iren.Render()

非常感谢您的帮助

埃里克

4

1 回答 1

2

vtkCutter 产生一个 vtkPolyData 输出。你想要的是 vtkImageReslice。

创建一个 vtkImageReslice 对象,一个 vtkTransform 用作其参数,将图像设置为其输入,然后就完成了。如果要更改切片,请适当修改变换并更新或渲染。

像这样的东西:

reslice = vtkImageReslice()
transform = vtkTransform()
transform.Translate(x,y,z)
transform.Rotate(thetaX, thetaY, thetaZ)
reslice.SetResliceTransform(transform)
reslice.SetInputConnection(blah)
nextAlgorithmOrMapper.SetInputConnection(reslice.GetOutputPort())

注意:SetInput 在 VTK 6.0+ 中已弃用。对于新代码,请使用 first.SetInputConnection(other.GetOutputPort()) 或 first.SetInputData(data) (如果您已经在 6 上,否则,第二种形式仍然是您将拥有的 first.SetInput(data)稍后移植)。SetInputConnection 创建一个算法连接 - 即,如果您在消费者上调用 Update(),生产者也将自动更新,依此类推。如果您使用第二种形式,在 5.x 中它还会创建一个算法连接,但在 6 中,它不会。您必须在每个算法上手动调用 Update。

基本上,当您将两个 vtkAlgorithms 或映射器连接在一起时,请使用 SetInputConnection。

于 2013-10-04T16:52:12.020 回答