Python VTK numpy数据3D可视化

2023-11-16

在Python的3D图像处理中,通常用numpy array来进行非常方便的计算或者转化,这里记录一下numpy数据的VTK可视化基本流程,包括面绘制(Surfase Rendering)和体绘制(Volume Rendering)。除去数据格式转化,面绘制和体绘制在C++中也是类似的处理方法。

numpy数据转成vtkImageData

首先得把numpy数据转成vtk里可以用的格式:numpy array -> vtkIImageData。这里的numpy array是一个离散的三维空间数据场,0代表背景,非0代表前景点。

方法一:numpy_to_vtk

可以直接使用vtk.util.numpy_support里的转换方法,非常方便。这是它的说明文档:

numpy_to_vtk(num_array, deep=0, array_type=None)
    Converts a contiguous real numpy Array to a VTK array object.

    This function only works for real arrays that are contiguous.
    Complex arrays are NOT handled.  It also works for multi-component
    arrays.  However, only 1, and 2 dimensional arrays are supported.
    This function is very efficient, so large arrays should not be a
    problem.

    If the second argument is set to 1, the array is deep-copied from
    from numpy. This is not as efficient as the default behavior
    (shallow copy) and uses more memory but detaches the two arrays
    such that the numpy array can be released.

    WARNING: You must maintain a reference to the passed numpy array, if
    the numpy data is gc'd and VTK will point to garbage which will in
    the best case give you a segfault.

    Parameters
    ----------

    - num_array :  a contiguous 1D or 2D, real numpy array.

对于3D array,可以用flatten或者ravel先转成1D array就可以使用了。这里的1D array得是C order(row-major order),最好使用deep copy以免出现一些内存管理的问题。

import numpy as np
import vtk
from vtk.util import numpy_support

# numpy_data is a 3D numpy array
shape = numpy_data.shape[::-1]
vtk_data = numpy_support.numpy_to_vtk(numpy_data.ravel(), 1, vtk.VTK_SHORT)

vtk_image_data = vtk.vtkImageData()
vtk_image_data.SetDimensions(shape)
vtk_image_data.SetSpacing(spacing)
vtk_image_data.SetOrigin(origin)
vtk_image_data.GetPointData().SetScalars(vtk_data)

# vtk_image_data: ready to use

方法二:vtkImageImport

使用Python也可以用vtkImageImport来直接导入C array,就是要先把numpy array变成string。

import numpy as np
import vtk

numpy_str = numpy_data.astype(np.int16).tostring()
x_extent = numpy_data.shape[2]
y_extent = numpy_data.shape[1]
z_extent = numpy_data.shape[0]

image_import = vtk.vtkImageImport()
image_import.SetImportVoidPointer(numpy_str, len(numpy_str))
# 也可以使用CopyImportVoidPointer() 会copy一份numpy_str
image_import.SetWholeExtent(0, x_extent-1, 0, y_extent-1, 0, z_extent-1)
image_import.SetDataExtent(0, x_extent-1, 0, y_extent-1, 0, z_extent-1)
image_import.SetDataScalarTypeToShort() # 根据需求指定数据类型
image_import.SetNumberOfScalarComponents(1)
# 如果是RGB数据的话,SetNumberOfScalarComponents(3)
image_import.Update()

vtk_image_data = vtk.vtkImageData()
vtk_image_data.SetSpacing(spacing)
vtk_image_data.SetOrigin(origin)

# vtk_image_data: ready to use

绘制

参考:https://www.cnblogs.com/XDU-Lakers/p/10822840.html
这个作者总结的很全面,还有代码示例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python VTK numpy数据3D可视化 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 为什么从 Pandas 1.0 中删除了日期时间?

    我在 pandas 中处理大量数据分析并每天使用 pandas datetime 最近我收到警告 FutureWarning pandas datetime 类已弃用 并将在未来版本中从 pandas 中删除 改为从 datetime 模块
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • Numpy - 根据表示一维的坐标向量的条件替换数组中的值

    我有一个data多维数组 最后一个是距离 另一方面 我有距离向量r 例如 Data np ones 20 30 100 r np linspace 10 50 100 最后 我还有一个临界距离值列表 称为r0 使得 r0 shape Dat
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • Python ImportError:无法导入名称 __init__.py

    我收到此错误 ImportError cannot import name life table from cdc life tables C Users tony OneDrive Documents Retirement retirem
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street

随机推荐

  • 机器学习:python 实现一个linear regression

    1 原理介绍 linear regression步骤 1 导入数据 2 将数据分为训练集合测试集 linear regression 分为x train x text y train y test 3 导入线性回归算法 利用训练集计算出模型
  • zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74070.iso镜像下载

    链接 https pan baidu com s 17J tWrQcnAU QGG uWdcIwhttps pan baidu com s 17J tWrQcnAU QGG uWdcIw 提取码 zt88
  • 远程工作高效方法(几年前帖子,私密变公开后时间就变了)

    1 要和居住环境分开 我在阳台上办公 2 制订计划 每天写到纸上 贴在墙上 3 时间调整 以前上班时 有公司上班时间 先在要调整 比如 上午九点才开始工作 在家可以7点起床 困了再睡 4 每小时是工作内容 学习内容50分钟 视频教程1个或者
  • ubuntu中使用QT同时编译pcl和opencv出现error: field ‘pa ram_k_’ has incomplete type ‘flann::SearchParams’

    问题描述 ubuntu中使用QT同时编译opencv和pcl时出现如下错误 错误原因 pcl和opencv中均包含flann库产生冲突 解决办法 将flann目前更换为flann2或者其它名字 在更改目录后 其它关联引用文件也需要更改 涉及
  • kali apt update问题

    这两天使用卡里进行升级sudo apt update 错误无法升级 sudo apt update Get 1 http mirrors neusoft edu cn kali kali rolling InRelease 30 6 kB
  • 算法笔记-DTW动态时间规整

    算法笔记 DTW动态时间规整 简介 简单的例子 定义 讨论 约束条件 步模式 标准化 点与点的距离函数 具体应用场景 分类 点到点匹配 算法笔记 DTW动态时间规整 动态时间规整 规划 Dynamic Time Warping DTW 是一
  • 戴尔如何加装固态硬盘

    这是手册中有关固态硬盘的支持规格 您可以按照这个参数进行选购 G15 5511 支持两个 M 2 2230 2280 固态硬盘 M 2 2230 固态硬盘 PCIe 3 0 x4 NVMe 高达 1 TB M 2 2280 固态硬盘 PCI
  • 2023版软件测试学习路线图(超详细自学路线)

    送福利了 超详细的软件测试学习路线图来啦 2023版是首发哟 软件测试学习路线图分为9个阶段 包含 软件测试环境配置和管理 gt 软件测试数据管理与数据库测试 gt web前端测试技术 gt 通用软件测试技术 gt Python测试开发技术
  • python openpyxl 操作excel 插入行,列

    import openpyxl wb openpyxl load workbook D 村数据 实验 xlsx ws wb Sheet1 ws insert rows 3 插入行 ws insert cols 4 插入列 wb save D
  • JAVA【基础】 IDEA导入jar包的几种方式

    目录 获取想要添加的依赖 或者jar包 maven添加依赖 手动导入jar包 最后测试一下 是否添加成功 下面多图预警 获取想要添加的依赖 或者jar包 添加依赖 或者下载jar包 都可以去maven网站下载 进入 Maven仓库 http
  • 获取windows凭证管理器明文密码

    1 运行cmdkey list查看windows保存凭证 方法1 mimikaz mimikatz vault cred 2 利用powershell尝试获取 windows 普通凭据类型中的明文密码 powershell import F
  • IPv6基础

    IPv6 1 优势 无限 地址空间 地址长度为128 bit 海量的地址空间 满足物联网等新兴业务 有利于业务演进及扩展 层次化的地址结构 相较于IPv4地址 IPv6地址的分配更加规范 利于路由聚合 缩减IPv6路由表规模 路由快速查询
  • 数的划分(递归)

    整数划分是另外的问题 题目描述 Description 将整数n分成k份 且每份不能为空 任意两种划分方案不能相同 不考虑顺序 例如 n 7 k 3 下面三种划分方案被认为是相同的 7 1 1 5 7 1 5 1 7 5 1 1 问有多少种
  • 7z怎么解压linux,7z 常用解压命令

    用命令行来执行7z的极限压缩 就是如下的命令 C 01 MyApp 7 Zip 7z exe a t7z newPack 7z F 14 newWork 7z testDoc r mx 9 m0 LZMA2 ms 10m mf on mhc
  • cmd简单游戏代码_python简单游戏应用——剪刀石头布!

    我们的基础中的基础 在前几文中已经介绍完了 其他的知识用什么学什么就对了 接下来我们做款小游戏 纵观全文 先引入了一个函数 random 随机数 单用random 这个函数 会产生一个随机的实数 范围在 0 1 若是要从自定的范围取出一个
  • 在flask框架中,设置执行完视图函数后自动将数据提交回数据库

    设置执行完视图函数后自动提交操作回数据库 app config SQLALCHEMY COMMIT ON TEARDOWN True
  • pytorch GPU版本安装

    使用驱动精灵安装 参考 pytorch GPU版本安装 尘世猫的博客 CSDN博客 pytorchgpu版本 安装cuda 高版本的cuda是可以兼容低版本的cuda的 比如我的电脑支持cuda11 0 我就可以安装cuda10 0 cud
  • 汽车OBD初级开发入门

    汽车OBD初级开发入门 我所认识的OBD 从何开始学习OBD stm32的CAN总线 OBD的标准协议 我所认识的OBD 直观的从名称上来说是英文On Board Diagnostics的缩写 中文翻译为 车载诊断系统 书面上的解释就是处理
  • 太强了!100个Python算法实例.pdf

    常言道 算法才是编程的灵魂 不管是java python还是PHP 都跨不过算法这个门槛 算法确实不好学 但算法也是真必要 各大公司为了筛选人才 面试程序员的时候多多少少都会考察你的算法能力 学习算法无非这几种目的 学习基本编程语法和思想
  • Python VTK numpy数据3D可视化

    在Python的3D图像处理中 通常用numpy array来进行非常方便的计算或者转化 这里记录一下numpy数据的VTK可视化基本流程 包括面绘制 Surfase Rendering 和体绘制 Volume Rendering 除去数据