1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19import sys
20
21import itk
22
23
24
25
26
27
28if len(sys.argv) < 4:
29 print("Missing Parameters")
30 print(
31 "Usage: ImageRegistration3.py fixed_image_file moving_image_file output_image_file"
32 )
33 sys.exit(1)
34fixed_image_file = sys.argv[1]
35moving_image_file = sys.argv[2]
36output_image_file = sys.argv[3]
37
38
39
40
41PixelType = itk.ctype("float")
42
43
44
45
46
47fixed_image = itk.imread(fixed_image_file, PixelType)
48moving_image = itk.imread(moving_image_file, PixelType)
49Dimension = fixed_image.GetImageDimension()
50
51
52
53
55
56
57
58
60 type(fixed_image), type(moving_image)
62
63
64
65
67optimizer.SetLearningRate(4)
68optimizer.SetMinimumStepLength(0.001)
69optimizer.SetRelaxationFactor(0.5)
70optimizer.SetNumberOfIterations(100)
71
72
73
74def iteration_update():
75 metric_value = optimizer.GetValue()
76 current_parameters = optimizer.GetCurrentPosition()
77 parameter_list = [current_parameters[i] for i in range(len(current_parameters))]
78 print(f"Metric: {metric_value:.8g} \tParameters: {parameter_list}")
79
80
81iteration_command = itk.PyCommand.New()
82iteration_command.SetCommandCallable(iteration_update)
83optimizer.AddObserver(itk.IterationEvent(), iteration_command)
84
85
86
87
89 fixed_image=fixed_image,
90 moving_image=moving_image,
91 optimizer=optimizer,
92 metric=matching_metric,
93 initial_transform=initial_transform,
94)
95registration.SetNumberOfLevels(1)
96registration.SetSmoothingSigmasPerLevel([0])
97registration.SetShrinkFactorsPerLevel([1])
98
99
100
101
102registration.Update()
103
104
105
106
107
108final_parameters = registration.GetOutput().Get().GetParameters()
109
110print("\nFinal Registration Parameters: ")
111print(f"Translation X = {final_parameters[0]:f}")
112print(f"Translation Y = {final_parameters[1]:f}")
113
114
115
116
117
118
119resampled_moving = itk.resample_image_filter(
120 moving_image,
121 transform=registration.GetTransform(),
122 use_reference_image=True,
123 reference_image=fixed_image,
124 default_pixel_value=100,
125)
126
127
128
129
130OutputPixelType = itk.ctype("unsigned char")
131resampled_cast = resampled_moving.astype(OutputPixelType)
132
133
134
135
136itk.imwrite(resampled_cast, output_image_file)
Class implementing a mean squares metric.
Regular Step Gradient descent optimizer.