dicom2nifti转换DICOM为NIFTI后标签翻转错位如何解决
问题原因
调用dicom2nifti.dicom_series_to_nifti()转换后出现mask水平翻转、和影像错位,核心原因是DICOM到NIFTI转换时的坐标系映射不一致:
- DICOM默认使用LPS(左-后-上)坐标系,部分NIFTI处理工具默认使用RAS(右-前-上)坐标系,轴方向映射差会直接导致左右水平翻转
- 转换时如果影像和mask没有使用完全一致的方向重定向、重采样参数,两者的仿射矩阵不匹配,就会出现对齐错位
- 部分非标准导出的DICOM序列
Image Orientation (Patient)字段缺失或值异常,dicom2nifti默认校验逻辑会自动修正方向,但如果mask没有同步做相同修正,就会出现错位
修复方案
方案1:统一转换参数,从源头保证坐标一致
转换时强制开启NIFTI标准方向重定向,且影像、对应mask的原始DICOM序列必须使用完全相同的转换配置,参考代码:import dicom2nifti # 统一配置 dicom2nifti.settings.disable_validate_orthogonal() dicom2nifti.settings.set_resample(False) # 转换影像 dicom2nifti.dicom_series_to_nifti( dicom_image_series_path, "output_image.nii.gz", reorient_nifti=True # 强制输出为标准NIFTI坐标系,保证所有输出方向统一 ) # 转换mask对应的DICOM标注序列,参数完全和上面一致 dicom2nifti.dicom_series_to_nifti( dicom_mask_series_path, "output_mask.nii.gz", reorient_nifti=True )不要混用不同工具、不同参数转出的影像和mask做配准/特征提取。
方案2:修正已生成的错位文件
如果已经转出了影像和mask,不想重新转换,可以用SimpleITK同步空间元数据+修正翻转轴:import SimpleITK as sitk import numpy as np # 读取已转换的文件 img = sitk.ReadImage("converted_img.nii.gz") misaligned_mask = sitk.ReadImage("misaligned_mask.nii.gz") # 提取mask数组做水平翻转,注意SimpleITK数组维度顺序为(Z,Y,X),水平左右轴对应X轴即索引2 mask_arr = sitk.GetArrayFromImage(misaligned_mask) fixed_mask_arr = np.flip(mask_arr, axis=2) # 把翻转后的mask对齐到影像的空间信息 fixed_mask = sitk.GetImageFromArray(fixed_mask_arr) fixed_mask.CopyInformation(img) # 保存修正后的mask sitk.WriteImage(fixed_mask, "aligned_mask.nii.gz")保存后可以用3D Slicer或ITK-SNAP加载验证对齐效果,确认无误后再用于后续流程。
方案3:换用一致性更高的转换工具规避解析bug
dicom2nifti对部分非标准DICOM的方向解析存在已知问题,可以换用领域内通用的dcm2niix工具做转换,自动处理坐标系映射问题,命令行调用示例:dcm2niix -z y -f output_name_rule -o /path/to/save/nifti /path/to/input/dicom/series影像和mask序列使用相同版本dcm2niix转换即可保证坐标完全对齐,不需要额外修正。
注意:运行pyradiomics特征提取前,必须校验影像和mask的四个空间属性完全一致:数组维度、体素间距、方向矩阵、原点坐标,否则提取出的特征不具备有效性。
内容的提问来源于stack exchange,提问作者Rohini Gaikar
相关产品推荐
相关产品推荐

