news 2026/5/1 6:26:58

VTKWithNumpy使用 NumPy 数组来创建3D体渲染所需要的数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VTKWithNumpy使用 NumPy 数组来创建3D体渲染所需要的数据

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①vtk与numpy数组的联动,②vtkImageImport的使用


二:代码及注释

import vtkmodules.vtkRenderingVolumeOpenGL2 import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkIOImage import vtkImageImport from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkRenderingCore import vtkColorTransferFunction, vtkRenderWindow, vtkRenderWindowInteractor, \ vtkRenderer, vtkVolume, vtkVolumeProperty import numpy as np from vtkmodules.vtkCommonDataModel import vtkPiecewiseFunction from vtkmodules.vtkRenderingVolume import vtkFixedPointVolumeRayCastMapper def main(): colors = vtkNamedColors() data_matrix = np.zeros([75, 75, 75], dtype=np.uint8) data_matrix[0:35, 0:35, 0:35] = 50 data_matrix[25:55, 25:55, 25:55] = 100 data_matrix[45:74, 45:74, 45:74] = 150 """ vtkImageImport 将外部的原始图像数据(Raw data)导入到 VTK 的图像管线中,从而变成一个 vtkImageData 对象,供后续处理或渲染使用 这个类允许你把Python/Numpy 数组 C/C++ 原始内存数据(unsigned char*, float*, etc.) 或者是外部图像格式(比如医学影像、数值模拟输出等) """ dataImporter = vtkImageImport() # 会把整个数组的原始内存内容转换成 连续的字节流(bytes) 结果类似于:b'\x01\x02\x03\x04\x05\x06' # 因为 vtkImageImport 期望接收 原始字节数据指针,而不是 NumPy 对象 data_string = data_matrix.tobytes() # CopyImportVoidPointer 复制一份数据到vtk内部 dataImporter.CopyImportVoidPointer(data_string, len(data_string)) dataImporter.SetDataScalarTypeToUnsignedChar() # 将输入的数据转换为无符号8位证书类型 dataImporter.SetNumberOfScalarComponents(1) """ SetDataExtent 告诉vtkImageImport 原始数据体素在x,y,z三个方向上的索引范围 这里的意思是 x方向:从 0 到 74,共 75 个体素 y方向:从 0 到 74,共 75 个体素 z方向:从 0 到 74,共 75 个体素 """ dataImporter.SetDataExtent(0, 74, 0, 74, 0, 74) """ SetWholeExtent 这行代码看似重复,实则是在指定整个图像(数据集)在 VTK 管线中表示的范围 SetDataExtent(...) 是描述当前导入数据的内存范围 SetWholeExtent(...) 是描述VTK 内部整个图像数据的逻辑范围 """ dataImporter.SetWholeExtent(0, 74, 0, 74, 0, 74) """ 如果数据是由多块volume数据拼接的 WholeExtent 可以大于 DataExtent,用于表示你导入的是其中的一部分 importer1 = vtkImageImport() importer1.CopyImportVoidPointer(block1_data, len(block1_data)) importer1.SetDataScalarTypeToUnsignedChar() importer1.SetNumberOfScalarComponents(1) importer1.SetDataExtent(0, 511, 0, 511, 0, 511) importer1.SetWholeExtent(0, 1023, 0, 1023, 0, 1023) importer2 = vtkImageImport() importer2.CopyImportVoidPointer(block2_data, len(block2_data)) importer2.SetDataScalarTypeToUnsignedChar() importer2.SetNumberOfScalarComponents(1) importer2.SetDataExtent(512, 1023, 0, 511, 0, 511) importer2.SetWholeExtent(0, 1023, 0, 1023, 0, 1023) # 然后拼接起来 append = vtkAppendFilter() append.AddInputConnection(importer1.GetOutputPort()) append.AddInputConnection(importer2.GetOutputPort()) append.AddInputConnection(importer3.GetOutputPort()) append.Update() """ # 定义标量与颜色的对应关系 colorFunc = vtkColorTransferFunction() colorFunc.AddRGBPoint(50, 1.0, 0.0, 0.0) colorFunc.AddRGBPoint(100, 0.0, 1.0, 0.0) colorFunc.AddRGBPoint(150, 0.0, 0.0, 1.0) alphaChannelFunc = vtkPiecewiseFunction() # piecewise function 百度翻译 分段函数 alphaChannelFunc.AddPoint(0, 0.0) alphaChannelFunc.AddPoint(50, 0.05) alphaChannelFunc.AddPoint(100, 0.1) alphaChannelFunc.AddPoint(150, 0.2) volumeProperty = vtkVolumeProperty() volumeProperty.SetColor(colorFunc) volumeProperty.SetScalarOpacity(alphaChannelFunc) volumeMapper = vtkFixedPointVolumeRayCastMapper() volumeMapper.SetInputConnection(dataImporter.GetOutputPort()) volume = vtkVolume() volume.SetMapper(volumeMapper) volume.SetProperty(volumeProperty) renderer = vtkRenderer() renderer.AddVolume(volume) renderer.SetBackground(colors.GetColor3d("MistyRose")) renderWin = vtkRenderWindow() renderWin.AddRenderer(renderer) renderInteractor = vtkRenderWindowInteractor() renderInteractor.SetRenderWindow(renderWin) renderWin.SetSize(400, 400) renderWin.SetWindowName('VTKWithNumpy') """ 用于实现渲染过程的中断检查,目的是提高应用程序的响应速度 """ def exitCheck(obj, event): # 检查 VTK 渲染窗口的事件队列中是否还有未处理的操作系统或用户输入事件(比如窗口移动、鼠标点击、键盘输入等) if obj.GetEventPending() != 0: obj.SetAbortRender(1) renderWin.AddObserver("AbortCheckEvent", exitCheck) renderInteractor.Initialize() renderWin.Render() renderInteractor.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 6:18:22

如何查看GPU显存占用?nvidia-smi与PyTorch监控结合使用

如何查看GPU显存占用?nvidia-smi与PyTorch监控结合使用 在深度学习模型训练过程中,你是否遇到过这样的场景:程序运行到一半突然报错 CUDA out of memory,而你明明记得显卡还有不少空闲显存?或者发现模型刚加载完还没开…

作者头像 李华
网站建设 2026/4/24 7:04:47

SQLite Indexed By

SQLite Indexed By SQLite 是一个轻量级的数据库管理系统,它以其小巧的体积、高效的数据处理能力和强大的功能而广受欢迎。在SQLite数据库中,索引是提高查询效率的关键因素。本文将深入探讨SQLite索引的原理、类型、创建方法以及最佳实践。 索引的原理 索引是数据库中一种…

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

PostgreSQL NULL 值处理与优化

PostgreSQL NULL 值处理与优化 引言 在数据库设计中,NULL 值是一个重要的概念。在 PostgreSQL 中,NULL 值用于表示未知或缺失的数据。本文将详细介绍 PostgreSQL 中 NULL 值的处理方法,以及如何优化与 NULL 值相关的查询。 什么是 NULL 值? 在 PostgreSQL 中,NULL 值表…

作者头像 李华
网站建设 2026/5/1 5:00:33

YOLOv5l模型在PyTorch-CUDA-v2.8上的训练收敛速度分析

YOLOv5l 模型在 PyTorch-CUDA 环境下的训练收敛速度分析在现代目标检测任务中,模型训练效率直接决定了研发周期和落地成本。以自动驾驶中的实时障碍物识别为例,一个高精度模型若需数天才能完成训练,将极大拖慢迭代节奏。而如今,借…

作者头像 李华
网站建设 2026/4/26 20:28:42

PyTorch-CUDA-v2.8镜像体积优化:精简不必要的依赖包

PyTorch-CUDA-v2.8镜像体积优化:精简不必要的依赖包 在现代AI系统的构建中,一个看似微不足道的细节——容器镜像大小——往往成为影响部署效率和资源利用率的关键瓶颈。尤其是在CI/CD流水线频繁拉取镜像、边缘设备带宽受限或Kubernetes集群大规模调度的…

作者头像 李华
网站建设 2026/5/1 6:14:16

Anaconda配置PyTorch环境时提示空间不足怎么办?

Anaconda配置PyTorch环境时提示空间不足怎么办? 在深度学习项目启动阶段,一个常见的“拦路虎”并不是模型跑不通,而是——环境装不上。尤其当你兴冲冲打开终端准备用 conda install pytorch 创建开发环境时,却收到一条冰冷的提示&…

作者头像 李华