Как использовать SimpleITK LabelOverlapMeasuresImageFilter для извлечения мер на Python с помощью NiftiImages

Мне нужно извлечь набор метрик из двух помеченных 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!

Что мне здесь не хватает?


person Vitor Hugo    schedule 19.05.2020    source источник
comment
Я запустил ваш скрипт, и он отлично сработал для меня. Какую версию SimpleITK вы используете?   -  person Dave Chen    schedule 19.05.2020
comment
Я запускаю SimpleITK версии 1.2.4 на Python 2.7.   -  person Vitor Hugo    schedule 20.05.2020
comment
Я бы проверил, что image1.GetOrigin() == image2.GetOrigin() и любые другие функции изображения верны. Другой вариант - преобразовать изображение 1 в изображение 2.   -  person g.stevo    schedule 20.05.2020


Ответы (2)


Я бы проверил, что 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
person g.stevo    schedule 19.05.2020
comment
Я проверил, и происхождение точно такое же, и те же размеры. постараюсь использовать ваш код. Спасибо. - person Vitor Hugo; 20.05.2020
comment
Вам также необходимо проверить соответствие интервалов, направлений и типов пикселей. - person Dave Chen; 20.05.2020
comment
Большое спасибо. Тип данных моего пикселя не соответствует. - person Vitor Hugo; 25.05.2020

Оказывается, все, что мне нужно было сделать, это проверить, совпадают ли все атрибуты, прежде чем пытаться запустить тесты. Это было несоответствие типа данных пикселя.

person Vitor Hugo    schedule 03.06.2020