曲率计算(平均曲率):
vtk.vtkCurvatures()
颜色映射:
vtk.vtkLookupTable()
颜色条:
vtk.vtkScalarBarActor()
完整代码:
import vtk
import VTKLib
from vtk.util.numpy_support import vtk_to_numpy
import numpy as np
source = vtk.vtkDataSetReader()
source.SetFileName("teeth.vtk")
source.Update()
# source = vtk.vtkSTLReader()
# source.SetFileName("teeth.stl")
# source.Update()
poly = vtk.vtkPolyData()
poly = source.GetOutput()
cc = vtk.vtkCurvatures()
cc.SetInputConnection(source.GetOutputPort())
cc.SetCurvatureTypeToMean()
cc.Update()
# 获取曲率数组
curvature_array = cc.GetOutput().GetPointData().GetScalars()
curvature_array = vtk_to_numpy(curvature_array)
mean_cur = np.mean(curvature_array)
numPts = VTKLib.PtNumbersofPoly(poly)
# for i in range(numPts):
# curvature_array[i] = abs(curvature_array[i])
for i in range(numPts): # 三维模型中,点与点之间曲率差距过大,不利于颜色渐变的可视化,所以调整一下
if curvature_array[i] >= 1:
curvature_array[i] = 1
elif curvature_array[i] <= -1:
curvature_array[i] = -1
# print(np.mean(curvature_array))
# print(np.min(curvature_array))
# print(np.max(curvature_array))
scalars = vtk.vtkFloatArray()
scalars.SetNumberOfValues(numPts)
poly.GetPointData().SetScalars(scalars)
for i in range(numPts): # 为属性数组中的每个元素设置标量值(这个标量值可以当作颜色值)
scalars.SetValue(i, curvature_array[i]) # 这个地方点和标量产生联系(第一个参数是第几个点;第二个参数就是设定的标量值)现在就假设第i个点颜色就是i
# 创建颜色查找表
lut = vtk.vtkLookupTable()
lut.SetNumberOfColors(numPts) # 指定颜色查找表中有多少种颜色
lut.SetHueRange(0.6667, 0.0) # 蓝到红渐变
lut.Build()
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputData(poly)
mapper.SetScalarRange(np.min(curvature_array), np.max(curvature_array)) # 设置标量值的范围
mapper.ScalarVisibilityOn()
mapper.SetColorModeToDefault() # 默认的映射器行为,即把unsigned char类型的标量属性数据当作颜色值,不执行隐式。对于其他类型的标量数据,将通过查询表映射
mapper.SetLookupTable(lut)
scalarBar = vtk.vtkScalarBarActor() # 将颜色以图形的形式显示,并支持设置图形相应的名字和显示的数据label的个数
scalarBar.SetLookupTable(lut)
scalarBar.SetTitle("Mean Curvature")
scalarBar.SetNumberOfLabels(6)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
renderer =vtk.vtkRenderer()
renderer.AddActor(scalarBar)
renderer.GradientBackgroundOn()
renderer.SetBackground(1, 1, 1)
renderer.SetBackground2(1, 1, 1)
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
style = vtk.vtkInteractorStyleTrackballCamera()
renderWindowInteractor.SetInteractorStyle(style)
renderer.AddActor(actor)
renderWindow.SetSize(600, 600)
renderWindow.Render()
renderWindowInteractor.Start()