Skip to content

Commit 3beeb9c

Browse files
committed
ENH: Add BlockMatching registration Python wrappings + example
1 parent fae328c commit 3beeb9c

8 files changed

+266
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#!/usr/bin/env python
2+
3+
# Copyright NumFOCUS
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0.txt
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
17+
import os
18+
from urllib.request import urlretrieve
19+
20+
import itk
21+
22+
# Verify wrapping succeeded
23+
assert 'MultiResolutionFixedBlockRadiusCalculator' in dir(itk.Ultrasound)
24+
25+
# Get image input for registration
26+
FIXED_IMAGE_PATH = 'Input/rf_pre15.mha'
27+
MOVING_IMAGE_PATH = 'Input/rf_post15.mha'
28+
29+
if not os.path.exists(FIXED_IMAGE_PATH):
30+
url = 'https://data.kitware.com/api/v1/file/58ee3b778d777f16d095fd8a/download'
31+
urlretrieve(url, FIXED_IMAGE_PATH)
32+
33+
if not os.path.exists(MOVING_IMAGE_PATH):
34+
url = 'https://data.kitware.com/api/v1/file/58ee3b758d777f16d095fd87/download'
35+
urlretrieve(url, MOVING_IMAGE_PATH)
36+
37+
fixed_image = itk.imread(FIXED_IMAGE_PATH, itk.D)
38+
moving_image = itk.imread(MOVING_IMAGE_PATH, itk.D)
39+
40+
dimension = fixed_image.GetImageDimension()
41+
displacement_image_type = itk.Image[itk.Vector[itk.D,dimension],dimension]
42+
43+
block_radius_calculator = itk.Ultrasound.MultiResolutionFixedBlockRadiusCalculator[type(fixed_image)].New()
44+
block_radius_calculator.SetRadius([12,4])
45+
46+
# Create schedule for iterative registration
47+
search_region_source = itk.Ultrasound.MultiResolutionFixedSearchRegionImageSource[type(fixed_image),
48+
type(fixed_image),
49+
displacement_image_type].New()
50+
pyramid_schedule = itk.Array2D[itk.UI]()
51+
pyramid_schedule.SetSize(3,2)
52+
pyramid_schedule.SetElement(0,0,3)
53+
pyramid_schedule.SetElement(0,1,2)
54+
pyramid_schedule.SetElement(1,0,2)
55+
pyramid_schedule.SetElement(1,1,1)
56+
pyramid_schedule.SetElement(2,0,1)
57+
pyramid_schedule.SetElement(2,1,1)
58+
59+
search_region_source.SetPyramidSchedule(pyramid_schedule)
60+
search_region_source.SetSearchRegionRadiusSchedule([50,6])
61+
search_region_source.SetOverlapSchedule(1.0)
62+
63+
metric_image_filter = itk.Ultrasound.NormalizedCrossCorrelationNeighborhoodIteratorMetricImageFilter[type(fixed_image),
64+
type(fixed_image),
65+
type(fixed_image)].New()
66+
67+
level_registration_method = itk.Ultrasound.ImageRegistrationMethod[type(fixed_image),
68+
type(fixed_image),
69+
type(fixed_image),
70+
displacement_image_type,
71+
itk.D].New()
72+
level_registration_method.SetMetricImageFilter(metric_image_filter)
73+
74+
# Set up the multi-resolution registration object
75+
multi_res_registration_method = itk.Ultrasound.MultiResolutionImageRegistrationMethod[type(fixed_image),
76+
type(fixed_image),
77+
type(fixed_image),
78+
displacement_image_type,
79+
itk.D].New()
80+
multi_res_registration_method.SetFixedImage(fixed_image)
81+
multi_res_registration_method.SetMovingImage(moving_image)
82+
multi_res_registration_method.SetBlockRadiusCalculator(block_radius_calculator)
83+
multi_res_registration_method.SetSearchRegionImageSource(search_region_source)
84+
multi_res_registration_method.SetSchedules(pyramid_schedule, pyramid_schedule)
85+
multi_res_registration_method.SetImageRegistrationMethod(level_registration_method)
86+
87+
# Run the actual registration
88+
multi_res_registration_method.Update()
89+
90+
# Write out results
91+
itk.imwrite(multi_res_registration_method.GetOutput(), 'Output/rf_post15_registered.mha')

wrapping/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ endif()
88

99
itk_wrap_module(Ultrasound)
1010
set(WRAPPER_LIBRARY_GROUPS
11+
itkBlockMatchingMultiResolutionFixedBlockRadiusCalculator
12+
itkBlockMatchingMetricImageToDisplacementCalculator
13+
itkBlockMatchingBayesianRegularizationDisplacementCalculator
14+
itkBlockMatchingMultiResolutionFixedSearchRegionImageSource
15+
itkBlockMatchingNormalizedCrossCorrelationNeighborhoodIteratorMetricImageFilter
16+
itkBlockMatchingMultiResolutionImageRegistrationMethod
1117
itkSpectra1DSupportWindowImageFilter
1218
itkCurvilinearArraySpecialCoordinatesImage
1319
itkFrequencyDomain1DFilterFunction
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
set(WRAPPER_AUTO_INCLUDE_HEADERS OFF)
2+
itk_wrap_include("itkImage.h")
3+
4+
# Wrap desired class
5+
itk_wrap_include("itkBlockMatchingBayesianRegularizationDisplacementCalculator.h")
6+
itk_wrap_class("itk::BlockMatching::BayesianRegularizationDisplacementCalculator" POINTER)
7+
foreach(t ${WRAP_ITK_REAL})
8+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
9+
itk_wrap_template("I${ITKM_${t}}${d}I${ITKM_V${ITKM_${t}}${d}}${d}"
10+
"itk::Image<${ITKT_${t}},${d}>, itk::Image<${ITKT_V${ITKM_${t}}${d}},${d}>")
11+
endforeach()
12+
endforeach()
13+
itk_end_wrap_class()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
set(WRAPPER_AUTO_INCLUDE_HEADERS OFF)
2+
3+
itk_wrap_include("itkBlockMatchingMetricImageToDisplacementCalculator.h")
4+
itk_wrap_class("itk::BlockMatching::MetricImageToDisplacementCalculator" POINTER)
5+
foreach(t ${WRAP_ITK_REAL})
6+
foreach(t2 ${WRAP_ITK_REAL})
7+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
8+
itk_wrap_template("I${ITKM_${t}}${d}I${ITKM_V${t2}${d}}${d}"
9+
"${ITKT_I${ITKM_${t}}${d}}, ${ITKT_I${ITKM_V${t2}${d}}${d}}")
10+
endforeach()
11+
endforeach()
12+
endforeach()
13+
itk_end_wrap_class()
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
set(WRAPPER_AUTO_INCLUDE_HEADERS OFF)
2+
itk_wrap_include("itkImage.h")
3+
4+
itk_wrap_include("itkBlockMatchingMultiResolutionBlockRadiusCalculator.h")
5+
itk_wrap_class("itk::BlockMatching::MultiResolutionBlockRadiusCalculator" POINTER)
6+
foreach(t ${WRAP_ITK_SCALAR})
7+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
8+
itk_wrap_template("I${ITKM_${t}}${d}" "itk::Image<${ITKT_${t}},${d}>")
9+
endforeach()
10+
endforeach()
11+
itk_end_wrap_class()
12+
13+
itk_wrap_include("itkBlockMatchingMultiResolutionFixedBlockRadiusCalculator.h")
14+
itk_wrap_class("itk::BlockMatching::MultiResolutionFixedBlockRadiusCalculator" POINTER)
15+
foreach(t ${WRAP_ITK_SCALAR})
16+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
17+
itk_wrap_template("I${ITKM_${t}}${d}" "itk::Image<${ITKT_${t}},${d}>")
18+
endforeach()
19+
endforeach()
20+
itk_end_wrap_class()
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
set(WRAPPER_AUTO_INCLUDE_HEADERS OFF)
2+
3+
itk_wrap_include("itkVector.h")
4+
itk_wrap_include("itkImage.h")
5+
itk_wrap_include("itkImageRegion.h")
6+
7+
# Wrap for class template
8+
itk_wrap_include("itkImageRegion.h")
9+
itk_wrap_class("itk::Image" POINTER)
10+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
11+
itk_wrap_template("IR${d}${d}" "itk::ImageRegion<${d}>, ${d}")
12+
endforeach()
13+
itk_end_wrap_class()
14+
15+
itk_wrap_include("itkImageSource.h")
16+
itk_wrap_class("itk::ImageSource" POINTER)
17+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
18+
itk_wrap_template("IIR${d}${d}" "itk::Image<itk::ImageRegion<${d}>,${d}>")
19+
endforeach()
20+
itk_end_wrap_class()
21+
22+
# Wrap class hierarchy
23+
itk_wrap_include("itkBlockMatchingMultiResolutionSearchRegionImageSource.h")
24+
itk_wrap_class("itk::BlockMatching::MultiResolutionSearchRegionImageSource" POINTER)
25+
foreach(t ${WRAP_ITK_REAL})
26+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
27+
foreach(vt ${WRAP_ITK_VECTOR_REAL})
28+
itk_wrap_template("I${ITKM_${t}}${d}I${ITKM_${t}}${d}I${ITKM_${vt}${d}}${d}"
29+
"itk::Image<${ITKT_${t}},${d}>, itk::Image<${ITKT_${t}},${d}>, itk::Image<${ITKT_${vt}${d}},${d}>")
30+
endforeach()
31+
endforeach()
32+
endforeach()
33+
itk_end_wrap_class()
34+
35+
# Wrap class
36+
itk_wrap_include("itkBlockMatchingMultiResolutionFixedSearchRegionImageSource.h")
37+
itk_wrap_class("itk::BlockMatching::MultiResolutionFixedSearchRegionImageSource" POINTER)
38+
foreach(t ${WRAP_ITK_REAL})
39+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
40+
foreach(vt ${WRAP_ITK_VECTOR_REAL})
41+
itk_wrap_template("I${ITKM_${t}}${d}I${ITKM_${t}}${d}I${ITKM_${vt}${d}}${d}"
42+
"itk::Image<${ITKT_${t}},${d}>, itk::Image<${ITKT_${t}},${d}>, itk::Image<${ITKT_${vt}${d}},${d}>")
43+
endforeach()
44+
endforeach()
45+
endforeach()
46+
itk_end_wrap_class()
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
set(WRAPPER_AUTO_INCLUDE_HEADERS OFF)
2+
itk_wrap_include("itkPoint.h")
3+
itk_wrap_include("itkSmartPointer.h")
4+
itk_wrap_include("itkImage.h")
5+
itk_wrap_include("itkImageRegion.h")
6+
7+
# Wrap base classes for itk::BlockMatching::MetricImageToDisplacementCalculator public members
8+
#itk_wrap_class("itk::SmartPointer")
9+
# foreach(t ${WRAP_ITK_REAL})
10+
# foreach(d ${ITK_WRAP_IMAGE_DIMS})
11+
# itk_wrap_template("I${ITKM_${t}}${d}" "itk::Image<${ITKT_${t}},${d}>")
12+
# endforeach()
13+
# endforeach()
14+
#itk_end_wrap_class()
15+
16+
itk_wrap_class("itk::Image" POINTER)
17+
foreach(t ${WRAP_ITK_REAL})
18+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
19+
itk_wrap_template("P${ITKM_${t}}${d}${d}" "itk::Point<${ITKT_${t}},${d}>, ${d}")
20+
itk_wrap_template("SPI${ITKM_${t}}${d}${d}" "itk::SmartPointer<itk::Image<${ITKT_${t}},${d}>>, ${d}")
21+
endforeach()
22+
endforeach()
23+
itk_end_wrap_class()
24+
25+
# Wrap class hierarchy
26+
itk_wrap_include("itkImageToImageFilter.h")
27+
itk_wrap_class("itk::ImageToImageFilter" POINTER)
28+
foreach(t ${WRAP_ITK_REAL})
29+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
30+
itk_wrap_template("IIR${d}${d}I${ITKM_V${t}${d}}${d}"
31+
"itk::Image<itk::ImageRegion<${d}>,${d}>, itk::Image<${ITKT_V${t}${d}},${d}>")
32+
endforeach()
33+
endforeach()
34+
itk_end_wrap_class()
35+
36+
itk_wrap_include("itkBlockMatchingImageRegistrationMethod.h")
37+
itk_wrap_class("itk::BlockMatching::ImageRegistrationMethod" POINTER)
38+
foreach(t ${WRAP_ITK_REAL})
39+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
40+
foreach(vt ${WRAP_ITK_VECTOR_REAL})
41+
set(img_m "I${ITKM_${t}}${d}")
42+
set(img_t "itk::Image<${ITKT_${t}}, ${d}>")
43+
itk_wrap_template("${img_m}${img_m}${img_m}I${ITKM_${vt}${d}}${d}"
44+
"${img_t}, ${img_t}, ${img_t}, itk::Image<${ITKT_${vt}${d}},${d}>, ${ITKT_${t}}")
45+
endforeach()
46+
endforeach()
47+
endforeach()
48+
itk_end_wrap_class()
49+
50+
# Wrap target class
51+
itk_wrap_include("itkBlockMatchingMultiResolutionImageRegistrationMethod.h")
52+
itk_wrap_class("itk::BlockMatching::MultiResolutionImageRegistrationMethod" POINTER)
53+
foreach(t ${WRAP_ITK_REAL})
54+
foreach(d ${ITK_WRAP_IMAGE_DIMS})
55+
set(img_m "I${ITKM_${t}}${d}")
56+
set(img_t "itk::Image<${ITKT_${t}}, ${d}>")
57+
itk_wrap_template("${img_m}${img_m}${img_m}I${ITKM_${vt}${d}}${d}"
58+
"${img_t}, ${img_t}, ${img_t}, itk::Image<${ITKT_V${t}${d}},${d}>, ${ITKT_${t}}")
59+
endforeach()
60+
endforeach()
61+
itk_end_wrap_class()
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
set(WRAPPER_AUTO_INCLUDE_HEADERS OFF)
2+
3+
itk_wrap_include("itkBlockMatchingMetricImageFilter.h")
4+
itk_wrap_class("itk::BlockMatching::MetricImageFilter" POINTER)
5+
itk_wrap_image_filter("${WRAP_ITK_REAL}" 3 2+)
6+
itk_end_wrap_class()
7+
8+
itk_wrap_include("itkBlockMatchingNormalizedCrossCorrelationMetricImageFilter.h")
9+
itk_wrap_class("itk::BlockMatching::NormalizedCrossCorrelationMetricImageFilter" POINTER)
10+
itk_wrap_image_filter("${WRAP_ITK_REAL}" 3 2+)
11+
itk_end_wrap_class()
12+
13+
itk_wrap_include("itkBlockMatchingNormalizedCrossCorrelationNeighborhoodIteratorMetricImageFilter.h")
14+
itk_wrap_class("itk::BlockMatching::NormalizedCrossCorrelationNeighborhoodIteratorMetricImageFilter" POINTER)
15+
itk_wrap_image_filter("${WRAP_ITK_REAL}" 3 2+)
16+
itk_end_wrap_class()

0 commit comments

Comments
 (0)