news 2026/4/23 13:58:47

GenerateCubesFromLabels 提取和可视化特定标签所代表的 3D 结构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GenerateCubesFromLabels 提取和可视化特定标签所代表的 3D 结构

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①体素数据读取vtkMetaImageReader的使用,②vtkGeometryFilter三维网格数据转换为可渲染的polydata


二:代码及注释

import vtkmodules.vtkRenderingOpenGL2 import vtkmodules.vtkInteractionStyle from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkIOImage import vtkMetaImageReader from vtkmodules.vtkImagingCore import vtkImageWrapPad from vtkmodules.vtkFiltersCore import vtkThreshold from vtkmodules.vtkCommonTransforms import vtkTransform from vtkmodules.vtkFiltersGeneral import vtkTransformFilter from vtkmodules.vtkFiltersGeometry import vtkGeometryFilter from vtkmodules.vtkCommonDataModel import ( vtkDataObject, vtkDataSetAttributes ) from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, vtkRenderWindow, vtkRenderWindowInteractor, vtkRenderer ) def main(): colors = vtkNamedColors() file_name = "Data/Frog/frogtissue.mhd" start_label = 1 end_label = 29 reader = vtkMetaImageReader() reader.SetFileName(file_name) reader.Update() """ vtkMetaImageReader 返回的是一个体积数据(vtkImageData 或 vtkStructuredPoints 的基类) 返回一个包含 6 个整数的元组或列表 [Imin, Imax, Jmin, Jmax, Kmin, Kmax] 描述的是 3D 网格在三个维度上的体素/点索引范围 """ extent = reader.GetOutput().GetExtent() print("extent: ", extent) """ vtkImageWrapPad 主要作用是扩展(或填充)图像的边界,并使用“环绕”(Wrap)模式来决定填充的值 “Wrap”是它区别于其他填充模式(如常数填充 ConstantPad 或重复填充 ClampPad)的关键 填充值来源: 当它填充新添加的边界体素时,它会从图像另一侧的现有数据中获取数值 包裹填充的原因:在一些算法中,比如图像卷积(滤波),计算梯度或导数周期性模拟(如流体边界循环) 需要图像在边界是“周期连续”的,这时候不能用零填充(那会引入边缘效应),而是要从另一侧“包裹”过来 """ pad = vtkImageWrapPad() pad.SetInputConnection(reader.GetOutputPort()) pad.SetOutputWholeExtent(extent[0], extent[1] + 1, extent[2], extent[3] + 1, extent[4], extent[5] + 1) pad.Update() """ 数据属性(标量数据)从点到单元(cell)的“拷贝映射” 操作 为什么这么做: 一些滤波器、mapper、渲染器期望标量值在 cell 上; 而输入的原始数据标量通常存在于 points 上; 所以必须手动把标量从 PointData 复制到 CellData """ pad.GetOutput().GetCellData().SetScalars(reader.GetOutput().GetPointData().GetScalars()) """ vtkThreshold 主要用于对数据集(如 vtkUnstructuredGrid, vtkPolyData, vtkImageData 等)中的标量值进行阈值筛选(Thresholding) 从而提取出满足某个标量范围条件的单元(cells)或点(points) """ selector = vtkThreshold() """ SetInputArrayToProcess 参数详解 第0个0: 代表输入端口索引 第1个0: 代表连接的输入数据索引 第2个0:表示“时间步索引”,一般不用改 vtkDataObject().FIELD_ASSOCIATION_CELLS 表示要使用单元(cell)数据,而不是点(Point)数据 vtkDataSetAttributes().SCALARS 表示使用当前单元数据中的 标量数组(Scalars) """ selector.SetInputArrayToProcess(0, 0, 0, vtkDataObject().FIELD_ASSOCIATION_CELLS, vtkDataSetAttributes().SCALARS) selector.SetInputConnection(pad.GetOutputPort()) selector.SetLowerThreshold(start_label) selector.SetUpperThreshold(end_label) # 只保留标量值在 [start_label, end_label] 之间的单元 selector.Update() transform = vtkTransform() transform.Translate(-0.5, -0.5, -0.5) transform_model = vtkTransformFilter() transform_model.SetTransform(transform) transform_model.SetInputConnection(selector.GetOutputPort()) """ vtkGeometryFilter 把 任意数据类型(体数据、结构化网格、非结构化网格等)提取成表面几何数据(vtkPolyData) 简单来说就是把三维网格或体数据转换为可渲染的表面(PolyData) """ geometry = vtkGeometryFilter() geometry.SetInputConnection(transform_model.GetOutputPort()) mapper = vtkPolyDataMapper() mapper.SetInputConnection(geometry.GetOutputPort()) mapper.SetScalarRange(start_label, end_label) mapper.SetScalarModeToUseCellData() mapper.SetColorModeToMapScalars() actor = vtkActor() actor.SetMapper(mapper) renderer = vtkRenderer() render_window = vtkRenderWindow() render_window.AddRenderer(renderer) render_window.SetSize(640, 480) render_window.SetWindowName('GenerateCubesFromLabels') render_window_interactor = vtkRenderWindowInteractor() render_window_interactor.SetRenderWindow(render_window) renderer.AddActor(actor) renderer.SetBackground(colors.GetColor3d('DarkSlateBlue')) render_window.Render() camera = renderer.GetActiveCamera() camera.SetPosition(42.301174, 939.893457, -124.005030) camera.SetFocalPoint(224.697134, 221.301653, 146.823706) camera.SetViewUp(0.262286, -0.281321, -0.923073) camera.SetDistance(789.297581) camera.SetClippingRange(168.744328, 1509.660206) render_window_interactor.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:45:55

Open Library API完整指南:如何快速实现图书数据集成与同步

Open Library API完整指南:如何快速实现图书数据集成与同步 【免费下载链接】openlibrary One webpage for every book ever published! 项目地址: https://gitcode.com/gh_mirrors/op/openlibrary Open Library作为"每本已出版图书的专属网页"项目…

作者头像 李华
网站建设 2026/4/23 12:13:19

21天养成好习惯:daily-check-in打卡小程序让坚持变得如此简单

21天养成好习惯:daily-check-in打卡小程序让坚持变得如此简单 【免费下载链接】daily-check-in 一个打卡小程序 - 基于 leancloud 数据存储 项目地址: https://gitcode.com/gh_mirrors/da/daily-check-in 在快节奏的现代生活中,你是否也曾立下无…

作者头像 李华
网站建设 2026/4/23 12:15:37

Dify镜像适用于哪些典型AI应用场景?

Dify镜像适用于哪些典型AI应用场景? 在大模型技术席卷各行各业的今天,越来越多企业希望将AI能力嵌入自身业务流程——从客服问答到内容生成,从知识管理到自动化办公。但现实是,直接基于LLM API开发应用往往面临环境配置复杂、调试…

作者头像 李华
网站建设 2026/4/23 12:24:35

终极音乐解密指南:3步解锁全平台播放自由

终极音乐解密指南:3步解锁全平台播放自由 【免费下载链接】unlock-music 音乐解锁:移除已购音乐的加密保护。 目前支持网易云音乐(ncm)、QQ音乐(qmc, mflac, tkm, ogg) 。原作者也不知道是谁() 项目地址: https://gitcode.com/g…

作者头像 李华
网站建设 2026/4/17 12:14:25

基于ARMCortex-M4F内核的MSP432MCU开发实践【2.7】

7.1.5 自动波特率检测 当UCMODEx控制位被配置为11时,就选择了带自动波特率选择的UART模式。对于UART自动波特率检测方式,在数据帧前面会有一个包含打断域和同步域的同步序列。当在总线上检测到11个或更多个0时,被识别为总线打断。如果总线打断的长度超过21位时间长度,则将…

作者头像 李华
网站建设 2026/4/23 12:12:19

企业CIT标准化网络系统的升级管理

数字化时代的企业脉搏在数字化时代,企业网络系统如同企业的脉搏,每一次跳动都承载着信息的流动和业务的运 转。随着技术的飞速进步,网络系统的升级管理已成为企业保持竞争力的关键。今天,我们 探讨的是企业CIT标准化网络系统的升级…

作者头像 李华