一:主要的知识点
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①等值面提取,②多重采样的含义
二:代码及注释
python
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersCore import vtkMarchingSquares
from vtkmodules.vtkFiltersGeneral import vtkContourTriangulator
from vtkmodules.vtkIOImage import vtkPNGReader
from vtkmodules.vtkRenderingCore import vtkActor, vtkDataSetMapper, vtkRenderWindow, vtkRenderWindowInteractor, \
vtkRenderer
def main():
file_name = 'Data/fullhead15.png'
iso_value = 500
colors = vtkNamedColors()
reader = vtkPNGReader()
reader.SetFileName(file_name)
reader.Update()
iso = vtkMarchingSquares()
iso.SetInputConnection(reader.GetOutputPort())
"""
0表示等值线的索引,vtkMarchingSquares 可以同时提取多条不同数值的等值线
iso_value 就是图像里像素值 = 500 的位置所形成的等值线
"""
iso.SetValue(0, iso_value)
iso_mapper = vtkDataSetMapper()
iso_mapper.SetInputConnection(iso.GetOutputPort())
iso_mapper.ScalarVisibilityOff()
iso_actor = vtkActor()
iso_actor.SetMapper(iso_mapper)
iso_actor.GetProperty().SetColor(colors.GetColor3d("MediumOrchid"))
poly = vtkContourTriangulator()
poly.SetInputConnection(iso.GetOutputPort())
poly_mapper = vtkDataSetMapper()
poly_mapper.SetInputConnection(poly.GetOutputPort())
poly_mapper.ScalarVisibilityOff()
poly_actor = vtkActor()
poly_actor.SetMapper(poly_mapper)
poly_actor.GetProperty().SetColor(colors.GetColor3d("Gray"))
renderer = vtkRenderer()
ren_win = vtkRenderWindow()
"""
SetMultiSamples 关闭多重采样
在 OpenGL 渲染里,多重采样抗锯齿 (MSAA) 会让边缘更平滑,看起来不那么锯齿化。
默认情况下,vtkRenderWindow 可能会打开多重采样(比如 8x)。
这会增加计算量,有时候也会导致绘制一些特殊几何体(比如透明对象、点云、线框)时出现问题
SetMultiSamples(0) 的含义
0 = 关闭多重采样 → 没有抗锯齿(速度快,但可能有锯齿)。
>0 = 设置多重采样的采样数,比如 4 表示 4x MSAA。
"""
ren_win.SetMultiSamples(0)
ren_win.AddRenderer(renderer)
ren_win.SetWindowName('ContourTriangulator')
iren = vtkRenderWindowInteractor()
iren.SetRenderWindow(ren_win)
renderer.AddActor(poly_actor)
renderer.AddActor(iso_actor)
renderer.SetBackground(colors.GetColor3d('DarkSlateGray'))
ren_win.SetSize(300, 300)
camera = renderer.GetActiveCamera()
renderer.ResetCamera()
camera.Azimuth(180)
ren_win.Render()
iren.Initialize()
iren.Start()
if __name__ == '__main__':
main()