是否可以在ITK中使用掩码来注册两个图像?

时间:2015-09-14 13:35:06

标签: python image-processing itk image-registration

我想知道是否可以使用两个二进制掩码(每个图像一个)使用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)

我希望有人可以提供帮助!

2 个答案:

答案 0 :(得分:0)

是。您可以通过此代码执行此操作 Newfixed =固定的 fixedmask; Newmoving =移动 movingmask;

使用newfixed和newmoving进行注册

答案 1 :(得分:-1)

我知道你可以在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