1

I need to extract a set of metrics from 2 labeled 3d images, with the same dimensions, data types EVERYTHING IS THE SAME, except that one is my silver standard and the other one is the result of a pipeline.

my code is:

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

And I get this error:

---------------------------------------------------------------------------
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!

What am I missing here?

Jona
  • 1,218
  • 1
  • 10
  • 20
Vitor Hugo
  • 23
  • 2

2 Answers2

0

I would check that image1.GetOrigin() == image2.GetOrigin() and any other image features are correct. The other option is to resample image1 into image 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
g.stevo
  • 745
  • 3
  • 10
0

Turns out that all I had to do was to check if all the attributes did match before trying to run the tests. It was a pixel data type mismatch.

Vitor Hugo
  • 23
  • 2