File: itkBSplineControlPointImageFunction.h

package info (click to toggle)
insighttoolkit5 5.4.3-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 704,384 kB
  • sloc: cpp: 783,592; ansic: 628,724; xml: 44,704; fortran: 34,250; python: 22,874; sh: 4,078; pascal: 2,636; lisp: 2,158; makefile: 464; yacc: 328; asm: 205; perl: 203; lex: 146; tcl: 132; javascript: 98; csh: 81
file content (313 lines) | stat: -rw-r--r-- 11,230 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
/*=========================================================================
 *
 *  Copyright NumFOCUS
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *         https://www.apache.org/licenses/LICENSE-2.0.txt
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *=========================================================================*/
#ifndef itkBSplineControlPointImageFunction_h
#define itkBSplineControlPointImageFunction_h

#include "itkImageFunction.h"

#include "itkBSplineKernelFunction.h"
#include "itkCoxDeBoorBSplineKernelFunction.h"
#include "itkFixedArray.h"
#include "itkImage.h"
#include "itkPointSet.h"
#include "itkVariableSizeMatrix.h"
#include "itkVector.h"
#include "itkVectorContainer.h"

namespace itk
{
/**
 * \class BSplineControlPointImageFunction
 *
 * \brief Evaluate a B-spline object given a grid of control points.
 *
 * \par  The output of the class itkBSplineScatteredDataPointSetToImageFilter
 * is a control point grid defining a B-spline object.  This class is used to
 * hold various routines meant to operate on that control point grid.  In
 * addition to specifying the control point grid as the input, the user
 * must also supply the spline order and the parametric domain (i.e. size,
 * domain, origin, spacing).
 *
 * Operations include
 *   1. Evaluation of the B-spline object at any point in the domain.
 *   2. Evaluation of the gradient of the B-spline object at any point in the
 *      domain.
 *   3. Evaluation of the Hessian of the B-spline object at any point in the
 *      domain.
 *
 * \author Nicholas J. Tustison
 *
 * \ingroup ITKImageGrid
 */
template <typename TInputImage, typename TCoordRep = double>
class ITK_TEMPLATE_EXPORT BSplineControlPointImageFunction
  : public ImageFunction<TInputImage, typename TInputImage::PixelType, TCoordRep>
{
public:
  ITK_DISALLOW_COPY_AND_MOVE(BSplineControlPointImageFunction);

  using Self = BSplineControlPointImageFunction;
  using Superclass = ImageFunction<TInputImage, typename TInputImage::PixelType, TCoordRep>;
  using Pointer = SmartPointer<Self>;
  using ConstPointer = SmartPointer<const Self>;

  /** Method for creation through the object factory. */
  itkNewMacro(Self);

  /** \see LightObject::GetNameOfClass() */
  itkOverrideGetNameOfClassMacro(BSplineControlPointImageFunction);

  /** Extract dimension from input image. */
  static constexpr unsigned int ImageDimension = TInputImage::ImageDimension;

  /** Image type alias support */
  using ControlPointLatticeType = TInputImage;
  using InputImageType = TInputImage;
  using CoordinateType = TCoordRep;
  using CoordRepType = CoordinateType;
  using PixelType = typename InputImageType::PixelType;
  using RegionType = typename InputImageType::RegionType;
  using IndexType = typename InputImageType::IndexType;
  using typename Superclass::PointType;
  using InputImageRegionType = typename InputImageType::RegionType;

  using SpacingType = typename InputImageType::SpacingType;
  using OriginType = typename InputImageType::PointType;
  using SizeType = typename InputImageType::SizeType;

  /** Output type alias support */
  using OutputType = PixelType;
  using GradientType = VariableSizeMatrix<CoordRepType>;
  using HessianComponentType = VariableSizeMatrix<CoordRepType>;

  /** Other type alias */
  using ArrayType = FixedArray<unsigned int, ImageDimension>;
  using RealImageType = Image<CoordRepType, ImageDimension>;
  using RealImagePointer = typename RealImageType::Pointer;
  using typename Superclass::ContinuousIndexType;
  using RealType = float;

  /** Interpolation kernel type (default spline order = 3) */
  using KernelType = CoxDeBoorBSplineKernelFunction<3>;
  using KernelOrder0Type = BSplineKernelFunction<0>;
  using KernelOrder1Type = BSplineKernelFunction<1>;
  using KernelOrder2Type = BSplineKernelFunction<2>;
  using KernelOrder3Type = BSplineKernelFunction<3>;

  /**
   * Set the input image.  Note that the size, spacing, origin, and spline
   * order must be called prior to setting the input image.
   */
  void
  SetInputImage(const InputImageType *) override;

  /**
   * Set the spline order of the B-spline object for all parametric dimensions.
   * Default = 3.
   */
  void
  SetSplineOrder(const unsigned int);

  /**
   * Set the spline order array where each element of the array corresponds to
   * a single parametric dimension of the B-spline object.  Default = 3.
   */
  void
  SetSplineOrder(const ArrayType &);

  /**
   * Get the spline order array of the B-spline object.  Default = 3.
   */
  itkGetConstReferenceMacro(SplineOrder, ArrayType);

  /**
   * Set the boolean array indicating the periodicity of the B-spline object.
   * This array of 0/1 values defines whether a particular dimension of the
   * parametric space is to be considered periodic or not. For example, if you
   * are using interpolating along a 1D closed curve, the array type will have
   * size 1, and you should set the first element of this array to the value
   * "1". In the case that you were interpolating in a planar surface with
   * cylindrical topology, the array type will have two components, and you
   * should set to "1" the component that goes around the cylinder, and set to
   * "0" the component that goes from the top of the cylinder to the bottom.
   * This will indicate the periodicity of that parameter to the filter.
   * Internally, in order to make periodic the domain of the parameter, the
   * filter will reuse some of the points at the beginning of the domain as if
   * they were also located at the end of the domain. The number of points to
   * be reused will depend on the spline order. As a user, you don't need to
   * replicate the points, the filter will do this for you. */
  itkSetMacro(CloseDimension, ArrayType);

  /**
   * Get the boolean array indicating which dimensions are closed.
   */
  itkGetConstReferenceMacro(CloseDimension, ArrayType);

  /**
   * Set/Get the parametric spacing of the B-spline object domain.
   */
  itkSetMacro(Spacing, SpacingType);
  itkGetConstMacro(Spacing, SpacingType);

  /**
   * Set/Get the parametric origin of the B-spline object domain.
   */
  itkSetMacro(Origin, OriginType);
  itkGetConstMacro(Origin, OriginType);

  /**
   * Set/Get the parametric size of the B-spline object domain.
   */
  itkSetMacro(Size, SizeType);
  itkGetConstMacro(Size, SizeType);

  /**
   * Set/Get the epsilon used for B-splines.  The B-spline parametric domain in
   * 1-D is defined on the half-closed interval [a,b).  Extension to n-D is
   * defined similarly.  This presents some difficulty for defining the
   * the image domain to be co-extensive with the parametric domain.  We use
   * the B-spline epsilon to push the edge of the image boundary inside the
   * B-spline parametric domain.
   */
  itkSetMacro(BSplineEpsilon, RealType);
  itkGetConstMacro(BSplineEpsilon, RealType);

  /**
   * Evaluate the resulting B-spline object at a specified point in the
   * parametric domain.
   */
  OutputType
  EvaluateAtParametricPoint(const PointType &) const;

  /**
   * Evaluate the resulting B-spline object at a specified index in the
   * parametric domain.
   */
  OutputType
  EvaluateAtIndex(const IndexType &) const override;

  /**
   * Evaluate the resulting B-spline object at a specified continuous index in
   * the parametric domain.
   */
  OutputType
  EvaluateAtContinuousIndex(const ContinuousIndexType &) const override;

  /**
   * Evaluate the resulting B-spline object at a specified internal parametric
   * point.  Note that the internal parameterization over each dimension of the
   * B-spline object is [0, 1).
   */
  OutputType
  Evaluate(const PointType &) const override;

  /**
   * Evaluate the gradient of the resulting B-spline object at a specified point
   * in the parametric domain.
   */
  GradientType
  EvaluateGradientAtParametricPoint(const PointType &) const;

  /**
   * Evaluate the gradient of the resulting B-spline object at a specified index
   * in the parametric domain.
   */
  GradientType
  EvaluateGradientAtIndex(const IndexType &) const;

  /**
   * Evaluate the gradient of the resulting B-spline object at a specified
   * continuous index in the parametric domain.
   */
  GradientType
  EvaluateGradientAtContinuousIndex(const ContinuousIndexType &) const;

  /**
   * Evaluate the gradient of the resulting B-spline object at a specified
   * internal parametric point.  Note that the internal parameterization over
   * each dimension of the B-spline object is [0, 1).
   */
  GradientType
  EvaluateGradient(const PointType &) const;

  /**
   * Evaluate the Hessian of the resulting B-spline object at a specified
   * point within the parametric domain.  Since the Hessian for a vector
   * function is a 3-tensor, one must specify the component.
   */
  HessianComponentType
  EvaluateHessianAtParametricPoint(const PointType &, const unsigned int) const;

  /**
   * Evaluate the Hessian of the resulting B-spline object at a specified
   * index within the parametric domain.  Since the Hessian for a vector
   * function is a 3-tensor, one must specify the component.
   */
  HessianComponentType
  EvaluateHessianAtIndex(const IndexType &, const unsigned int) const;

  /**
   * Evaluate the Hessian of the resulting B-spline object at a specified con-
   * tinuous index within the parametric domain.  Since the Hessian for a vector
   * function is a 3-tensor, one must specify the component.
   */
  HessianComponentType
  EvaluateHessianAtContinuousIndex(const ContinuousIndexType &, const unsigned int) const;

  /**
   * Evaluate the hessian of the resulting B-spline object at a specified
   * internal parametric point.  Note that the internal parameterization over
   * each dimension of the B-spline object is [0, 1).
   */
  HessianComponentType
  EvaluateHessian(const PointType &, const unsigned int) const;

protected:
  BSplineControlPointImageFunction();
  ~BSplineControlPointImageFunction() override = default;
  void
  PrintSelf(std::ostream & os, Indent indent) const override;

private:
  /** Parameters for the B-spline object domain */
  SizeType    m_Size{};
  SpacingType m_Spacing{};
  OriginType  m_Origin{};

  ArrayType m_NumberOfControlPoints{};
  ArrayType m_CloseDimension{};
  ArrayType m_SplineOrder{};

  RealImagePointer m_NeighborhoodWeightImage{};

  typename KernelType::Pointer       m_Kernel[ImageDimension]{};
  typename KernelOrder0Type::Pointer m_KernelOrder0{};
  typename KernelOrder1Type::Pointer m_KernelOrder1{};
  typename KernelOrder2Type::Pointer m_KernelOrder2{};
  typename KernelOrder3Type::Pointer m_KernelOrder3{};

  CoordRepType m_BSplineEpsilon{};
};

} // end namespace itk

#ifndef ITK_MANUAL_INSTANTIATION
#  include "itkBSplineControlPointImageFunction.hxx"
#endif

#endif