美文网首页
pyradiomics报错“Inputs do not occu

pyradiomics报错“Inputs do not occu

作者: CrimsonUMO | 来源:发表于2022-11-25 23:44 被阅读0次

今天遇到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之后就可以正常提取了。

相关文章

网友评论

      本文标题:pyradiomics报错“Inputs do not occu

      本文链接:https://www.haomeiwen.com/subject/rjvqfdtx.html