File: itkInterpolateImagePointsFilter.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 (201 lines) | stat: -rw-r--r-- 8,024 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
/*=========================================================================
 *
 *  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.
 *
 *=========================================================================*/
/*=========================================================================
 *
 *  Portions of this file are subject to the VTK Toolkit Version 3 copyright.
 *
 *  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
 *
 *  For complete copyright, license and disclaimer of warranty information
 *  please refer to the NOTICE file at the top of the ITK source tree.
 *
 *=========================================================================*/
#ifndef itkInterpolateImagePointsFilter_h
#define itkInterpolateImagePointsFilter_h

#include "itkBSplineInterpolateImageFunction.h"
#include "itkImageToImageFilter.h"
#include "itkImageRegionIterator.h"

namespace itk
{
/** \class InterpolateImagePointsFilter
 *  \brief Resamples an image at the coordinates specified by the user.
 *
 *  This class may be templated over the Interpolate Function but defaults
 *    to the BSplineInterpolateImageFunction for cubic interpolation.
 *    The user must set the image using the SetInputImage function and they
 *    must set the coordinates (one coordinate "image" for each dimension) using
 *    SetInterpolationCoordinate().  The coordinates may be any number of points and can
 *    be randomly organized.  The interpolated output will correspond to the
 *    ordering of the coordinate points.  The coordinates must be of type
 *    ContinuousIndexType and not of PointType.
 *
 *  This function is different from the resampleImageFilter class in that the
 *    resampleImageFilter applies a transform to the original input image
 *    coordinates.  This function takes an arbitrary set of point coordinates
 *    and applies the transform at these locations.
 *
 * Limitations:  The coordinates must be in an image of the same dimension as the
 *       input image.  There is no reason why this should be the case and future
 *       revisions should look at eliminating this limitation.
 *    Currently TCoordType must be the same as the input pixel type (TInputImage).
 *       Again future revisions should look at eliminating this limitation.
 *    Though the output generation may be streamed the entire input image,
 *       must be supplied. The coordinates may be streamed in smaller blocks.
 *    The coordinates are specified as separate images for each dimension.
 *    The coordinates are treated as Continuous Indices. If coordinates are
 *    supplied as Points then they must be converted to an Index before passing
 *       to this class.
 *
 * \sa BSplineInterpolateImageFunction
 * \sa ResampleImageFilter
 *
 * \ingroup GeometricTransformationFilters
 * \ingroup MultiThreaded
 * \ingroup CanBeStreamed
 *
 * \ingroup ITKImageGrid
 */

template <typename TInputImage,
          typename TOutputImage,
          typename TCoordType = typename TInputImage::PixelType,
          typename InterpolatorType = BSplineInterpolateImageFunction<TInputImage, TCoordType>>
class ITK_TEMPLATE_EXPORT InterpolateImagePointsFilter : public ImageToImageFilter<TInputImage, TOutputImage>
{
public:
  ITK_DISALLOW_COPY_AND_MOVE(InterpolateImagePointsFilter);

  /** Standard class type aliases. */
  using Self = InterpolateImagePointsFilter;
  using Superclass = ImageToImageFilter<TInputImage, TOutputImage>;
  using Pointer = SmartPointer<Self>;
  using ConstPointer = SmartPointer<const Self>;

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

  /** New macro for creation of through a Smart Pointer */
  itkNewMacro(Self);

  /** ImageDimension enumeration. */
  static constexpr unsigned int ImageDimension = TInputImage::ImageDimension;

  /** Typedefs from the Superclass */
  using typename Superclass::InputImageType;
  using typename Superclass::OutputImageType;
  using typename Superclass::InputImagePointer;

  /** Typedefs to describe and access output image. */
  using OutputImagePointer = typename TOutputImage::Pointer;
  using OutputImageIterator = ImageRegionIterator<InputImageType>;
  using OutputImageRegionType = typename OutputImageType::RegionType;

  /** Image pixel value type alias. */
  using PixelType = typename TOutputImage::PixelType;

  /** Typedefs to describe and access Interpolator */
  using InterpolatorPointer = typename InterpolatorType::Pointer;
  using ContinuousIndexType = typename InterpolatorType::ContinuousIndexType;

  /** Typedefs to describe and access coordinate images */
  using CoordImageType = Image<TCoordType, Self::ImageDimension>;

  /** Typedef for region copier */
  using RegionCopierType = ImageToImageFilterDetail::ImageRegionCopier<Self::ImageDimension, Self::ImageDimension>;

  /** SetInputImage is used to set the image to be interpolated.
   * Note that this should be used instead of the direct setInput
   * as multiple inputs are needed and this class keeps track of
   * the ordering. */
  void
  SetInputImage(const TInputImage * inputImage);

  /** SetInterpolationCoordinate must be called for each dimension.  The variable setDimension
   * is used to identify the dimension being set, i.e. 0,1,2...N */
  void
  SetInterpolationCoordinate(const CoordImageType * coordinate, unsigned int setDimension);

  /** Set the pixel value when a transformed pixel is outside of the image */
  itkSetMacro(DefaultPixelValue, PixelType);

  /** Get the pixel value when a transformed pixel is outside of the image */
  itkGetConstMacro(DefaultPixelValue, PixelType);

  /** Returns a pointer to the  interpolator. */
  InterpolatorPointer
  GetInterpolator()
  {
    return m_Interpolator;
  }

  /** Overloaded to ensure that output is sized the same as the coordinate inputs
   * and not the size of the input image. */
  void
  GenerateOutputInformation() override;

  /**  Overloaded to set the input image to the largest possible region */
  void
  GenerateInputRequestedRegion() override;

#ifdef ITK_USE_CONCEPT_CHECKING
  // Begin concept checking
  itkConceptMacro(InputHasNumericTraitsCheck, (Concept::HasNumericTraits<typename TInputImage::PixelType>));
  // End concept checking
#endif

protected:
  InterpolateImagePointsFilter();
  // ~InterpolateImagePointsFilter(){} default implementation ok

  void
  PrintSelf(std::ostream & os, Indent indent) const override;

  /** Main function for calculating interpolated values at each coordinate
   *  set.  Access is through the Update() call. */
  void
  DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override;


  /** Override VerifyInputInformation() since this filter's inputs do
   * not need to occupy the same physical space.
   *
   * \sa ProcessObject::VerifyInputInformation
   */
  void
  VerifyInputInformation() ITKv5_CONST override
  {}

private:
  /** Typedefs to describe and access coordinate images */
  using CoordImageTypePointer = typename CoordImageType::Pointer;
  using CoordImageIterator = ImageRegionConstIterator<CoordImageType>;
  using CoordImageRegionType = typename CoordImageType::RegionType;

  InterpolatorPointer m_Interpolator{};
  PixelType           m_DefaultPixelValue{}; // default pixel value if the
                                             // point is outside the image
};
} // namespace itk

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

#endif