news 2026/4/11 18:28:02

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/9 6:50:39

Markdown制作幻灯片:用于PyTorch项目汇报展示

Markdown制作幻灯片:用于PyTorch项目汇报展示 在深度学习项目的日常推进中,一个常被忽视却极为耗时的环节,是将实验结果整理成一份清晰、专业且可复现的汇报材料。许多团队仍依赖 PowerPoint 手动拼接截图、复制指标、调整排版——这一过程不…

作者头像 李华
网站建设 2026/4/10 1:55:01

GitHub Actions持续集成PyTorch模型测试用例

GitHub Actions 持续集成 PyTorch 模型测试用例 在现代深度学习项目中,代码提交后“本地能跑但上线报错”的尴尬场景屡见不鲜。尤其当模型涉及 GPU 加速、分布式训练或混合精度推理时,仅靠 CPU 环境的 CI 测试已远远不够。如何确保每一次 git push 都不会…

作者头像 李华
网站建设 2026/4/9 13:21:29

Java毕设选题推荐:基于SpringBoot+Vue的高尔夫球场服务系统设计与实现基于SpringBoot的高尔夫球场管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/3 14:27:04

基于云-TOPSIS法综合评价模型MATLAB代码

一、研究背景 该代码针对应急物流供应商选择问题,结合云模型与TOPSIS 方法,构建了一种能处理评价不确定性和模糊性的决策模型。传统 TOPSIS 在权重确定和评价信息处理上存在局限性,而云模型能有效表征语言评价的随机性与模糊性,提…

作者头像 李华
网站建设 2026/4/3 9:05:28

《Ionic 按钮》

《Ionic 按钮》 引言 在移动应用开发领域,用户界面的设计至关重要。一个优秀的用户界面不仅能够提升用户体验,还能让应用在众多竞争者中脱颖而出。在众多前端框架中,Ionic 框架以其强大的跨平台能力和简洁易用的特性受到开发者青睐。本文将深入探讨 Ionic 按钮的用法、特性…

作者头像 李华
网站建设 2026/4/8 14:38:00

jQuery Mobile Data 属性详解

jQuery Mobile Data 属性详解 引言 jQuery Mobile 是一个基于 jQuery 的开源移动开发框架,它允许开发者使用简单的 HTML、CSS 和 JavaScript 代码创建响应式、跨平台的应用程序。在 jQuery Mobile 中,Data 属性扮演着至关重要的角色,它允许开发者在不编写额外代码的情况下…

作者头像 李华