尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

simpleitk和numpy的转化问题

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 图像GetImageFromArray和GetArrayFromImage会自动处理 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 方向矩阵
返回列表