【问题标题】:How to use SimpleITK "LabelOverlapMeasuresImageFilter" to extract measures on Python using NiftiImages如何使用 SimpleITK“LabelOverlapMeasuresImageFilter”在 Python 上使用 NiftiImages 提取度量
【发布时间】:2023-03-30 18:46:01
【问题描述】:

我需要从 2 个带标签的 3d 图像中提取一组指标,它们具有相同的维度、数据类型一切都一样,除了一个是我的银标准,另一个是结果管道。

我的代码是:

reader = sitk.ImageFileReader()
reader.SetImageIO("NiftiImageIO")
reader.SetFileName(file1)
image1 = reader.Execute()
reader.SetFileName(file2)
image2 = reader.Execute()

labelstats = sitk.LabelOverlapMeasuresImageFilter()
labelstats.Execute(image1,image2)

array = [labelstats.GetJaccardCoefficient(), 
         labelstats.GetMeanOverlap(),
         labelstats.GetVolumeSimilarity(),
         labelstats.GetUnionOverlap(),
         labelstats.GetDiceCoefficient(),
         labelstats.GetFalseNegativeError(),
         labelstats.GetFalsePositiveError()]

print array

我得到这个错误:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-14-7560ca50e47b> in <module>()
      7 
      8 labelstats = sitk.LabelOverlapMeasuresImageFilter()
----> 9 labelstats.Execute(image1,image2)
     10 
     11 array = [labelstats.GetJaccardCoefficient(), 

/home/user/.local/lib/python2.7/site-packages/SimpleITK/SimpleITK.pyc in Execute(self, image1, image2)
  42766 
  42767         """
> 42768         return _SimpleITK.LabelOverlapMeasuresImageFilter_Execute(self, image1, image2)
  42769 
  42770 LabelOverlapMeasuresImageFilter_swigregister = _SimpleITK.LabelOverlapMeasuresImageFilter_swigregister

RuntimeError: Exception thrown in SimpleITK LabelOverlapMeasuresImageFilter_Execute: /tmp/SimpleITK-build/SimpleITK-build/Code/BasicFilters/src/sitkLabelOverlapMeasuresImageFilter.cxx:104:
sitk::ERROR: Image2 for LabelOverlapMeasuresImageFilter doesn't match type or dimension!

我在这里错过了什么?

【问题讨论】:

  • 我运行了你的脚本,对我来说效果很好。您使用的是哪个版本的 SimpleITK?
  • 我在 Python 2.7 上运行 v1.2.4 的 SimpleITK
  • 我会检查 image1.GetOrigin() == image2.GetOrigin() 和任何其他图像功能是否正确。另一种选择是将 image1 重新采样到图像 2

标签: python image-processing multidimensional-array itk simpleitk


【解决方案1】:

我会检查 image1.GetOrigin() == image2.GetOrigin() 和任何其他图像特征是否正确。另一种选择是将图像 1 重新采样到图像 2 中。

def resample_image_into_image(img_orig, img_new, write_img=True, interpolator=None):
# given an image path from img_new, resample it so that it matches the original and then write it out if asked

if isinstance(img_orig, str):
    imgA = sitk.ReadImage(img_orig)
if isinstance(img_new, str):
    imgB = sitk.ReadImage(img_new)
if isinstance(img_orig, sitk.Image):
    imgA = img_orig
if isinstance(img_new, sitk.Image):
    imgB = img_new

if interpolator == None:
    interpolation_type = sitk.sitkLinear
else:
    interpolation_type = interpolator

resampleFilter = sitk.ResampleImageFilter()
resampleFilter.SetTransform(sitk.Transform(3, sitk.sitkIdentity))
resampleFilter.SetInterpolator(interpolation_type)

resampleFilter.SetSize(imgA.GetSize())
resampleFilter.SetOutputOrigin(imgA.GetOrigin())
resampleFilter.SetOutputSpacing(imgA.GetSpacing())
resampleFilter.SetOutputDirection(imgA.GetDirection())
resampleFilter.SetOutputPixelType(sitk.sitkFloat32)
resampleFilter.SetDefaultPixelValue(0.0)

registeredImg = resampleFilter.Execute(imgB)
if write_img:
    sitk.WriteImage(sitk.Cast(registeredImg, sitk.sitkUInt8), 'test.nii.gz')
else:
    return registeredImg

【讨论】:

  • 我查过,原点完全一样,尺寸也一样。将尝试使用您的代码。谢谢。
  • 您还需要检查间距、方向和像素类型是否匹配。
  • 非常感谢。我的像素数据类型不匹配。
【解决方案2】:

事实证明,我所要做的就是在尝试运行测试之前检查所有属性是否匹配。这是像素数据类型不匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多