python_for_asl/Code/10-registration.py
2025-08-06 02:04:35 +08:00

53 lines
2.2 KiB
Python

import SimpleITK as sitk
def command_iteration(method):
print(f"{method.GetOptimizerIteration()} = {method.GetMetricValue():.5f} {method.GetOptimizerPosition()}")
def registration(fixed_image_path, moving_image_path, new_image_path):
fixed_image = sitk.ReadImage(fixed_image_path, sitk.sitkFloat32)
moving_image = sitk.ReadImage(moving_image_path, sitk.sitkFloat32)
registration_method = sitk.ImageRegistrationMethod()
registration_method.SetMetricAsJointHistogramMutualInformation(numberOfHistogramBins=50)
registration_method.SetMetricSamplingStrategy(registration_method.REGULAR)
registration_method.SetMetricSamplingPercentage(0.2, 42)
registration_method.SetGlobalDefaultNumberOfThreads(1)
registration_method.SetOptimizerScalesFromPhysicalShift()
registration_method.SetInterpolator(sitk.sitkLinear)
registration_method.AddCommand(sitk.sitkIterationEvent, lambda: command_iteration(registration_method))
registration_method.SetOptimizerAsRegularStepGradientDescent(minStep=0.0001,
learningRate=1.0,
numberOfIterations=400,
gradientMagnitudeTolerance=1e-8)
initial_transform = sitk.CenteredTransformInitializer(fixed_image, moving_image, sitk.Euler3DTransform())
registration_method.SetInitialTransform(initial_transform, inPlace=True)
# 进行配准
final_transform_v4 = registration_method.Execute(fixed_image, moving_image)
# 打印结束条件
stop_condition = registration_method.GetOptimizerStopConditionDescription()
print(stop_condition)
# 重采样新的图像
moving_resampled = sitk.Resample(moving_image, fixed_image, final_transform_v4, sitk.sitkLinear, 0.0,
moving_image.GetPixelID())
sitk.WriteImage(moving_resampled, new_image_path)
def main():
fixed_image_path = r"..\Data\registration\t1.nii.gz"
moving_image_path = r"..\Data\registration\t2 flair.nii.gz"
new_image_path = r"..\Data\registration\t2 flair_resampled.nii.gz"
registration(fixed_image_path, moving_image_path, new_image_path)
main()