news 2026/8/26 14:21:17

simpleitk和numpy的转化问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
simpleitk和numpy的转化问题

SimpleITK 读取 NIfTI 后,数组默认是zhw顺序((z, y, x)

  • 若需(x, y, z)顺序,需手动转置(np.transpose(array, (2, 1, 0)))。
  • 元数据(如GetSize())仍遵循 NIfTI 的(x, y, z)约定,需注意区分数组顺序和元数据顺序。

1 simpleitk和numpy的维度问题

  • NumPy 数组:始终使用(D, H, W)顺序(3D)或(H, W)顺序(2D)。
  • SimpleITK 图像GetImageFromArrayGetArrayFromImage会自动处理 DHW ↔ WHD 的转换,无需手动转置。
    # 正确用法示例 arr_dhw = np.random.rand(64, 256, 256) # (D, H, W) itk_img = sitk.GetImageFromArray(arr_dhw) # 自动转为 ITK (W, H, D) arr_back = sitk.GetArrayFromImage(itk_img) # 自动转回 (D, H, W)
  • GetImageFromArray会丢失原始图像的物理坐标信息(如像素间距、原点)。
  • 解决:手动设置元数据:
    itk_img = sitk.GetImageFromArray(arr_dhw) itk_img.SetSpacing([1.0, 1.0, 1.0]) # 设置体素间距 (x, y, z) itk_img.SetOrigin([0, 0, 0]) # 设置原点

验证交互正确性的方法

# 检查 NumPy 和 ITK 的维度一致性 arr_dhw = np.random.rand(64, 256, 256) itk_img = sitk.GetImageFromArray(arr_dhw) # 验证转换无失真 assert arr_dhw.shape == (64, 256, 256) # NumPy (D, H, W) assert itk_img.GetSize() == (256, 256, 64) # ITK (W, H, D) assert np.allclose(arr_dhw, sitk.GetArrayFromImage(itk_img))

坚持使用(D, H, W)顺序的 NumPy 数组与 SimpleITK 交互,可避免维度错误。


2 SetDirection()和GetDirection()的矛盾性

使用过程发现读取nii后GetDirection得到实施一个一维16个元素的元组,直接SetDirection失败。原因如下:

direction = src.GetDirection() # 如果是 3D 图像(9 个元素) if len(direction) == 9: direction_matrix = tuple(direction) # 直接传入 9 个元素的元组 # 或者构造 3x3 矩阵(可选) # direction_matrix = ( # direction[0], direction[1], direction[2], # direction[3], direction[4], direction[5], # direction[6], direction[7], direction[8] # ) # 如果是 2D 图像(4 个元素) elif len(direction) == 4: direction_matrix = tuple(direction) # 直接传入 4 个元素的元组 # 或者构造 2x2 矩阵(可选) # direction_matrix = ( # direction[0], direction[1], # direction[2], direction[3] # ) # 如果是 16 个元素(4x4 矩阵),需要提取前 9 个(3x3) elif len(direction) == 16: direction_matrix = ( direction[0], direction[1], direction[2], direction[4], direction[5], direction[6], direction[8], direction[9], direction[10] ) else: raise ValueError("Unsupported direction format!") # 设置方向 target_img = sitk.GetImageFromArray(arr) # 你的目标图像 target_img.SetDirection(direction_matrix) # 正确设置方向
import SimpleITK as sitk import numpy as np # 读取源图像 src = sitk.ReadImage("source.nii") direction = src.GetDirection() # 检查方向矩阵的形状 if len(direction) == 9: # 3D 图像 direction_matrix = direction elif len(direction) == 4: # 2D 图像 direction_matrix = direction elif len(direction) == 16: # 4x4 矩阵,提取 3x3 direction_matrix = ( direction[0], direction[1], direction[2], direction[4], direction[5], direction[6], direction[8], direction[9], direction[10] ) else: raise ValueError("Unsupported direction format!") # 创建目标图像并设置方向 arr = sitk.GetArrayFromImage(src) # 获取 NumPy 数组 target_img = sitk.GetImageFromArray(arr) target_img.SetDirection(direction_matrix) # 正确设置方向 # 保存 sitk.WriteImage(target_img, "output.nii")

如果是9个元素,直接target_img.SetDirection(src.GetDirection())

如果是 16 个元素(4x4 矩阵),提取前 9 个构造 3x3 方向矩阵

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 14:20:37

灰度演化函数 GEF 在 AI 工程落地:消解模型循环与幻觉

1. 引言:两个挥之不去的工程痛点 大模型能力越强,两个问题反而越刺眼: 幻觉:模型强行输出看似精确、实则虚假的确定答案;推理循环震荡:来回反复、自相矛盾、无休止辩论,最终死循环。 灰度演化函…

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

头歌实践教学平台:数据科学与大数据技术导论(七上)

七、大数据第1关:大数据时代任务描述 本关任务:根据相关知识内容完成右边选择题。相关知识 为了完成本关任务,你需要掌握: 1.第三次信息化浪潮; 2.信息科技为大数据时代提供技术支撑; 3.数据产生方式的变革…

作者头像 李华
网站建设 2026/8/26 13:58:58

Linux环境下部署MySQL8数据库

MySQL安装 1、下载软件包:mysql-8.0.15-1.el7.x86_64.rpm-bundle.tar 2、将软件包通过moba上传到linux系统/usr/local/soft/目录下 3、解压软件包 cd /usr/local/soft/ tar -xvf mysql-8.0.15-1.el7.x86_64.rpm-bundle.tar 4、卸载系统自带mariadb rpm -qa | gr…

作者头像 李华
网站建设 2026/8/26 13:53:06

在PHP中,如何实现基于事件的编程模型以提高性能?

在PHP中,基于事件的编程模型主要是用来处理那些需要等待某些外部操作(比如数据库查询、文件读写、网络请求等)完成的情况。通常,这些操作会花费一些时间,如果我们的代码只是傻傻地等在那里,不做其他事情&am…

作者头像 李华
网站建设 2026/8/26 13:47:57

JobRadar实战:本地LLM Agent驱动的智能招聘筛选与评分排序

年初开始认真整理自己的求职工具链,被一个很有意思的开源项目吸引了注意力——JobRadar。它不是一个普通的招聘网站爬虫,而是把 LLM Agent 的思路真正用到了招聘信息筛选场景里:用本地运行的 LLM 给每一条职位数据打分,再根据分数…

作者头像 李华