Можно ли использовать маску в ИТК для регистрации двух изображений?

Я хотел бы знать, возможно ли использовать две бинарные маски (по одной для каждого изображения) для регистрации двух изображений с помощью Simple ITK?

Действительно, мне нужно зарегистрировать 2 изображения, которые уже имеют географическую привязку (пиксели, не содержащие данных, заполнены «0»), но где ошибка проекции все еще существует.

Итак, я хочу использовать только пиксели, значения маски которых равны «1» при вычислении метрики сходства.

Вот мой фрагмент кода:

fixed = sitk.ReadImage('#######/imgRef.png', sitk.sitkFloat32);
moving = sitk.ReadImage('#######/imgRep.png', sitk.sitkFloat32)
maskFixed = sitk.ReadImage('#######/maskRef.png', sitk.sitkUInt8)
maskMoving= sitk.ReadImage('#######/maskRep.png', sitk.sitkUInt8)

# Handle optimizer
R = sitk.ImageRegistrationMethod()

# Restrict the evaluation of the similarity metric thanks to masks
R.SetMetricFixedMask(maskFixed)
R.SetMetricMovingMask(maskMoving)

# Set metric as mutual information using joint histogram
R.SetMetricAsMattesMutualInformation(numberOfHistogramBins=255)

# Gradient descent optimizer
R.SetOptimizerAsRegularStepGradientDescent(learningRate=0.01, minStep=1e-5, numberOfIterations=100, gradientMagnitudeTolerance=1e-8)

#R.SetOptimizerScalesFromPhysicalShift()

R.SetMetricSamplingStrategy(R.REGULAR) #R.RANDOM

# Define the transformation (Rigid body here)

transfo = sitk.CenteredTransformInitializer(fixed, moving, sitk.Euler2DTransform())

R.SetInitialTransform(transfo)

# Define interpolation method
R.SetInterpolator(sitk.sitkLinear)

# Add command to the registration process
R.AddCommand(sitk.sitkIterationEvent, lambda: command_iteration(R))
R.AddCommand(sitk.sitkStartEvent, lambda: start_plot())
R.AddCommand(sitk.sitkEndEvent, lambda: end_plot())
R.AddCommand(sitk.sitkIterationEvent, lambda: current_plot(R))
# Perform registration
outTx = R.Execute(fixed, moving)

print(outTx)
print("--------")
print("Optimizer stop condition: {0}".format(R.GetOptimizerStopConditionDescription()))
print("Number of iterations: {0}".format(R.GetOptimizerIteration()))
print("--------")

# Perform transformation and resample the moving image

# Save transformation as tfm file
sitk.WriteTransform(outTx, '/home/egs/f_nicolas/CODES_THESE/transfo_final.tfm')
#sitk.Show(transfo.GetDisplacementField(),"Displacement field")

# Resample moving image according to the last transformation
resampler = sitk.ResampleImageFilter()
resampler.SetReferenceImage(fixed)
resampler.SetInterpolator(sitk.sitkLinear)
#resampler.SetDefaultPixelValue(100)
resampler.SetTransform(outTx)
out = resampler.Execute(moving)

Я надеюсь, что кто-то может помочь!


person neon29    schedule 14.09.2015    source источник
comment
Как вы думаете, почему это не работает? Можете ли вы поделиться своими данными? Каков результат?   -  person blowekamp    schedule 15.09.2015


Ответы (2)


Да. Вы можете сделать это с помощью этого кода Newfixed=fixedfixedmask; Newmoving=movingmovingmask;

И сделайте регистрацию, используя newfixed и d newmoving

person Nasrin    schedule 26.03.2017
comment
Пожалуйста, отредактируйте свой пост, чтобы код был отформатирован. - person BusyProgrammer; 26.03.2017

Я знаю, что вы можете сделать это в ITK, но я не уверен, что это возможно в Simple ITK. Он может не иметь всех функций ITK.

В реализации C++ вы можете сделать следующее:

int Dimension = 3;
typedef itk::ImageMaskSpatialObject< Dimension > MaskObjectType;

itk::NormalizedMutualInformationHistogramImageToImageMetric<ImageType, ImageType> NMIMetricType;

NMIMetricType::Pointer nmiMetric = NMIMetricType::New();

// fixedImageMask is a pointer to a binary ITK image
// ITK ignores pixels that are 0 and only uses non-zero pixels
fixedMaskObject->SetImage( fixedImageMask ); 

nmiMetric->SetFixedImageMask(fixedMaskObject.GetPointer()); //fixedMaskObject is a MaskObjectType
person siavashk    schedule 15.09.2015
comment
SetFixedImageMask() и SetMovingImageMask() также доступны в SimpleITK, я добавил свою текущую оду в свой вопрос. - person neon29; 15.09.2015
comment
В реализации ITK на C++ вам необходимо создать MaskSpatialObject из изображения маски перед его добавлением в регистрацию. Я не вижу, чтобы вы делали это в оболочке Python, но, возможно, это обрабатывается под капотом. Прямо сейчас, с вашей текущей реализацией, как вы узнаете, что маска не установлена? Кроме того, я не уверен, почему мой ответ получил отрицательный голос! - person siavashk; 15.09.2015
comment
SetFixedImageMask() и SetMovingImageMask() напрямую используют бинарное изображение без создания MaskSpatialObject. - person neon29; 16.09.2015
comment
Хорошо, а как узнать, что маска не установлена? Я думаю, что Брэдли прав: itk-users.7.n7.nabble.com/ - person siavashk; 16.09.2015
comment
Я проголосовал против этого ответа, потому что исходный пост спрашивал о реализации с использованием SimpleITK, а в этом ответе не было информации о доступных в настоящее время функциях SimpleITK. Поэтому я не думал, что это полезно для решения проблемы. - person blowekamp; 16.09.2015
comment
Я добавил результаты, чтобы проиллюстрировать проблему (алгоритм имеет тенденцию максимизировать перекрытие, в то время как в моем приложении мне это не нужно. itk-users.7.n7.nabble.com/ - person neon29; 17.09.2015