a b/src/readTransform.cxx
1
#include <nanobind/nanobind.h>
2
#include <nanobind/stl/vector.h>
3
#include <nanobind/stl/string.h>
4
#include <nanobind/stl/tuple.h>
5
#include <nanobind/stl/list.h>
6
#include <nanobind/ndarray.h>
7
#include <nanobind/stl/shared_ptr.h>
8
9
#include "itkMacro.h"
10
#include "itkImage.h"
11
#include "itkVectorImage.h"
12
#include "itkVector.h"
13
#include "itkImageRegionIteratorWithIndex.h"
14
#include "vnl/vnl_vector_ref.h"
15
#include "itkTransform.h"
16
#include "itkAffineTransform.h"
17
#include "itkTransformFileReader.h"
18
19
#include "antscore/antsUtilities.h"
20
21
#include "itkAffineTransform.h"
22
#include "itkCenteredAffineTransform.h"
23
#include "itkEuler2DTransform.h"
24
#include "itkEuler3DTransform.h"
25
#include "itkRigid2DTransform.h"
26
#include "itkRigid3DTransform.h"
27
#include "itkCenteredRigid2DTransform.h"
28
#include "itkCenteredEuler3DTransform.h"
29
#include "itkSimilarity2DTransform.h"
30
#include "itkCenteredSimilarity2DTransform.h"
31
#include "itkSimilarity3DTransform.h"
32
#include "itkQuaternionRigidTransform.h"
33
#include "itkTranslationTransform.h"
34
#include "itkResampleImageFilter.h"
35
#include "itkTransformFileReader.h"
36
#include "itkCompositeTransform.h"
37
#include "itkMatrixOffsetTransformBase.h"
38
#include "itkDisplacementFieldTransform.h"
39
#include "itkConstantBoundaryCondition.h"
40
41
#include "itkBSplineInterpolateImageFunction.h"
42
#include "itkLinearInterpolateImageFunction.h"
43
#include "itkGaussianInterpolateImageFunction.h"
44
#include "itkInterpolateImageFunction.h"
45
#include "itkNearestNeighborInterpolateImageFunction.h"
46
#include "itkWindowedSincInterpolateImageFunction.h"
47
#include "itkLabelImageGaussianInterpolateImageFunction.h"
48
#include "itkTransformFileWriter.h"
49
50
#include "itkMacro.h"
51
#include "itkImage.h"
52
#include "itkVectorImage.h"
53
#include "itkVector.h"
54
#include "itkImageRegionIteratorWithIndex.h"
55
#include "vnl/vnl_vector_ref.h"
56
#include "itkTransform.h"
57
#include "itkAffineTransform.h"
58
59
#include "readTransform.h"
60
61
#include "register_transforms.h"
62
63
namespace nb = nanobind;
64
using namespace nb::literals;
65
66
unsigned int getTransformDimensionFromFile( std::string filename )
67
{
68
    register_transforms();
69
    typedef itk::TransformFileReader TransformReaderType1;
70
    typedef typename TransformReaderType1::Pointer TransformReaderType;
71
    TransformReaderType reader = itk::TransformFileReader::New();
72
    reader->SetFileName( filename.c_str() );
73
    reader->Update();
74
    const TransformReaderType1::TransformListType * transforms = reader->GetTransformList();
75
    const TransformReaderType1::TransformPointer tx = *(transforms->begin());
76
    return tx->GetInputSpaceDimension();
77
}
78
79
std::string getTransformNameFromFile( std::string filename )
80
{
81
    register_transforms();
82
    typedef itk::TransformFileReader TransformReaderType1;
83
    typedef typename TransformReaderType1::Pointer TransformReaderType;
84
    TransformReaderType reader = itk::TransformFileReader::New();
85
    reader->SetFileName( filename.c_str() );
86
    reader->Update();
87
    const TransformReaderType1::TransformListType * transforms = reader->GetTransformList();
88
    const TransformReaderType1::TransformPointer tx = *(transforms->begin());
89
    return std::string( tx->GetNameOfClass() );
90
}
91
92
93
template <typename PrecisionType, unsigned int Dimension>
94
AntsTransform<itk::Transform<PrecisionType, Dimension, Dimension>> newAntsTransform( std::string precision, unsigned int dimension, std::string type)
95
{
96
97
    //auto transformPointer = TransformType::New();
98
  // Initialize transform by type
99
  if ( type == "AffineTransform" )
100
    {
101
    typedef itk::AffineTransform<PrecisionType,Dimension> TransformType;
102
    auto transformPointer = TransformType::New();
103
104
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
105
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
106
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
107
108
    AntsTransform<TransformBaseType> outTransform = { basePointer };
109
    return outTransform;
110
    }
111
  else if ( type == "CenteredAffineTransform" )
112
    {
113
    typedef itk::CenteredAffineTransform<PrecisionType,Dimension> TransformType;
114
    auto transformPointer = TransformType::New();
115
116
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
117
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
118
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
119
120
    AntsTransform<TransformBaseType> outTransform = { basePointer };
121
    return outTransform;
122
    }
123
  else if ( type == "Euler3DTransform" )
124
    {
125
    typedef itk::Euler3DTransform<PrecisionType> TransformType;
126
    auto transformPointer = TransformType::New();
127
128
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
129
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
130
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
131
132
    AntsTransform<TransformBaseType> outTransform = { basePointer };
133
    return outTransform;
134
135
    }
136
  else if ( type == "Euler2DTransform" )
137
    {
138
    typedef itk::Euler2DTransform<PrecisionType> TransformType;
139
    auto transformPointer = TransformType::New();
140
141
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
142
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
143
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
144
145
    AntsTransform<TransformBaseType> outTransform = { basePointer };
146
    return outTransform;
147
    }
148
  else if ( type == "QuaternionRigidTransform" )
149
    {
150
    typedef itk::QuaternionRigidTransform<PrecisionType> TransformType;
151
    auto transformPointer = TransformType::New();
152
153
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
154
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
155
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
156
157
    AntsTransform<TransformBaseType> outTransform = { basePointer };
158
    return outTransform;
159
    }
160
  else if ( type == "Rigid2DTransform" )
161
    {
162
    typedef itk::Rigid2DTransform<PrecisionType> TransformType;
163
    auto transformPointer = TransformType::New();
164
165
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
166
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
167
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
168
169
    AntsTransform<TransformBaseType> outTransform = { basePointer };
170
    return outTransform;
171
    }
172
  else if ( type == "Rigid3DTransform" )
173
    {
174
    typedef itk::Rigid3DTransform<PrecisionType> TransformType;
175
    auto transformPointer = TransformType::New();
176
177
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
178
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
179
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
180
181
    AntsTransform<TransformBaseType> outTransform = { basePointer };
182
    return outTransform;
183
    }
184
  else if ( type == "CenteredEuler3DTransform" )
185
    {
186
    typedef itk::CenteredEuler3DTransform<PrecisionType> TransformType;
187
    auto transformPointer = TransformType::New();
188
189
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
190
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
191
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
192
193
    AntsTransform<TransformBaseType> outTransform = { basePointer };
194
    return outTransform;
195
    }
196
  else if ( type == "CenteredRigid2DTransform" )
197
    {
198
    typedef itk::CenteredRigid2DTransform<PrecisionType> TransformType;
199
    auto transformPointer = TransformType::New();
200
201
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
202
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
203
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
204
205
    AntsTransform<TransformBaseType> outTransform = { basePointer };
206
    return outTransform;
207
    }
208
  else if ( type == "Similarity3DTransform" )
209
    {
210
    typedef itk::Similarity3DTransform<PrecisionType> TransformType;
211
    auto transformPointer = TransformType::New();
212
213
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
214
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
215
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
216
217
    AntsTransform<TransformBaseType> outTransform = { basePointer };
218
    return outTransform;
219
    }
220
  else if ( type == "Similarity2DTransform" )
221
    {
222
    typedef itk::Similarity2DTransform<PrecisionType> TransformType;
223
    auto transformPointer = TransformType::New();
224
225
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
226
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
227
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
228
229
    AntsTransform<TransformBaseType> outTransform = { basePointer };
230
    return outTransform;
231
    }
232
  else if ( type == "CenteredSimilarity2DTransform" )
233
    {
234
    typedef itk::CenteredSimilarity2DTransform<PrecisionType> TransformType;
235
    auto transformPointer = TransformType::New();
236
237
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
238
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
239
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
240
241
    AntsTransform<TransformBaseType> outTransform = { basePointer };
242
    return outTransform;
243
    }
244
245
    typedef itk::AffineTransform<PrecisionType,Dimension> TransformType;
246
    auto transformPointer = TransformType::New();
247
248
    typedef itk::Transform<PrecisionType,Dimension,Dimension> TransformBaseType;
249
    typedef typename TransformBaseType::Pointer               TransformBasePointerType;
250
    TransformBasePointerType basePointer = dynamic_cast<TransformBaseType *>( transformPointer.GetPointer() );
251
252
    AntsTransform<TransformBaseType> outTransform = { basePointer };
253
    return outTransform;
254
}
255
256
257
void local_readTransform(nb::module_ &m)
258
{
259
    m.def("newAntsTransformF2", &newAntsTransform<float, 2>);
260
    m.def("newAntsTransformF3", &newAntsTransform<float, 3>);
261
    m.def("newAntsTransformD2", &newAntsTransform<double,2>);
262
    m.def("newAntsTransformD3", &newAntsTransform<double,3>);
263
264
    m.def("getTransformDimensionFromFile", &getTransformDimensionFromFile);
265
    m.def("getTransformNameFromFile", &getTransformNameFromFile);
266
}