使用参考体积将 .nrrd 分段转换为 Nifti 体积

问题描述

我有 200 多个具有匹配分段的 CT 卷文件。卷采用 .nrrd 格式,分段采用 seg.nrrd 格式。我需要这两种格式的 .nii.gz 格式,我想编写从一种格式到另一种格式的转换脚本。

关于Volumes,一切都很简单,使用sitk:

将 SimpleITK 导入为 sik

img = satk.ReadImage(“your_image.nrrd”) satk.WriteImage(img,“your_image.nii.gz”)

我也对分割做了同样的事情,乍一看效果很好。但是现在的问题是分段不再在卷中注册。图像尺寸和图像来源不再相同,因此我无法处理转换后的图像。

当我使用 3D-Slicer 执行以下手动步骤时,也会发生同样的情况: 1. 将 .seg.nrrd 文件作为分段加载到 Slicer 2. 将分段保存为 .nrrd 文件而不是 seg.nrrd 3. 导入.nrrd 文件作为 Volume 并将分割保存为 .nii.gz

但我想出了一种在保留所有维度的同时手动转换数据类型的方法: 1. 导入 Volume 以及相应的分段 (.seg.nrrd) 2. 将分段导出到标签图,参考体积设置为我对应的卷 3. 将 Labelmap 保存为 nii.gz(4. 不确定我的项目是否需要该步骤:将 Labelmap 转换为标量卷并作为 nii.gz 安全)

在 3. 和 4. 两种情况下,我都有一个具有匹配尺寸的 nii.gz 文件。但由于我有 200 多个卷,我需要编写脚本。但到目前为止我还没有找到任何东西。你有什么想法?谢谢!

解决方法

我相信您可以使用 Resample 中的 TorchIO 转换:

import torchio as tio

# Fill these two lists
ct_paths = []
seg_paths = []

for ct_path,seg_path in zip(ct_paths,seg_paths):
    image = tio.LabelMap(seg_path)
    transform = tio.Resample(ct_path)
    transformed = transform(image)
    out_path = seg_path.replace('.seg','_registered')
    transformed.save(out_path)

如果您的对具有相同的间距和方向,这将简单地填充您的分段,使原点和形状保持一致。

免责声明:我是 TorchIO 的主要开发者。

,

我认为我们必须将 label.nrrd 转换为参考图像,例如具有 FTITI 或 nrrd 格式的 CT 或 MRI 图像。关键词是使用SimpleITK函数TransformPhysicalPointToIndex,将label.nrrd的原点转换为图像空间中的相关索引。希望下面的demo可以帮到你

roi_data = sitk.GetArrayFromImage(roi_image)
start_point = ref_image.TransformPhysicalPointToIndex(roi_image.GetOrigin())
  
new_roi_array = np.zeros(ref_image.GetSize())
new_roi_array[start_point[0]: start_point[0] + roi_image.GetSize()[0],start_point[1]: start_point[1] + roi_image.GetSize()[1],start_point[2]: start_point[2] + roi_image.GetSize()[2]
              ] = roi_data
  
new_roi_image = sitk.GetImageFromArray(new_roi_array)
new_roi_image.CopyInformation(ref_image)