0

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

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

将 SimpleITK 导入为 sitk

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

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

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

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

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

4

2 回答 2

0

我认为我们必须将 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)
于 2021-07-16T01:59:59.463 回答
0

我相信您可以为此使用TorchIOResample中的转换:

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 的主要开发者。

于 2021-04-16T15:49:24.127 回答