今天遇到pyradiomics的一个新报错,记录一下
还是在提取特征的时候,弹出了报错:
RuntimeError: Exception thrown in SimpleITK LabelStatisticsImageFilter_Execute: D:\bld\libsimpleitk_1664895736932\_h_env\Library\include\ITK-5.2\itkImageSink.hxx:242:
ITK ERROR: LabelStatisticsImageFilter(0000025BA33E76E0): Inputs do not occupy the same physical space!
InputImage Origin: [-1.9320000e+02, -2.1650000e+02, -1.6450000e+02], InputImagePrimary Origin: [1.9320000e+02, 2.1650000e+02, -1.6450000e+02]
Tolerance: 8.4570301e-06
关键的字段是“Inputs do not occupy the same physical space! ”,简单检索一下,怀疑是image和mask没有对齐/配准。这个问题最终在CSDN一位博主那里找到了答案,链接放在下面:
https://blog.csdn.net/qq_40318502/article/details/118599502
这位博主可能是不在本地训练的,不过我的问题基本类似。解决方法相同,具体如下:
首先加载包:
import SimpleITK as sitk
然后获取image的坐标系
origin_img=sitk.ReadImage("F:\\Data\Green\exam\p019643\p019643_image.nrrd") #读取原始文件
origin=origin_img.GetOrigin() #这三句是获取的原始图像文件的位置和方向
spacing=origin_img.GetSpacing()
direction=origin_img.GetDirection()
然后用image的坐标系对齐mask的坐标
w=sitk.ReadImage("F:\\Data\Green\exam\p019643\p019643_mask.nii.gz") # 读取自己预测得到的nii.gz文件
w.SetOrigin(origin) #将自己的文件处理成和官方一致的位置坐标系
w.SetSpacing(spacing)
w.SetDirection(direction)
最后输出为新的mask
sitk.WriteImage(w, "F:\\Data\Green\exam\p019643\p019643_mask.nii.gz") #处理完之后保存到相应的合适位置。
之后再提取特征就OK了
——————————————————————
后续:
批量提取的时候发现新的问题,在完成预处理之后仍然有图像会报错:
RuntimeError: Exception thrown in SimpleITK LabelStatisticsImageFilter_Execute: D:\bld\libsimpleitk_1664895736932\_h_env\Library\include\ITK-5.2\itkImageSink.hxx:242:
ITK ERROR: LabelStatisticsImageFilter(0000016D6A934030): Inputs do not occupy the same physical space!
InputImage Origin: [2.5570000e+02, 2.7479999e+02, -2.2500000e+02], InputImagePrimary Origin: [2.5570000e+02, 2.7480000e+02, -2.2500000e+02]
Tolerance: 1.0000000e-05
看来还是origin的问题。
重复尝试配准,依然没有解决问题。最后仔细阅读了代码,并对配准的过程进行了核对。
origin_img=sitk.ReadImage(imagePath) #读取原始文件
mask = sitk.ReadImage(maskPath) #读取自己得到的nii.gz文件
origin=origin_img.GetOrigin() #这三句是获取的原始图像文件的位置和方向
print(origin)
print(mask.GetOrigin())
(255.69999999999996, 274.8, -225.00000000000006)
(255.6999969482422, 274.79998779296875, -225.0)
可以看到即便是配准之后的mask依然和原始图像有区别。但是这个区别没办法通过setOrigin进行修改了,反复尝试存取之后,读进来仍然是这个origin。最后还是把Tolerance这个参数调大了。之前设置的Tolerance = 1e-5,设置Tolerance = 1e-4之后就可以正常提取了。