Hello everyone.I’m new to simpleitk, and I want to register two images (pre and post surgery) and their corresponding masks. And my code is shown:
def rigid_pre_post(fixed_image_path, moving_image_path, fixed_mask_path, moving_mask_path, out_image_path, out_mask_path):
# 读取图像
fixed_image = sitk.ReadImage(fixed_image_path)
fixed_image = sitk.Cast(fixed_image, sitk.sitkFloat32)
moving_image = sitk.ReadImage(moving_image_path)
moving_image = sitk.Cast(moving_image, sitk.sitkFloat32)
# 读取mask
fixed_mask = sitk.ReadImage(fixed_mask_path)
moving_mask = sitk.ReadImage(moving_mask_path)
# 初始化变换
transform = sitk.CenteredTransformInitializer(fixed_image, moving_image, sitk.Euler3DTransform(),
sitk.CenteredTransformInitializerFilter.GEOMETRY)
# 设置配准方法
registration_method = sitk.ImageRegistrationMethod()
registration_method.SetOptimizerAsGradientDescentLineSearch(learningRate=1.0, numberOfIterations=100,
convergenceMinimumValue=1e-6, convergenceWindowSize=10)
registration_method.SetOptimizerScalesFromPhysicalShift()
registration_method.SetInitialTransform(transform)
registration_method.SetMetricAsMattesMutualInformation(numberOfHistogramBins=50)
registration_method.SetMetricSamplingStrategy(registration_method.RANDOM)
registration_method.SetMetricSamplingPercentage(0.01)
registration_method.SetInterpolator(sitk.sitkLinear)
# 执行配准
final_transform = registration_method.Execute(fixed=fixed_image, moving=moving_image)
# 变换移动图像
moving_resampled = sitk.Resample(moving_image, fixed_image, final_transform, sitk.sitkLinear, 0.0, moving_image.GetPixelID())
sitk.WriteImage(moving_resampled, out_image_path)
# 变换移动mask(使用最近邻插值以保持二值性质)
moving_mask_resampled = sitk.Resample(moving_mask, fixed_image, final_transform, sitk.sitkNearestNeighbor, 0.0, moving_mask.GetPixelID())
sitk.WriteImage(moving_mask_resampled, out_mask_path)
In most cases, it works. However, some cases my registered mask is all zero! Can you give me some suggestions? Thank you!