当前位置: 首页 > news >正文

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()
http://www.jsqmd.com/news/161773/

相关文章:

  • GitHub Template仓库快速生成PyTorch-CUDA项目结构
  • 热梗营销玩出深度共振,美团联合快手再造全民回忆
  • 省选集训 4 - 图论与网络流
  • Conda环境变量设置:指定CUDA_VISIBLE_DEVICES控制GPU使用
  • CNN图像分类实战:基于PyTorch-CUDA-v2.8的端到端训练
  • PyTorch安装教程GPU版:CentOS系统适配指南
  • MySQL数据库 - 努力-
  • GitHub仓库结构设计:组织PyTorch项目代码的最佳方式
  • 【飞书入门】1-飞书支持Markdown 吗
  • 【毕业设计】基于SpringBoot的高尔夫球场管理系统的设计与实现基于Springboot高尔夫场地预约网站管理系统(源码+文档+远程调试,全bao定制等)
  • 【飞书入门】飞书支持Markdown 吗
  • GitHub项目README模板:突出PyTorch-CUDA环境优势
  • AppML 案例简介
  • 马头是区——团队总结
  • PyTorch-CUDA-v2.8镜像日志轮转策略防止磁盘占满
  • 【计算机毕业设计案例】基于Springboot的克州旅游网站的设计与实现精品路线推荐、行程规划、价格查询(程序+文档+讲解+定制)
  • MCP Inspector中Streamable HTTP授权头缺失问题的技术诊断与解决方案
  • Java计算机毕设之基于SpringBoot的高尔夫球场管理系统场地预订、会员管理的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • Java毕设项目推荐-基于Springboot的克州旅游网站的设计与实现基于springboot旅游网站【附源码+文档,调试定制服务】
  • Bootstrap5 表单验证
  • JSP 生命周期
  • 软工学期总结
  • 2026年微信立减金回收品牌推荐榜 - 京顺回收
  • Anaconda配置PyTorch环境时提示空间不足怎么办?
  • Java毕设项目:基于Springboot高尔夫场地预约网站管理系统基于SpringBoot的高尔夫球场管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 机器人也能听懂音乐:本田研究院让机器人学会用耳朵预知未来
  • 清华镜像站证书过期问题临时绕行方案
  • 【接口测试】4_PyMySQL模块 _操作数据库
  • MySQL 数据库优化:从配置到SQL,性能提升实战指南
  • HTML 媒体(Media)