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:
34 "\tConvergence Value: "
35 + f
"{method.GetOptimizerConvergenceValue():.5e}"
39 def command_multiresolution_iteration(method):
40 print(f
"\tStop Condition: {method.GetOptimizerStopConditionDescription()}")
41 print(
"============= Resolution Change =============")
48 "<fixedImageFilter> <movingImageFile>",
49 "<outputTransformFile>",
63 R.SetShrinkFactorsPerLevel([3, 2, 1])
64 R.SetSmoothingSigmasPerLevel([2, 1, 1])
66 R.SetMetricAsJointHistogramMutualInformation(20)
67 R.MetricUseFixedImageGradientFilterOff()
69 R.SetOptimizerAsGradientDescent(
71 numberOfIterations=100,
72 estimateLearningRate=R.EachIteration,
74 R.SetOptimizerScalesFromPhysicalShift()
76 R.SetInitialTransform(initialTx)
78 R.SetInterpolator(sitk.sitkLinear)
80 R.AddCommand(sitk.sitkIterationEvent,
lambda: command_iteration(R))
82 sitk.sitkMultiResolutionIterationEvent,
83 lambda: command_multiresolution_iteration(R),
86 outTx1 = R.Execute(fixed, moving)
90 print(f
"Optimizer stop condition: {R.GetOptimizerStopConditionDescription()}")
91 print(f
" Iteration: {R.GetOptimizerIteration()}")
92 print(f
" Metric value: {R.GetMetricValue()}")
94 displacementField =
sitk.Image(fixed.GetSize(), sitk.sitkVectorFloat64)
95 displacementField.CopyInformation(fixed)
98 displacementTx.SetSmoothingGaussianOnUpdate(
99 varianceForUpdateField=0.0, varianceForTotalField=1.5
102 R.SetMovingInitialTransform(outTx1)
103 R.SetInitialTransform(displacementTx, inPlace=
True)
105 R.SetMetricAsANTSNeighborhoodCorrelation(4)
106 R.MetricUseFixedImageGradientFilterOff()
108 R.SetShrinkFactorsPerLevel([3, 2, 1])
109 R.SetSmoothingSigmasPerLevel([2, 1, 1])
111 R.SetOptimizerScalesFromPhysicalShift()
112 R.SetOptimizerAsGradientDescent(
114 numberOfIterations=300,
115 estimateLearningRate=R.EachIteration,
118 R.Execute(fixed, moving)
121 print(displacementTx)
122 print(f
"Optimizer stop condition: {R.GetOptimizerStopConditionDescription()}")
123 print(f
" Iteration: {R.GetOptimizerIteration()}")
124 print(f
" Metric value: {R.GetMetricValue()}")
129 if "SITK_NOSHOW" not in os.environ:
130 sitk.Show(displacementTx.GetDisplacementField(),
"Displacement Field")
133 resampler.SetReferenceImage(fixed)
134 resampler.SetInterpolator(sitk.sitkLinear)
135 resampler.SetDefaultPixelValue(100)
136 resampler.SetTransform(compositeTx)
138 out = resampler.Execute(moving)
141 cimg =
sitk.Compose(simg1, simg2, simg1 // 2.0 + simg2 // 2.0)
142 sitk.Show(cimg,
"ImageRegistration1 Composition")