news 2026/4/3 4:48:49

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/3 0:11:57

Markdown嵌入交互式图表:动态展示PyTorch训练曲线

Markdown嵌入交互式图表:动态展示PyTorch训练曲线 在深度学习项目的日常开发中,你是否经历过这样的场景?模型已经跑了几十个epoch,终端里滚动着一行行损失值,但你依然无法判断它到底收敛了没有。截图几张静态图像发给同…

作者头像 李华
网站建设 2026/4/1 22:18:17

PyTorch-CUDA-v2.8镜像容器逃逸风险评估与防范

PyTorch-CUDA-v2.8镜像容器逃逸风险评估与防范 在AI工程实践中,我们常会遇到这样的场景:团队成员提交的训练脚本在本地运行完美,但一旦部署到服务器就报错“CUDA not available”;更糟的是,某天突然发现一台GPU主机被…

作者头像 李华
网站建设 2026/3/31 14:30:14

Conda环境清理技巧:释放PyTorch开发磁盘空间

Conda环境清理技巧:释放PyTorch开发磁盘空间 在深度学习项目的日常迭代中,一个看似不起眼的问题常常悄然浮现——明明刚启动的云实例有上百GB存储,几轮实验下来却突然提示“磁盘空间不足”。尤其当你使用的是预装 PyTorch 和 CUDA 的镜像时&a…

作者头像 李华
网站建设 2026/3/31 2:21:53

如何在PyTorch-CUDA-v2.8中启用混合精度训练?

如何在 PyTorch-CUDA-v2.8 中启用混合精度训练 在当前深度学习模型动辄上百亿参数的背景下,训练效率和显存占用已成为制约研发迭代速度的关键瓶颈。尤其在视觉、大语言模型等场景中,使用传统 FP32 单精度训练不仅容易“爆显存”,还会让每个 e…

作者头像 李华
网站建设 2026/3/30 14:33:46

马里兰大学突破:AI实现侦探式渐进推理探索

这项由马里兰大学学院园分校的陈瑞凡、梁怡君、什韦塔巴德瓦杰、科韦西科比纳、李明和周天怡等研究人员共同完成的研究发表于2025年12月,论文编号为arXiv:2512.11995v1。有兴趣深入了解的读者可以通过该编号查询完整论文。当我们面对一个复杂问题时,比如…

作者头像 李华