VTK  9.1.0
vtkAbstractImageInterpolator.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkAbstractImageInterpolator.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
30 #ifndef vtkAbstractImageInterpolator_h
31 #define vtkAbstractImageInterpolator_h
32 
33 #include "vtkImagingCoreModule.h" // For export macro
34 #include "vtkObject.h"
35 
36 #define VTK_IMAGE_BORDER_CLAMP 0
37 #define VTK_IMAGE_BORDER_REPEAT 1
38 #define VTK_IMAGE_BORDER_MIRROR 2
39 
40 class vtkDataObject;
41 class vtkImageData;
42 class vtkDataArray;
45 
46 class VTKIMAGINGCORE_EXPORT vtkAbstractImageInterpolator : public vtkObject
47 {
48 public:
50  void PrintSelf(ostream& os, vtkIndent indent) override;
51 
55  virtual void Initialize(vtkDataObject* data);
56 
60  virtual void ReleaseData();
61 
67 
73  virtual void Update();
74 
82  double Interpolate(double x, double y, double z, int component);
83 
91  bool Interpolate(const double point[3], double* value);
92 
96  void SetOutValue(double outValue);
97  double GetOutValue() { return this->OutValue; }
98 
104  void SetTolerance(double tol);
105  double GetTolerance() { return this->Tolerance; }
106 
114  int GetComponentOffset() { return this->ComponentOffset; }
115 
122  void SetComponentCount(int count);
123  int GetComponentCount() { return this->ComponentCount; }
124 
129  int ComputeNumberOfComponents(int inputComponents);
130 
137 
139 
144  void InterpolateIJK(const double point[3], double* value);
145  void InterpolateIJK(const float point[3], float* value);
147 
149 
155  bool CheckBoundsIJK(const double x[3]);
156  bool CheckBoundsIJK(const float x[3]);
158 
160 
167  void SetBorderMode(int mode);
168  void SetBorderModeToClamp() { this->SetBorderMode(VTK_IMAGE_BORDER_CLAMP); }
169  void SetBorderModeToRepeat() { this->SetBorderMode(VTK_IMAGE_BORDER_REPEAT); }
170  void SetBorderModeToMirror() { this->SetBorderMode(VTK_IMAGE_BORDER_MIRROR); }
171  int GetBorderMode() { return this->BorderMode; }
172  const char* GetBorderModeAsString();
174 
182  void SetSlidingWindow(bool x);
183  void SlidingWindowOn() { this->SetSlidingWindow(true); }
184  void SlidingWindowOff() { this->SetSlidingWindow(false); }
185  bool GetSlidingWindow() { return this->SlidingWindow; }
186 
193  virtual void ComputeSupportSize(const double matrix[16], int support[3]) = 0;
194 
201  virtual bool IsSeparable() = 0;
202 
204 
214  virtual void PrecomputeWeightsForExtent(const double matrix[16], const int extent[6],
215  int checkExtent[6], vtkInterpolationWeights*& weights);
216  virtual void PrecomputeWeightsForExtent(const float matrix[16], const int extent[6],
217  int checkExtent[6], vtkInterpolationWeights*& weights);
219 
224 
226 
232  void InterpolateRow(
233  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, double* value, int n);
234  void InterpolateRow(
235  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, float* value, int n);
237 
239 
242  vtkGetVector3Macro(Spacing, double);
244 
246 
249  vtkGetVector3Macro(Origin, double);
251 
253 
256  vtkGetVector6Macro(Extent, int);
258 
259 protected:
262 
266  virtual void InternalUpdate() = 0;
267 
272 
274 
277  virtual void GetInterpolationFunc(
278  void (**doublefunc)(vtkInterpolationInfo*, const double[3], double*));
279  virtual void GetInterpolationFunc(
280  void (**floatfunc)(vtkInterpolationInfo*, const float[3], float*));
282 
284 
288  void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int));
290  void (**floatfunc)(vtkInterpolationWeights*, int, int, int, float*, int));
292 
294 
297  virtual void GetSlidingWindowFunc(
298  void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int));
299  virtual void GetSlidingWindowFunc(
300  void (**floatfunc)(vtkInterpolationWeights*, int, int, int, float*, int));
302 
304  double StructuredBoundsDouble[6];
305  float StructuredBoundsFloat[6];
306  int Extent[6];
307  double Spacing[3];
308  double Origin[3];
309  double OutValue;
310  double Tolerance;
315 
316  // information needed by the interpolator funcs
318 
319  void (*InterpolationFuncDouble)(
320  vtkInterpolationInfo* info, const double point[3], double* outPtr);
321  void (*InterpolationFuncFloat)(vtkInterpolationInfo* info, const float point[3], float* outPtr);
322 
323  void (*RowInterpolationFuncDouble)(
324  vtkInterpolationWeights* weights, int idX, int idY, int idZ, double* outPtr, int n);
325  void (*RowInterpolationFuncFloat)(
326  vtkInterpolationWeights* weights, int idX, int idY, int idZ, float* outPtr, int n);
327 
328 private:
330  void operator=(const vtkAbstractImageInterpolator&) = delete;
331 };
332 
333 inline void vtkAbstractImageInterpolator::InterpolateIJK(const double point[3], double* value)
334 {
335  this->InterpolationFuncDouble(this->InterpolationInfo, point, value);
336 }
337 
338 inline void vtkAbstractImageInterpolator::InterpolateIJK(const float point[3], float* value)
339 {
340  this->InterpolationFuncFloat(this->InterpolationInfo, point, value);
341 }
342 
343 inline bool vtkAbstractImageInterpolator::CheckBoundsIJK(const double x[3])
344 {
345  const double* bounds = this->StructuredBoundsDouble;
346  return !((x[0] < bounds[0]) || (x[0] > bounds[1]) || (x[1] < bounds[2]) || (x[1] > bounds[3]) ||
347  (x[2] < bounds[4]) || (x[2] > bounds[5]));
348 }
349 
350 inline bool vtkAbstractImageInterpolator::CheckBoundsIJK(const float x[3])
351 {
352  const float* bounds = this->StructuredBoundsFloat;
353  return !((x[0] < bounds[0]) || (x[0] > bounds[1]) || (x[1] < bounds[2]) || (x[1] > bounds[3]) ||
354  (x[2] < bounds[4]) || (x[2] > bounds[5]));
355 }
356 
358  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, double* value, int n)
359 {
360  this->RowInterpolationFuncDouble(weights, xIdx, yIdx, zIdx, value, n);
361 }
362 
364  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, float* value, int n)
365 {
366  this->RowInterpolationFuncFloat(weights, xIdx, yIdx, zIdx, value, n);
367 }
368 
369 #endif
interpolate data values from images
virtual void Update()
Update the interpolator.
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.
int GetBorderMode()
The border mode (default: clamp).
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 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.
void SetBorderMode(int mode)
The border mode (default: clamp).
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:50
general representation of visualization data
Definition: vtkDataObject.h:60
topologically and geometrically regular array of data
Definition: vtkImageData.h:48
a simple class to control print indentation
Definition: vtkIndent.h:34
abstract base class for most VTK objects
Definition: vtkObject.h:63
@ component
Definition: vtkX3D.h:181
@ point
Definition: vtkX3D.h:242
@ info
Definition: vtkX3D.h:382
@ mode
Definition: vtkX3D.h:253
@ value
Definition: vtkX3D.h:226
@ extent
Definition: vtkX3D.h:351
@ offset
Definition: vtkX3D.h:444
@ data
Definition: vtkX3D.h:321
#define VTK_IMAGE_BORDER_REPEAT
#define VTK_IMAGE_BORDER_MIRROR
#define VTK_IMAGE_BORDER_CLAMP