1. How to itk.resample_image_filter
with a BSplineTransform
with 3D images?
Hello, everyone!
I am trying to use parts of the DeformableRegistration15.cxx
in Python, but I don’t know what to do when ResampleImageFilter
is combined with GetCoefficientImages
(from a BSplineTransform
).
1.1. What I have tried
1.1.1. Inputs (data)
ResampleImageFilter
and resample_image_filter
.print("moving_image_type:\t", moving_image_type) print("coord_type:\t", moving_image_type) print("identity_transform:\t", identity_transform) print("bspline_transform_coarse\t", bspline_transform_coarse) print("bspline_transform_fine\t", bspline_transform_fine) interpolator_fine = itk.BSplineResampleImageFunction[ moving_image_type, coord_type].New()
moving_image_type: <class 'itk.itkImagePython.itkImageF3'> coord_type: <class 'itk.itkImagePython.itkImageF3'> identity_transform: IdentityTransform (0x55a08d43e540) RTTI typeinfo: itk::IdentityTransform<double, 3u> Reference Count: 1 Modified Time: 127 Debug: Off Object Name: Observers: none bspline_transform_coarse BSplineTransform (0x55a08c2b42b0) RTTI typeinfo: itk::BSplineTransform<double, 3u, 3u> Reference Count: 3 Modified Time: 14797 Debug: Off Object Name: Observers: none CoefficientImage: [ 0x55a08cd32630, 0x55a08cd328f0, 0x55a08cade1e0 ] TransformDomainOrigin: [0, 0, 0] TransformDomainPhysicalDimensions: [99, 99, 9] TransformDomainDirection: 1 0 0 0 1 0 0 0 1 TransformDomainMeshSize: [2, 2, 2] GridSize: [5, 5, 5] GridOrigin: [-49.5, -49.5, -4.5] GridSpacing: [49.5, 49.5, 4.5] GridDirection: 1 0 0 0 1 0 0 0 1 bspline_transform_fine BSplineTransform (0x55a08f8fa480) RTTI typeinfo: itk::BSplineTransform<double, 3u, 3u> Reference Count: 1 Modified Time: 14848 Debug: Off Object Name: Observers: none CoefficientImage: [ 0x55a08f198a00, 0x55a08f198cc0, 0x55a08f198f80 ] TransformDomainOrigin: [0, 0, 0] TransformDomainPhysicalDimensions: [99, 99, 9] TransformDomainDirection: 1 0 0 0 1 0 0 0 1 TransformDomainMeshSize: [2, 2, 2] GridSize: [5, 5, 5] GridOrigin: [-49.5, -49.5, -4.5] GridSpacing: [49.5, 49.5, 4.5] GridDirection: 1 0 0 0 1 0 0 0 1
1.1.2. Failed attempt with resample_image_filter
GetCoefficientImages
.# https://examples.itk.org/src/filtering/imagegrid/resampleavectorimage/documentation upsampler = itk.resample_image_filter( bspline_transform_coarse.GetCoefficientImages(), interpolator=interpolator_fine, transform=identity_transform, size=bspline_transform_fine.GetCoefficientImages())
swig/python detected a memory leak of type 'itk::FixedArray< itk::SmartPointer< itk::Image< double,3 > >,3 > *', no destructor found. swig/python detected a memory leak of type 'itk::FixedArray< itk::SmartPointer< itk::Image< double,3 > >,3 > *', no destructor found. Traceback (most recent call last): File "<string>", line 17, in __PYTHON_EL_eval File "<string>", line 2, in <module> File "/usr/lib/python3.10/site-packages/itk/support/helpers.py", line 176, in image_filter_wrapper return image_filter(*args, **kwargs) File "/usr/lib/python3.10/site-packages/itk/itkResampleImageFilterPython.py", line 5542, in resample_image_filter instance = itk.ResampleImageFilter.New(*args, **kwargs) File "/usr/lib/python3.10/site-packages/itk/support/template_class.py", line 734, in New raise itk.TemplateTypeError(self, input_type) itk.support.extras.TemplateTypeError: itk.ResampleImageFilter is not wrapped for input type `None`. To limit the size of the package, only a limited number of types are available in ITK Python. To print the supported types, run the following command in your python environment: itk.ResampleImageFilter.GetTypes() Possible solutions: * If you are an application user: ** Convert your input image into a supported format (see below). ** Contact developer to report the issue. * If you are an application developer, force input images to be loaded in a supported pixel type. e.g.: instance = itk.ResampleImageFilter[itk.Image[itk.SC,2], itk.Image[itk.SC,2]].New(my_input) * (Advanced) If you are an application developer, build ITK Python yourself and turned to `ON` the corresponding CMake option to wrap the pixel type or image dimension you need. When configuring ITK with CMake, you can set `ITK_WRAP_${type}` (replace ${type} with appropriate pixel type such as `double`). If you need to support images with 4 or 5 dimensions, you can add these dimensions to the list of dimensions in the CMake variable `ITK_WRAP_IMAGE_DIMS`. Supported input types: itk.Image[itk.SC,2] itk.Image[itk.SC,3] itk.Image[itk.SC,4] itk.Image[itk.SS,2] itk.Image[itk.SS,3] itk.Image[itk.SS,4] itk.Image[itk.UC,2] itk.Image[itk.UC,3] itk.Image[itk.UC,4] itk.Image[itk.US,2] itk.Image[itk.US,3] itk.Image[itk.US,4] itk.Image[itk.F,2] itk.Image[itk.F,3] itk.Image[itk.F,4] itk.Image[itk.D,2] itk.Image[itk.D,3] itk.Image[itk.D,4] itk.Image[itk.Vector[itk.D,2],2] itk.Image[itk.Vector[itk.D,2],3] itk.Image[itk.Vector[itk.D,2],4] itk.Image[itk.Vector[itk.D,3],2] itk.Image[itk.Vector[itk.D,3],3] itk.Image[itk.Vector[itk.D,3],4] itk.Image[itk.Vector[itk.D,4],2] itk.Image[itk.Vector[itk.D,4],3] itk.Image[itk.Vector[itk.D,4],4] itk.Image[itk.Vector[itk.F,2],2] itk.Image[itk.Vector[itk.F,2],3] itk.Image[itk.Vector[itk.F,2],4] itk.Image[itk.Vector[itk.F,3],2] itk.Image[itk.Vector[itk.F,3],3] itk.Image[itk.Vector[itk.F,3],4] itk.Image[itk.Vector[itk.F,4],2] itk.Image[itk.Vector[itk.F,4],3] itk.Image[itk.Vector[itk.F,4],4] itk.Image[itk.RGBPixel[itk.UC],2] itk.Image[itk.RGBPixel[itk.UC],3] itk.Image[itk.RGBPixel[itk.UC],4] itk.Image[itk.RGBPixel[itk.US],2] itk.Image[itk.RGBPixel[itk.US],3] itk.Image[itk.RGBPixel[itk.US],4] itk.Image[itk.RGBAPixel[itk.UC],2] itk.Image[itk.RGBAPixel[itk.UC],3] itk.Image[itk.RGBAPixel[itk.UC],4] itk.Image[itk.RGBAPixel[itk.US],2] itk.Image[itk.RGBAPixel[itk.US],3] itk.Image[itk.RGBAPixel[itk.US],4] itk.VectorImage[itk.UC,2] itk.VectorImage[itk.SC,2] itk.VectorImage[itk.SS,2] itk.VectorImage[itk.US,2] itk.VectorImage[itk.F,2] itk.VectorImage[itk.D,2] itk.VectorImage[itk.UC,3] itk.VectorImage[itk.SC,3] itk.VectorImage[itk.SS,3] itk.VectorImage[itk.US,3] itk.VectorImage[itk.F,3] itk.VectorImage[itk.D,3] itk.VectorImage[itk.UC,4] itk.VectorImage[itk.SC,4] itk.VectorImage[itk.SS,4] itk.VectorImage[itk.US,4] itk.VectorImage[itk.F,4] itk.VectorImage[itk.D,4]
1.1.3. Useless result with ResampleImageFilter
# https://examples.itk.org/src/filtering/imagegrid/resampleavectorimage/documentation upsampler = itk.ResampleImageFilter[moving_image_type, moving_image_type].New() print(upsampler)
ResampleImageFilter (0x55a08bde5270) RTTI typeinfo: itk::ResampleImageFilter<itk::Image<float, 3u>, itk::Image<float, 3u>, double, double> Reference Count: 1 Modified Time: 15126 Debug: Off Object Name: Observers: none Inputs: Primary: (0) * ReferenceImage: (0) Transform: (0x55a08ffa49c0) * Indexed Inputs: 0: Primary (0) 1: ReferenceImage (0) Required Input Names: Primary, Transform NumberOfRequiredInputs: 1 Outputs: Primary: (0x55a08ee2f840) Indexed Outputs: 0: Primary (0x55a08ee2f840) NumberOfRequiredOutputs: 1 Number Of Work Units: 32 ReleaseDataFlag: Off ReleaseDataBeforeUpdateFlag: Off AbortGenerateData: Off Progress: 0 Multithreader: RTTI typeinfo: itk::PoolMultiThreader Reference Count: 1 Modified Time: 15106 Debug: Off Object Name: Observers: none Number of Work Units: 32 Number of Threads: 8 Global Maximum Number Of Threads: 128 Global Default Number Of Threads: 8 Global Default Threader Type: itk::MultiThreaderBaseEnums::Threader::Pool SingleMethod: 0 SingleData: 0 DynamicMultiThreading: On CoordinateTolerance: 1e-06 DirectionTolerance: 1e-06 DefaultPixelValue: 0 Size: [0, 0, 0] OutputStartIndex: [0, 0, 0] OutputSpacing: [1, 1, 1] OutputOrigin: [0, 0, 0] OutputDirection: 1 0 0 0 1 0 0 0 1 Transform: 0x55a08f6d3800 Interpolator: 0x55a08fd5e4b0 Extrapolator: 0 UseReferenceImage: Off
1.1.4. Error with ResampleImageFilter
and GetCoefficientImages()
GetCoefficientImages
.# https://examples.itk.org/src/filtering/imagegrid/resampleavectorimage/documentation upsampler = itk.ResampleImageFilter[moving_image_type, moving_image_type].New( Input=bspline_transform_coarse.GetCoefficientImages(), Interpolator=interpolator_fine, Transform=identity_transform, Size=bspline_transform_fine.GetCoefficientImages())
Traceback (most recent call last): File "<string>", line 17, in __PYTHON_EL_eval File "<string>", line 2, in <module> File "/usr/lib/python3.10/site-packages/itk/itkResampleImageFilterPython.py", line 516, in New template_class.New(obj, *args, **kargs) File "/usr/lib/python3.10/site-packages/itk/support/template_class.py", line 800, in New itk.set_inputs(self, args, kargs) File "/usr/lib/python3.10/site-packages/itk/support/extras.py", line 1543, in set_inputs attrib(itk.output(value)) TypeError: Expecting argument of type itkImageF3 or itkImageSourceIF3. Additional information: Wrong number or type of arguments for overloaded function 'itkImageToImageFilterIF3IF3_SetInput'. Possible C/C++ prototypes are: itkImageToImageFilterIF3IF3::SetInput(itkImageF3 const *) itkImageToImageFilterIF3IF3::SetInput(unsigned int,itkImageF3 const *)
1.1.5. Error with ResampleImageFilter
and GetCoefficientImages()[0]
GetCoefficientImages
(or trying to access an inexisting element).# https://examples.itk.org/src/filtering/imagegrid/resampleavectorimage/documentation upsampler = itk.ResampleImageFilter[moving_image_type, moving_image_type].New( Input=bspline_transform_coarse.GetCoefficientImages()[0], Interpolator=interpolator_fine, Transform=identity_transform, Size=bspline_transform_fine.GetCoefficientImages())
swig/python detected a memory leak of type 'itk::FixedArray< itk::SmartPointer< itk::Image< double,3 > >,3 > *', no destructor found. Traceback (most recent call last): File "<string>", line 17, in __PYTHON_EL_eval File "<string>", line 3, in <module> TypeError: 'SwigPyObject' object is not subscriptable
1.2. Software
import itk import sys print("Self-compiled version of ITK:\t", itk.__version__) print("Python version:\t", sys.version)
Self-compiled version of ITK: 5.3.0 Python version: 3.10.4 (main, Mar 23 2022, 23:05:40) [GCC 11.2.0]