28 #ifndef itkBSplineInterpolateImageFunction_h
29 #define itkBSplineInterpolateImageFunction_h
32 #include "vnl/vnl_matrix.h"
82 template <
typename TImageType,
typename TCoordRep =
double,
typename TCoefficientType =
double>
101 using typename Superclass::OutputType;
104 using typename Superclass::InputImageType;
107 static constexpr
unsigned int ImageDimension = Superclass::ImageDimension;
116 using typename Superclass::ContinuousIndexType;
147 this->GetInputImage()->template TransformPhysicalPointToContinuousIndex<TCoordRep>(
point);
149 return (this->EvaluateAtContinuousIndex(index));
157 this->GetInputImage()->template TransformPhysicalPointToContinuousIndex<TCoordRep>(
point);
158 return (this->EvaluateAtContinuousIndex(index, threadId));
166 vnl_matrix<long> evaluateIndex(ImageDimension, (m_SplineOrder + 1));
167 vnl_matrix<double> weights(ImageDimension, (m_SplineOrder + 1));
171 return this->EvaluateAtContinuousIndexInternal(index, evaluateIndex, weights);
178 return this->EvaluateAtContinuousIndexInternal(x, m_ThreadedEvaluateIndex[threadId], m_ThreadedWeights[threadId]);
186 this->GetInputImage()->TransformPhysicalPointToContinuousIndex(
point, index);
188 return (this->EvaluateDerivativeAtContinuousIndex(index));
195 this->GetInputImage()->template TransformPhysicalPointToContinuousIndex<TCoordRep>(
point);
196 return (this->EvaluateDerivativeAtContinuousIndex(index, threadId));
206 vnl_matrix<long> evaluateIndex(ImageDimension, (m_SplineOrder + 1));
207 vnl_matrix<double> weights(ImageDimension, (m_SplineOrder + 1));
208 vnl_matrix<double> weightsDerivative(ImageDimension, (m_SplineOrder + 1));
213 return this->EvaluateDerivativeAtContinuousIndexInternal(x, evaluateIndex, weights, weightsDerivative);
219 return this->EvaluateDerivativeAtContinuousIndexInternal(
220 x, m_ThreadedEvaluateIndex[threadId], m_ThreadedWeights[threadId], m_ThreadedWeightsDerivative[threadId]);
228 this->GetInputImage()->TransformPhysicalPointToContinuousIndex(
point, index);
231 this->EvaluateValueAndDerivativeAtContinuousIndex(index, value, deriv);
241 this->GetInputImage()->template TransformPhysicalPointToContinuousIndex<TCoordRep>(
point);
242 this->EvaluateValueAndDerivativeAtContinuousIndex(index, value, deriv, threadId);
254 vnl_matrix<long> evaluateIndex(ImageDimension, (m_SplineOrder + 1));
255 vnl_matrix<double> weights(ImageDimension, (m_SplineOrder + 1));
256 vnl_matrix<double> weightsDerivative(ImageDimension, (m_SplineOrder + 1));
261 this->EvaluateValueAndDerivativeAtContinuousIndexInternal(
262 x, value, deriv, evaluateIndex, weights, weightsDerivative);
271 this->EvaluateValueAndDerivativeAtContinuousIndexInternal(x,
274 m_ThreadedEvaluateIndex[threadId],
275 m_ThreadedWeights[threadId],
276 m_ThreadedWeightsDerivative[threadId]);
282 SetSplineOrder(
unsigned int SplineOrder);
284 itkGetConstMacro(SplineOrder,
unsigned int);
293 SetInputImage(
const TImageType * inputData)
override;
305 itkSetMacro(UseImageDirection,
bool);
306 itkGetConstMacro(UseImageDirection,
bool);
307 itkBooleanMacro(UseImageDirection);
313 return SizeType::Filled(m_SplineOrder + 1);
336 EvaluateAtContinuousIndexInternal(
const ContinuousIndexType & x,
337 vnl_matrix<long> & evaluateIndex,
338 vnl_matrix<double> & weights)
const;
341 EvaluateValueAndDerivativeAtContinuousIndexInternal(
const ContinuousIndexType & x,
343 CovariantVectorType & derivativeValue,
344 vnl_matrix<long> & evaluateIndex,
345 vnl_matrix<double> & weights,
346 vnl_matrix<double> & weightsDerivative)
const;
348 virtual CovariantVectorType
349 EvaluateDerivativeAtContinuousIndexInternal(
const ContinuousIndexType & x,
350 vnl_matrix<long> & evaluateIndex,
351 vnl_matrix<double> & weights,
352 vnl_matrix<double> & weightsDerivative)
const;
357 PrintSelf(std::ostream & os,
Indent indent)
const override;
361 std::vector<CoefficientDataType> m_Scratch{};
365 unsigned int m_SplineOrder{};
373 SetInterpolationWeights(
const ContinuousIndexType & x,
374 const vnl_matrix<long> & EvaluateIndex,
375 vnl_matrix<double> & weights,
376 unsigned int splineOrder)
const;
380 SetDerivativeWeights(
const ContinuousIndexType & x,
381 const vnl_matrix<long> & EvaluateIndex,
382 vnl_matrix<double> & weights,
383 unsigned int splineOrder)
const;
388 GeneratePointsToIndex();
392 DetermineRegionOfSupport(vnl_matrix<long> & evaluateIndex,
393 const ContinuousIndexType & x,
394 unsigned int splineOrder)
const;
399 ApplyMirrorBoundaryConditions(vnl_matrix<long> & evaluateIndex,
unsigned int splineOrder)
const;
404 unsigned long m_MaxNumberInterpolationPoints{};
408 std::vector<IndexType> m_PointsToIndex{};
417 bool m_UseImageDirection{};
426 #ifndef ITK_MANUAL_INSTANTIATION
427 # include "itkBSplineInterpolateImageFunction.hxx"