当前位置: 首页 > news >正文

SmoothDiscreteMarchingCubes 多边形网格数据的平滑

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①vtkSampleFunction函数采样器,②vtkWindowedSincPolyDataFilter 多边形网格的平滑滤波器


二:代码及注释

import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkCommonCore import vtkLookupTable, vtkMinimalStandardRandomSequence from vtkmodules.vtkCommonDataModel import vtkImageData, vtkSphere from vtkmodules.vtkFiltersCore import vtkWindowedSincPolyDataFilter from vtkmodules.vtkFiltersGeneral import vtkDiscreteMarchingCubes from vtkmodules.vtkImagingCore import vtkImageThreshold from vtkmodules.vtkImagingHybrid import vtkSampleFunction from vtkmodules.vtkImagingMath import vtkImageMathematics from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, vtkRenderWindow, vtkRenderWindowInteractor, vtkRenderer ) def main(): n = 20 radius = 8 max_r = 50 - 2.0 * radius blob_image = vtkImageData() random_sequence = vtkMinimalStandardRandomSequence() random_sequence.SetSeed(5071) for i in range(0, n): sphere = vtkSphere() x = random_sequence.GetRangeValue(-max_r, max_r) random_sequence.Next() y = random_sequence.GetRangeValue(-max_r, max_r) random_sequence.Next() z = random_sequence.GetRangeValue(-max_r, max_r) random_sequence.Next() sphere.SetCenter(int(x), int(y), int(z)) """ vtkSampleFunction 创建一个 函数采样器,它会在一个三维规则网格里对隐函数(比如球、平面、布尔组合)进行采样, 生成 vtkImageData 格式的体数据 指定要采样的隐函数,这里是一个 vtkSphere 隐函数的规则是: 点在球面上 → 函数值 = 0 点在球内 → 函数值 < 0 点在球外 → 函数值 > 0 如果设置的隐函数是一个平面呢? 在平面上:值 = 0 在平面的一边:值 = 正数 在另一边:值 = 负数 """ sampler = vtkSampleFunction() sampler.SetImplicitFunction(sphere) sampler.SetOutputScalarTypeToFloat() sampler.SetModelBounds(-50, 50, -50, 50, -50, 50) sampler.SetSampleDimensions(100, 100, 100) thres = vtkImageThreshold() thres.SetInputConnection(sampler.GetOutputPort()) thres.ThresholdByLower(radius * radius) """ SetInValue(i+1) 所有符合阈值条件的(即球体内部的)体素值替换为当前的循环索引 i 加 1 SetOutValue(0):将所有不符合阈值条件的(即球体外部的)体素值替换为0 """ thres.SetInValue(i + 1) thres.SetOutValue(0) """ ReplaceInOn() 启用对符合阈值条件的体素的替换 ReplaceOutOn() 启用对不符合阈值条件的体素的替换 """ thres.ReplaceInOn() thres.ReplaceOutOn() """ 启用对符合阈值条件的体素的替换 """ thres.Update() if i == 0: blob_image.DeepCopy(thres.GetOutput()) """ 图像的体素级操作 """ max_value = vtkImageMathematics() max_value.SetInputData(0, blob_image) max_value.SetInputData(1, thres.GetOutput()) max_value.SetOperationToMax() max_value.Modified() max_value.Update() blob_image.DeepCopy(max_value.GetOutput()) discrete = vtkDiscreteMarchingCubes() discrete.SetInputData(blob_image) discrete.GenerateValues(n, 1, n) smoothing_iterations = 15 pass_band = 0.01 feature_angle = 120.0 """ vtkWindowedSincPolyDataFilter 多边形网格的平滑滤波器 普通的平滑算法(比如 vtkSmoothPolyDataFilter,基于 Laplacian 平滑)在迭代多次后,会让模型逐渐 变小,因为顶点会不断往邻居点的“平均位置”收缩。 而 vtkWindowedSincPolyDataFilter 使用频域滤波的思想,通过 Sinc 函数 + 窗口函数来控制平滑程度,使得模型不会过度收缩,同时还能去掉高频噪声 """ smoother = vtkWindowedSincPolyDataFilter() smoother.SetInputConnection(discrete.GetOutputPort()) smoother.SetNumberOfIterations(smoothing_iterations) smoother.BoundarySmoothingOff() # 是否对边界也进行平滑 smoother.SetFeatureAngle(feature_angle) smoother.FeatureEdgeSmoothingOff() # 是否允许锐利特征边界被平滑 """ 设置滤波器的通带宽度(0~2之间的浮点数),值越小平滑越强 """ smoother.SetPassBand(pass_band) """ NonManifoldSmoothingOn 对非流行网格也进行平滑 """ smoother.NonManifoldSmoothingOn() """ NormalizeCoordinatesOn 启用后,滤波器会 在内部把坐标归一化到一个标准范围([-1,1] 或 [0,1] 之类的范围) 再进行计算, 最后再还原回原始范围 """ smoother.Update() lut = vtkLookupTable() lut.SetNumberOfColors(n) lut.SetTableRange(0, n - 1) lut.SetRampToLinear() lut.Build() # 构建查找表 lut.SetTableValue(0, 0, 0, 0, 1) # 设置索引为0的颜色值为纯黑色+不透明 for i in range(1, n): r = random_sequence.GetRangeValue(0.4, 1) random_sequence.Next() g = random_sequence.GetRangeValue(0.4, 1) random_sequence.Next() b = random_sequence.GetRangeValue(0.4, 1) random_sequence.Next() lut.SetTableValue(i, r, g, b, 1.0) mapper = vtkPolyDataMapper() mapper.SetInputConnection(smoother.GetOutputPort()) mapper.SetLookupTable(lut) mapper.SetScalarRange(0, lut.GetNumberOfColors()) ren = vtkRenderer() ren_win = vtkRenderWindow() ren_win.AddRenderer(ren) ren_win.SetWindowName('SmoothDiscreteMarchingCubes') iren = vtkRenderWindowInteractor() iren.SetRenderWindow(ren_win) actor = vtkActor() actor.SetMapper(mapper) ren.AddActor(actor) colors = vtkNamedColors() ren.SetBackground(colors.GetColor3d('Burlywood')) ren_win.Render() iren.Start() if __name__ == '__main__': main()
http://www.cnnetsun.cn/news/42798.html

相关文章:

  • 基于SpringBoot的餐厅推荐系统 计算机毕业设计选题 计算机毕设项目 前后端分离 【源码-文档报告-代码讲解】
  • 禁用MinIO后的7种企业级替代方案评测
  • document.querySelector在电商网站中的5个实战应用
  • 企业级应用:OpenJDK1.8在生产环境中的部署实践
  • Homebrew实战:从安装到开发环境搭建全流程
  • 企业级Git仓库SSH连接安全最佳实践
  • Day12 贝叶斯优化可视化和随机森林的解读
  • 数据湖不是湖,是江湖:Delta Lake / Iceberg / Hudi 到底该选谁?
  • 告别开题报告模板拼凑!虎贲等考 AI 智能生成,让选题逻辑从模糊想法变身可执行研究计划
  • 【LeetCode刷题】跳跃游戏
  • 鸿蒙PC UI控件库 - PasswordInput 密码输入框详解
  • day37简单的神经网络@浙大疏锦行
  • 【水果识别】基于机器视觉苹果和香蕉的成熟度和大小检测附Matlab代码
  • JAVA的平凡之路——此峰乃是最高峰JVM-附加小菜-04
  • 【电力系统】电力系统优化与控制热液调度附Matlab代码和报告
  • 基于6种最新算法(小龙虾优化算法COA、MSA、RTH、NOA、BFO、SWO)求解机器人路径规划研究附Matlab代码
  • Golang实战:构建综合多头(逾期+反欺诈)风险查询的高性能客户端
  • 【TSP问题】基于蜣螂算法DBO和改进的蜣螂算法FADBO求解旅行商TSP问题(可根据自己的经纬度设置自己想要到达的地区)附Matlab代码
  • 【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析附Matlab代码
  • 数据结构:二叉排序树,平衡二叉树,红黑树的介绍
  • 软件复用的分类与实现
  • google服务
  • 进程PCB
  • 实战教程:1小时掌握逆向Unity游戏 (共13课时)
  • [从零构建操作系统]08 函数调用时栈的底层行为解析
  • 力扣hot100:搜索插入位置
  • Java冷启动全指南:从原理到实战优化
  • 测试 - 单元测试(JUnit)
  • C++中多态
  • c++经典练习题-多分支