VTK根据三维模型曲率进行颜色映射(渐变)

曲率计算(平均曲率):

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()

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值