news 2026/6/10 0:50:24

SmoothDiscreteMarchingCubes 多边形网格数据的平滑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 5:22:21

【KMP算法】KMP算法揭秘:高效字符串匹配的艺术

系列文章目录 文章目录系列文章目录一、KMP算法简介&#xff08;1&#xff09;KMP算法的核心思想&#xff08;2&#xff09;KMP算法的步骤&#xff08;3&#xff09;KMP 算法的应用场景二、例题一、找出字符串中第一个匹配项的下标二、最短回文串三、总结一、KMP算法简介 KMP&…

作者头像 李华
网站建设 2026/6/9 23:36:34

YOLOv11 改进 - C2PSA | C2PSA融合DML动态混合层(Dynamic Mixing Layer)轻量级设计优化局部细节捕获与通道适应性,提升超分辨率重建质量

前言 本文介绍了动态混合层(DML),并将相关改进模块集成进YOLOv11。DML是SRConvNet核心组件,用于解决轻量级图像超分辨率任务中特征捕捉和通道适应性问题。它通过通道扩展拆分、多尺度动态深度卷积、通道洗牌与融合等步骤,实现多尺度局部信息聚合和通道自适应增强。DML的动…

作者头像 李华
网站建设 2026/6/9 19:45:12

【区块链技术(06)】为什么分布式系统会存在数据一致性问题?本文带你理解:CAP和FLP定理、拜占庭将军问题;Paxos和Raft两种分布式算法

分布式系统一致性 一致性问题 在分布式环境中&#xff0c;由于各个节点之间的通信存在延迟和不确定性&#xff0c;如何保证数据的一致性称为一个挑战 一致性是指分布式系统中所有节点对于某个操作或数据状态达成的共识。 当多个节点参与某个操作时&#xff0c;它们需要遵循…

作者头像 李华
网站建设 2026/6/9 19:44:43

CSS Padding图解指南:小白也能懂的间距魔法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个交互式CSS padding学习沙盒&#xff0c;左侧可拖拽调整盒模型参数&#xff0c;右侧实时显示代码和视觉效果。包含10个渐进式练习任务&#xff0c;从基础单边padding到复杂嵌…

作者头像 李华
网站建设 2026/6/9 20:11:09

基于大数据的小微企业信贷风险评估研究开题报告​

一、选题背景与研究意义​&#xff08;一&#xff09;选题背景​小微企业作为国民经济的重要组成部分&#xff0c;在促进就业、推动创新、稳定经济增长等方面发挥着不可替代的作用。然而&#xff0c;融资难、融资贵一直是制约小微企业发展的核心瓶颈。传统信贷风险评估模式依赖…

作者头像 李华
网站建设 2026/6/9 18:33:02

AI如何帮你快速解决.NET Framework 3.5安装问题

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个智能诊断工具&#xff0c;能够自动检测Windows系统中.NET Framework 3.5的安装状态和常见问题。工具应包含以下功能&#xff1a;1) 自动扫描系统环境&#xff1b;2) 识别常…

作者头像 李华