问题描述
我有 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)