news 2026/4/18 7:59:12

GenerateModelsFromLabels体积数据转表面模型并保存

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GenerateModelsFromLabels体积数据转表面模型并保存

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①vtkImageAccumulate三维体素数据直方图统计器,②vtkMaskFields数据字段的过滤器


二:代码及注释

import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkIOImage import vtkMetaImageReader from vtkmodules.vtkImagingStatistics import vtkImageAccumulate from vtkmodules.vtkFiltersGeneral import vtkDiscreteFlyingEdges3D from vtkmodules.vtkFiltersCore import vtkWindowedSincPolyDataFilter, vtkThreshold, vtkMaskFields from vtkmodules.vtkFiltersGeometry import vtkGeometryFilter from vtkmodules.vtkCommonDataModel import ( vtkDataObject, vtkDataSetAttributes ) from vtkmodules.vtkIOXML import vtkXMLPolyDataWriter import os import sys def main(): file_name = "Data/Frog/frogtissue.mhd" start_label = 1 end_label = 29 reader = vtkMetaImageReader() reader.SetFileName(file_name) reader.Update() file_prefix = 'Label' smoothing_iterations = 15 pass_band = 0.001 feature_angle = 120.0 # 表面重建,最后一个表示要重建多少个表面 discrete_cubes = vtkDiscreteFlyingEdges3D() discrete_cubes.SetInputConnection(reader.GetOutputPort()) discrete_cubes.GenerateValues(end_label - start_label + 1, start_label, end_label) """ vtkImageAccumulate 当于一个 3D 直方图(histogram)计算器 用于计算图像(或体数据)中像素 / 体素的统计信息,包括直方图、平均值、最小值、最大值 计算所有离散标签的出现频率(即生成直方图) vtkImageAccumulate 的输出是一个特殊的 vtkImageData """ histogram = vtkImageAccumulate() histogram.SetInputConnection(reader.GetOutputPort()) """ SetComponentExtent 定义了标签值的范围 0到end_label表示直方图覆盖从标签0到最大标签纸所有的数值 后面的0是将Y和Z维度设置为单一切片,因为直方图本质上是一个一维的频率计数 """ histogram.SetComponentExtent(0, end_label, 0, 0, 0, 0) """ SetComponentOrigin设置直方图的起始值从 0 开始计数(即从标签 0 开始) """ histogram.SetComponentOrigin(0, 0, 0) """ SetComponentSpacing 设置直方图的“体素”间隔为 1。 由于处理的是离散整数标签,这个间隔为 1 确保了每个整数标签值都有一个对应的“箱子”(bin) """ histogram.SetComponentSpacing(1, 1, 1) histogram.Update() # mesh的平滑 smoother = vtkWindowedSincPolyDataFilter() smoother.SetInputConnection(discrete_cubes.GetOutputPort()) smoother.BoundarySmoothingOff() smoother.FeatureEdgeSmoothingOff() """ SetFeatureAngle 定义大于该角度(120.0 度)的边为“特征边”。由于 FeatureEdgeSmoothingOff,这些边在平滑时会得到保护 """ smoother.SetFeatureAngle(feature_angle) """ SetPassBand 它控制了哪些频率(即几何上的细节)会被保留或平滑。 pass_band = 0.001 是一个非常低的值,表示它会平滑掉大部分的高频细节(即锯齿和噪声),只保留低频(整体形状) """ smoother.SetPassBand(pass_band) smoother.SetNumberOfIterations(smoothing_iterations) smoother.NonManifoldSmoothingOn() """ NormalizeCoordinatesOn 启用在平滑处理前对坐标进行归一化。这有助于确保平滑效果独立于模型的绝对 """ smoother.NormalizeCoordinatesOn() smoother.Update() selector = vtkThreshold() selector.SetInputConnection(smoother.GetOutputPort()) selector.SetInputArrayToProcess(0, 0, 0, vtkDataObject.FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes.SCALARS) """ vtkMaskFields 是一个 数据字段过滤器 主要作用是:控制数据集中哪些属性(如标量、向量、法向量、纹理坐标等)被保留或删除 VTK 的数据集中,数据可能挂在两个层级上: PointData:每个点上存的属性(如温度、速度向量等) CellData:每个单元(网格单元)上的属性(如材料编号、区域 ID 等) CopyAttributeOff 表示丢弃某种属性数据 CopyAttributeOn 表示保留某种属性数据 """ scalars_off = vtkMaskFields() scalars_off.SetInputConnection(selector.GetOutputPort()) scalars_off.CopyAttributeOff(vtkMaskFields().POINT_DATA, vtkDataSetAttributes().SCALARS) scalars_off.CopyAttributeOff(vtkMaskFields().CELL_DATA, vtkDataSetAttributes().SCALARS) geometry = vtkGeometryFilter() geometry.SetInputConnection(scalars_off.GetOutputPort()) writer = vtkXMLPolyDataWriter() for i in range(start_label, end_label + 1): # see if the label exists, if not skip it frequency = histogram.GetOutput().GetPointData().GetScalars().GetTuple1(i) if frequency == 0.0: continue # select the cells for a given label selector.SetLowerThreshold(i) selector.SetUpperThreshold(i) writer.SetInputConnection(selector.GetOutputPort()) # output the polydata output_fn = '{:s}{:d}.vtp'.format(file_prefix, i) print('{:s} writing {:s}'.format(os.path.basename(sys.argv[0]), output_fn)) writer.SetFileName(output_fn) writer.Write() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 4:48:26

联想拯救者Y7000系列BIOS隐藏设置3步解锁完整指南

联想拯救者Y7000系列BIOS隐藏设置3步解锁完整指南 【免费下载链接】LEGION_Y7000Series_Insyde_Advanced_Settings_Tools 支持一键修改 Insyde BIOS 隐藏选项的小工具,例如关闭CFG LOCK、修改DVMT等等 项目地址: https://gitcode.com/gh_mirrors/le/LEGION_Y7000S…

作者头像 李华
网站建设 2026/4/18 10:08:20

金融AI实战:FinBERT2如何重构你的投资分析工作流?

金融AI实战:FinBERT2如何重构你的投资分析工作流? 【免费下载链接】FinBERT 项目地址: https://gitcode.com/gh_mirrors/finb/FinBERT 在金融市场瞬息万变的今天,传统的人工分析方式已难以应对海量金融文本数据的处理需求。你是否曾因…

作者头像 李华
网站建设 2026/4/18 6:59:11

CubeMX中HSE/HSI时钟源配置实战案例

CubeMX中HSE/HSI时钟源配置实战:从原理到容错设计你有没有遇到过这样的情况?板子焊好了,程序烧进去了,但MCU就是不启动——没有串口输出、JTAG连不上、LED也不闪。查了一圈电源和复位电路都没问题,最后发现罪魁祸首竟是…

作者头像 李华
网站建设 2026/4/18 8:37:18

如何高效使用Plyr视频下载功能:从基础配置到实战应用

如何高效使用Plyr视频下载功能:从基础配置到实战应用 【免费下载链接】plyr 项目地址: https://gitcode.com/gh_mirrors/ply/plyr Plyr作为一款现代化的HTML5媒体播放器,其下载功能为用户提供了便捷的媒体内容获取途径。本文将带你从实际应用角度…

作者头像 李华
网站建设 2026/4/18 11:55:09

Android视频播放终极指南:快速上手Media3 ExoPlayer

Android视频播放终极指南:快速上手Media3 ExoPlayer 【免费下载链接】ExoPlayer 项目地址: https://gitcode.com/gh_mirrors/ex/ExoPlayer 在Android开发中,视频播放功能是许多应用的核心需求。面对复杂的媒体格式和流媒体协议,选择一…

作者头像 李华
网站建设 2026/4/17 13:07:51

Charticulator终极指南:简单三步打造专业级定制图表

还在为Excel图表千篇一律的样式而烦恼?Charticulator为你打开了数据可视化的全新维度。这个革命性的交互式图表工具让任何人都能通过直观的拖拽操作,快速创建完全个性化的专业图表,彻底告别代码编程的复杂性。 【免费下载链接】charticulator…

作者头像 李华