当前位置: 首页 > 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.jsqmd.com/news/84717/

相关文章:

  • AlignTwoPolyDatas 基于ICP算法的配准和相机视角切换
  • YOLOv11 改进 - C2PSA | C2PSA融合EDFFN高效判别频域前馈网络(CVPR 2025):频域筛选机制增强细节感知,优化复杂场景目标检测
  • Vue + Echarts 实现科技感数据大屏
  • 删除有序数组中的重复项(C++)
  • downkyi下载优先级终极指南:让你的重要视频先人一步
  • YOLOv11 改进 - C2PSA | C2PSA融合Mona多认知视觉适配器(CVPR 2025):打破全参数微调的性能枷锁:即插即用的提点神器,引领视觉微调新突破
  • 企业级部署:奇安信天擎在金融行业的实战案例
  • Windows右键菜单终极优化指南:让你的右键菜单重获新生
  • 百度网盘直链解析:新手必学的3步全速下载方法
  • 洛雪音乐PC版2.12.0| 最强电脑免费听歌软件,所有平台音乐都能听,需要导入音源
  • YOLOv11改进 - C3k2融合 | C3k2融DBlock解码器块( CVPR 2025 ) Decoder Block:解码器块,去模糊和提升图像清晰度
  • 正义荣耀圣戒 无限代金券买断
  • YOLOv11改进 - C3k2融合 | C3k2融合MambaOut(CVPR 2025),简洁高效的视觉模型基线
  • 【KMP算法】KMP算法揭秘:高效字符串匹配的艺术
  • ZTools v1.1.2:桌面应用启动器与搜索工具
  • 【Hadoop+Spark+python毕设】哮喘患者症状数据可视化分析系统、计算机毕业设计、包括数据爬取、数据分析、数据可视化、Hadoop、实战教学
  • ML-4360 3D视觉 笔记
  • 企业级Git仓库SSH连接安全最佳实践
  • 玩转 Flutter 自定义 Painter:从零打造丝滑的仪表盘动效与可视化图表
  • CSS Padding图解指南:小白也能懂的间距魔法
  • 基于SpringBoot的餐厅推荐系统 计算机毕业设计选题 计算机毕设项目 前后端分离 【源码-文档报告-代码讲解】
  • 禁用MinIO后的7种企业级替代方案评测
  • Kingbase KES常见问题排查与解决指南:从启动报错到性能优化
  • 互联网大厂Java面试:从Spring Boot到微服务架构的深度剖析
  • AI如何帮你解决MySQL的--skip-grant-tables问题
  • 中望CAD2025:将多段线转换为样条曲线
  • AI如何助力音乐制作:从WUB到专业音效
  • 零基础教程:手把手教你下载安装OpenJDK1.8
  • 智驾相关名词简介
  • KL按键映射文件修改