20 import SimpleITK
as sitk
25 def command_iteration(method):
26 if method.GetOptimizerIteration() == 0:
27 print(f
"\tLevel: {method.GetCurrentLevel()}")
28 print(f
"\tScales: {method.GetOptimizerScales()}")
29 print(f
"#{method.GetOptimizerIteration()}")
30 print(f
"\tMetric Value: {method.GetMetricValue():10.5f}")
31 print(f
"\tLearningRate: {method.GetOptimizerLearningRate():10.5f}")
32 if method.GetOptimizerConvergenceValue() != sys.float_info.max:
33 print(
"\tConvergence Value: " + f
"{method.GetOptimizerConvergenceValue():.5e}")
36 def command_multiresolution_iteration(method):
37 print(f
"\tStop Condition: {method.GetOptimizerStopConditionDescription()}")
38 print(
"============= Resolution Change =============")
45 "<fixedImageFilter> <movingImageFile>",
46 "<outputTransformFile>",
60 R.SetShrinkFactorsPerLevel([3, 2, 1])
61 R.SetSmoothingSigmasPerLevel([2, 1, 1])
63 R.SetMetricAsJointHistogramMutualInformation(20)
64 R.MetricUseFixedImageGradientFilterOff()
66 R.SetOptimizerAsGradientDescent(
68 numberOfIterations=100,
69 estimateLearningRate=R.EachIteration,
71 R.SetOptimizerScalesFromPhysicalShift()
73 R.SetInitialTransform(initialTx)
75 R.SetInterpolator(sitk.sitkLinear)
77 R.AddCommand(sitk.sitkIterationEvent,
lambda: command_iteration(R))
79 sitk.sitkMultiResolutionIterationEvent,
80 lambda: command_multiresolution_iteration(R),
83 outTx1 = R.Execute(fixed, moving)
87 print(f
"Optimizer stop condition: {R.GetOptimizerStopConditionDescription()}")
88 print(f
" Iteration: {R.GetOptimizerIteration()}")
89 print(f
" Metric value: {R.GetMetricValue()}")
91 displacementField =
sitk.Image(fixed.GetSize(), sitk.sitkVectorFloat64)
92 displacementField.CopyInformation(fixed)
95 displacementTx.SetSmoothingGaussianOnUpdate(
96 varianceForUpdateField=0.0, varianceForTotalField=1.5
99 R.SetMovingInitialTransform(outTx1)
100 R.SetInitialTransform(displacementTx, inPlace=
True)
102 R.SetMetricAsANTSNeighborhoodCorrelation(4)
103 R.MetricUseFixedImageGradientFilterOff()
105 R.SetShrinkFactorsPerLevel([3, 2, 1])
106 R.SetSmoothingSigmasPerLevel([2, 1, 1])
108 R.SetOptimizerScalesFromPhysicalShift()
109 R.SetOptimizerAsGradientDescent(
111 numberOfIterations=300,
112 estimateLearningRate=R.EachIteration,
115 R.Execute(fixed, moving)
118 print(displacementTx)
119 print(f
"Optimizer stop condition: {R.GetOptimizerStopConditionDescription()}")
120 print(f
" Iteration: {R.GetOptimizerIteration()}")
121 print(f
" Metric value: {R.GetMetricValue()}")
126 if "SITK_NOSHOW" not in os.environ:
127 sitk.Show(displacementTx.GetDisplacementField(),
"Displacement Field")
130 resampler.SetReferenceImage(fixed)
131 resampler.SetInterpolator(sitk.sitkLinear)
132 resampler.SetDefaultPixelValue(100)
133 resampler.SetTransform(compositeTx)
135 out = resampler.Execute(moving)
138 cimg =
sitk.Compose(simg1, simg2, simg1 // 2.0 + simg2 // 2.0)
139 sitk.Show(cimg,
"ImageRegistration1 Composition")