当前位置: 首页 > 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.gsyq.cn/news/94942.html

相关文章:

  • YOLOv11 改进 - C2PSA | C2PSA融合Mona多认知视觉适配器(CVPR 2025):打破全参数微调的性能枷锁:即插即用的提点神器,引领视觉微调新突破
  • YOLOv11 改进 - SPPF模块 | 替代SPPF, Mona多认知视觉适配器(CVPR 2025):打破全参数微调的性能枷锁:即插即用的提点神器
  • 百度网盘直链解析:新手必学的3步全速下载方法
  • 【KMP算法】KMP算法揭秘:高效字符串匹配的艺术
  • CSS Padding图解指南:小白也能懂的间距魔法
  • KL按键映射文件修改
  • 智驾相关名词简介
  • 面向对象程序设计———数字电路模拟程序1、2与第一次课堂测验总结
  • 传统统计 “手忙脚乱” VS 虎贲等考 AI “一键洞察”:数据分析的革命性分水岭
  • document.querySelector在电商网站中的5个实战应用
  • SK海力士×NVIDIA联手,AI NAND性能狂飙30倍!
  • C 标准库 - <locale.h>
  • 单片机芯片] CH32V307 支持手机的虚拟U盘实现拖拽固件升级
  • 【规范驱动的开发方式】之【spec-kit】 的安装入门指南
  • 基于ipsec的医院网络规划设计与实现
  • 电商评论分析实战:Java + NLP 大模型,从 10 万条评论中自动提取“用户槽点”
  • ISCTF2025-病毒分析
  • [数据结构/Java] 数据结构之循环队列
  • 检索增强生成(RAG)技术原理深度解析:突破大模型知识边界的范式革命
  • 基于springboot的技术博客交流系统的设计与实现
  • 基于springboot的运动服服饰销售购买商城系统
  • 英语口语资源合集
  • 如何用DSPy优化RAG prompt示例
  • 鸿蒙PC UI控件库 - TextInput 文本输入框详解
  • 鸿蒙PC UI控件库 - PasswordInput 密码输入框详解
  • 【路径规划】基于RRT快速探索随机树算法在包含圆形障碍物的环境中寻找从起点到目标点的路径附matlab代码
  • 【国防科大硕士论文】V调频信号脉冲压缩+V-FM ISAR成像研究附Matlab代码
  • 夜莺监控设计思考(三)时序库、agent 的一些设计考量
  • Go Module构建
  • AI中的优化5-无约束非线性规划之凸性