VTK  9.3.0
vtkAbstractImageInterpolator.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
21 #ifndef vtkAbstractImageInterpolator_h
22 #define vtkAbstractImageInterpolator_h
23 
24 #include "vtkImagingCoreModule.h" // For export macro
25 #include "vtkObject.h"
26 
28 {
32 };
33 
34 VTK_ABI_NAMESPACE_BEGIN
35 class vtkDataObject;
36 class vtkImageData;
37 class vtkDataArray;
40 
41 class VTKIMAGINGCORE_EXPORT vtkAbstractImageInterpolator : public vtkObject
42 {
43 public:
45  void PrintSelf(ostream& os, vtkIndent indent) override;
46 
50  virtual void Initialize(vtkDataObject* data);
51 
55  virtual void ReleaseData();
56 
62 
68  virtual void Update();
69 
77  double Interpolate(double x, double y, double z, int component);
78 
86  bool Interpolate(const double point[3], double* value);
87 
91  void SetOutValue(double outValue);
92  double GetOutValue() { return this->OutValue; }
93 
99  void SetTolerance(double tol);
100  double GetTolerance() { return this->Tolerance; }
101 
109  int GetComponentOffset() { return this->ComponentOffset; }
110 
117  void SetComponentCount(int count);
118  int GetComponentCount() { return this->ComponentCount; }
119 
124  int ComputeNumberOfComponents(int inputComponents);
125 
132 
134 
139  void InterpolateIJK(const double point[3], double* value);
140  void InterpolateIJK(const float point[3], float* value);
142 
144 
150  bool CheckBoundsIJK(const double x[3]);
151  bool CheckBoundsIJK(const float x[3]);
153 
155 
163  void SetBorderModeToClamp() { this->SetBorderMode(VTK_IMAGE_BORDER_CLAMP); }
164  void SetBorderModeToRepeat() { this->SetBorderMode(VTK_IMAGE_BORDER_REPEAT); }
165  void SetBorderModeToMirror() { this->SetBorderMode(VTK_IMAGE_BORDER_MIRROR); }
166  vtkImageBorderMode GetBorderMode() { return this->BorderMode; }
167  const char* GetBorderModeAsString();
169 
177  void SetSlidingWindow(bool x);
178  void SlidingWindowOn() { this->SetSlidingWindow(true); }
179  void SlidingWindowOff() { this->SetSlidingWindow(false); }
180  bool GetSlidingWindow() { return this->SlidingWindow; }
181 
188  virtual void ComputeSupportSize(const double matrix[16], int support[3]) = 0;
189 
196  virtual bool IsSeparable() = 0;
197 
199 
209  virtual void PrecomputeWeightsForExtent(const double matrix[16], const int extent[6],
210  int checkExtent[6], vtkInterpolationWeights*& weights);
211  virtual void PrecomputeWeightsForExtent(const float matrix[16], const int extent[6],
212  int checkExtent[6], vtkInterpolationWeights*& weights);
214 
219 
221 
227  void InterpolateRow(
228  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, double* value, int n);
229  void InterpolateRow(
230  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, float* value, int n);
232 
234 
237  vtkGetVector3Macro(Spacing, double);
239 
241 
244  vtkGetVectorMacro(Direction, double, 9);
246 
248 
251  vtkGetVector3Macro(Origin, double);
253 
255 
258  vtkGetVector6Macro(Extent, int);
260 
261 protected:
264 
268  virtual void InternalUpdate() = 0;
269 
274 
278  void CoordinateToIJK(const double point[3], double ijk[3]);
279 
281 
284  virtual void GetInterpolationFunc(
285  void (**doublefunc)(vtkInterpolationInfo*, const double[3], double*));
286  virtual void GetInterpolationFunc(
287  void (**floatfunc)(vtkInterpolationInfo*, const float[3], float*));
289 
291 
295  void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int));
297  void (**floatfunc)(vtkInterpolationWeights*, int, int, int, float*, int));
299 
301 
304  virtual void GetSlidingWindowFunc(
305  void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int));
306  virtual void GetSlidingWindowFunc(
307  void (**floatfunc)(vtkInterpolationWeights*, int, int, int, float*, int));
309 
311  double StructuredBoundsDouble[6];
312  float StructuredBoundsFloat[6];
313  int Extent[6];
314  double Spacing[3];
315  double Direction[9];
316  double InverseDirection[9];
317  double Origin[3];
318  double OutValue;
319  double Tolerance;
325 
326  // information needed by the interpolator funcs
328 
329  void (*InterpolationFuncDouble)(
330  vtkInterpolationInfo* info, const double point[3], double* outPtr);
331  void (*InterpolationFuncFloat)(vtkInterpolationInfo* info, const float point[3], float* outPtr);
332 
333  void (*RowInterpolationFuncDouble)(
334  vtkInterpolationWeights* weights, int idX, int idY, int idZ, double* outPtr, int n);
335  void (*RowInterpolationFuncFloat)(
336  vtkInterpolationWeights* weights, int idX, int idY, int idZ, float* outPtr, int n);
337 
338 private:
340  void operator=(const vtkAbstractImageInterpolator&) = delete;
341 };
342 
343 inline void vtkAbstractImageInterpolator::InterpolateIJK(const double point[3], double* value)
344 {
345  this->InterpolationFuncDouble(this->InterpolationInfo, point, value);
346 }
347 
348 inline void vtkAbstractImageInterpolator::InterpolateIJK(const float point[3], float* value)
349 {
350  this->InterpolationFuncFloat(this->InterpolationInfo, point, value);
351 }
352 
353 inline bool vtkAbstractImageInterpolator::CheckBoundsIJK(const double x[3])
354 {
355  const double* bounds = this->StructuredBoundsDouble;
356  return !((x[0] < bounds[0]) || (x[0] > bounds[1]) || (x[1] < bounds[2]) || (x[1] > bounds[3]) ||
357  (x[2] < bounds[4]) || (x[2] > bounds[5]));
358 }
359 
360 inline bool vtkAbstractImageInterpolator::CheckBoundsIJK(const float x[3])
361 {
362  const float* bounds = this->StructuredBoundsFloat;
363  return !((x[0] < bounds[0]) || (x[0] > bounds[1]) || (x[1] < bounds[2]) || (x[1] > bounds[3]) ||
364  (x[2] < bounds[4]) || (x[2] > bounds[5]));
365 }
366 
368  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, double* value, int n)
369 {
370  this->RowInterpolationFuncDouble(weights, xIdx, yIdx, zIdx, value, n);
371 }
372 
374  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, float* value, int n)
375 {
376  this->RowInterpolationFuncFloat(weights, xIdx, yIdx, zIdx, value, n);
377 }
378 
379 VTK_ABI_NAMESPACE_END
380 #endif
interpolate data values from images
virtual void Update()
Update the interpolator.
void SetBorderMode(vtkImageBorderMode mode)
The border mode (default: clamp).
virtual void PrecomputeWeightsForExtent(const float matrix[16], const int extent[6], int checkExtent[6], vtkInterpolationWeights *&weights)
If the data is going to be sampled on a regular grid, then the interpolation weights can be precomput...
void(* InterpolationFuncDouble)(vtkInterpolationInfo *info, const double point[3], double *outPtr)
virtual void ComputeSupportSize(const double matrix[16], int support[3])=0
Get the support size for use in computing update extents.
virtual bool IsSeparable()=0
True if the interpolation is separable, which means that the weights can be precomputed in order to a...
void SetBorderModeToClamp()
The border mode (default: clamp).
~vtkAbstractImageInterpolator() override
const char * GetBorderModeAsString()
The border mode (default: clamp).
int ComputeNumberOfComponents(int inputComponents)
Compute the number of output components based on the ComponentOffset, ComponentCount,...
void SetComponentCount(int count)
This method specifies the number of components to extract.
virtual void GetRowInterpolationFunc(void(**floatfunc)(vtkInterpolationWeights *, int, int, int, float *, int))
Get the row interpolation functions.
virtual void GetSlidingWindowFunc(void(**doublefunc)(vtkInterpolationWeights *, int, int, int, double *, int))
Get the sliding window interpolation functions.
void SetComponentOffset(int offset)
This method specifies which component of the input will be interpolated, or if ComponentCount is also...
virtual void ReleaseData()
Release any data stored by the interpolator.
void SetSlidingWindow(bool x)
Enable sliding window for separable kernels.
virtual void Initialize(vtkDataObject *data)
Initialize the interpolator with the data that you wish to interpolate.
bool CheckBoundsIJK(const double x[3])
Check an x,y,z point to see if it is within the bounds for the structured coords of the image.
virtual void PrecomputeWeightsForExtent(const double matrix[16], const int extent[6], int checkExtent[6], vtkInterpolationWeights *&weights)
If the data is going to be sampled on a regular grid, then the interpolation weights can be precomput...
void SetBorderModeToMirror()
The border mode (default: clamp).
double Interpolate(double x, double y, double z, int component)
Get the result of interpolating the specified component of the input data, which should be set to zer...
void CoordinateToIJK(const double point[3], double ijk[3])
Convert XYZ coordinate to IJK continuous index.
vtkImageBorderMode GetBorderMode()
The border mode (default: clamp).
void InterpolateRow(vtkInterpolationWeights *&weights, int xIdx, int yIdx, int zIdx, double *value, int n)
Get a row of samples, using the weights that were precomputed by PrecomputeWeightsForExtent.
void SetOutValue(double outValue)
The value to return when the point is out of bounds.
void(* RowInterpolationFuncDouble)(vtkInterpolationWeights *weights, int idX, int idY, int idZ, double *outPtr, int n)
void(* InterpolationFuncFloat)(vtkInterpolationInfo *info, const float point[3], float *outPtr)
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
virtual void GetSlidingWindowFunc(void(**floatfunc)(vtkInterpolationWeights *, int, int, int, float *, int))
Get the sliding window interpolation functions.
int GetNumberOfComponents()
Get the number of components that will be returned when Interpolate() is called.
virtual void FreePrecomputedWeights(vtkInterpolationWeights *&weights)
Free the weights that were provided by PrecomputeWeightsForExtent.
void DeepCopy(vtkAbstractImageInterpolator *obj)
Copy the interpolator.
virtual void GetRowInterpolationFunc(void(**doublefunc)(vtkInterpolationWeights *, int, int, int, double *, int))
Get the row interpolation functions.
virtual void InternalDeepCopy(vtkAbstractImageInterpolator *obj)=0
Subclass-specific copy.
virtual void GetInterpolationFunc(void(**doublefunc)(vtkInterpolationInfo *, const double[3], double *))
Get the interpolation functions.
void SetBorderModeToRepeat()
The border mode (default: clamp).
void(* RowInterpolationFuncFloat)(vtkInterpolationWeights *weights, int idX, int idY, int idZ, float *outPtr, int n)
virtual void InternalUpdate()=0
Subclass-specific updates.
virtual void GetInterpolationFunc(void(**floatfunc)(vtkInterpolationInfo *, const float[3], float *))
Get the interpolation functions.
void InterpolateIJK(const double point[3], double *value)
A version of Interpolate that takes structured coords instead of data coords.
bool Interpolate(const double point[3], double *value)
Sample the input data.
void SetTolerance(double tol)
The tolerance to apply when checking whether a point is out of bounds.
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:45
general representation of visualization data
Definition: vtkDataObject.h:55
topologically and geometrically regular array of data
Definition: vtkImageData.h:43
a simple class to control print indentation
Definition: vtkIndent.h:29
abstract base class for most VTK objects
Definition: vtkObject.h:52
@ component
Definition: vtkX3D.h:175
@ point
Definition: vtkX3D.h:236
@ info
Definition: vtkX3D.h:376
@ mode
Definition: vtkX3D.h:247
@ value
Definition: vtkX3D.h:220
@ extent
Definition: vtkX3D.h:345
@ offset
Definition: vtkX3D.h:438
@ data
Definition: vtkX3D.h:315