VTK  9.2.6
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 =========================================================================*/
33 #ifndef vtkAbstractImageInterpolator_h
34 #define vtkAbstractImageInterpolator_h
35 
36 #include "vtkImagingCoreModule.h" // For export macro
37 #include "vtkObject.h"
38 
40 {
44 };
45 
46 class vtkDataObject;
47 class vtkImageData;
48 class vtkDataArray;
51 
52 class VTKIMAGINGCORE_EXPORT vtkAbstractImageInterpolator : public vtkObject
53 {
54 public:
56  void PrintSelf(ostream& os, vtkIndent indent) override;
57 
61  virtual void Initialize(vtkDataObject* data);
62 
66  virtual void ReleaseData();
67 
73 
79  virtual void Update();
80 
88  double Interpolate(double x, double y, double z, int component);
89 
97  bool Interpolate(const double point[3], double* value);
98 
102  void SetOutValue(double outValue);
103  double GetOutValue() { return this->OutValue; }
104 
110  void SetTolerance(double tol);
111  double GetTolerance() { return this->Tolerance; }
112 
120  int GetComponentOffset() { return this->ComponentOffset; }
121 
128  void SetComponentCount(int count);
129  int GetComponentCount() { return this->ComponentCount; }
130 
135  int ComputeNumberOfComponents(int inputComponents);
136 
143 
145 
150  void InterpolateIJK(const double point[3], double* value);
151  void InterpolateIJK(const float point[3], float* value);
153 
155 
161  bool CheckBoundsIJK(const double x[3]);
162  bool CheckBoundsIJK(const float x[3]);
164 
166 
174  void SetBorderModeToClamp() { this->SetBorderMode(VTK_IMAGE_BORDER_CLAMP); }
175  void SetBorderModeToRepeat() { this->SetBorderMode(VTK_IMAGE_BORDER_REPEAT); }
176  void SetBorderModeToMirror() { this->SetBorderMode(VTK_IMAGE_BORDER_MIRROR); }
177  vtkImageBorderMode GetBorderMode() { return this->BorderMode; }
178  const char* GetBorderModeAsString();
180 
188  void SetSlidingWindow(bool x);
189  void SlidingWindowOn() { this->SetSlidingWindow(true); }
190  void SlidingWindowOff() { this->SetSlidingWindow(false); }
191  bool GetSlidingWindow() { return this->SlidingWindow; }
192 
199  virtual void ComputeSupportSize(const double matrix[16], int support[3]) = 0;
200 
207  virtual bool IsSeparable() = 0;
208 
210 
220  virtual void PrecomputeWeightsForExtent(const double matrix[16], const int extent[6],
221  int checkExtent[6], vtkInterpolationWeights*& weights);
222  virtual void PrecomputeWeightsForExtent(const float matrix[16], const int extent[6],
223  int checkExtent[6], vtkInterpolationWeights*& weights);
225 
230 
232 
238  void InterpolateRow(
239  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, double* value, int n);
240  void InterpolateRow(
241  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, float* value, int n);
243 
245 
248  vtkGetVector3Macro(Spacing, double);
250 
252 
255  vtkGetVector3Macro(Origin, double);
257 
259 
262  vtkGetVector6Macro(Extent, int);
264 
265 protected:
268 
272  virtual void InternalUpdate() = 0;
273 
278 
280 
283  virtual void GetInterpolationFunc(
284  void (**doublefunc)(vtkInterpolationInfo*, const double[3], double*));
285  virtual void GetInterpolationFunc(
286  void (**floatfunc)(vtkInterpolationInfo*, const float[3], float*));
288 
290 
294  void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int));
296  void (**floatfunc)(vtkInterpolationWeights*, int, int, int, float*, int));
298 
300 
303  virtual void GetSlidingWindowFunc(
304  void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int));
305  virtual void GetSlidingWindowFunc(
306  void (**floatfunc)(vtkInterpolationWeights*, int, int, int, float*, int));
308 
310  double StructuredBoundsDouble[6];
311  float StructuredBoundsFloat[6];
312  int Extent[6];
313  double Spacing[3];
314  double Origin[3];
315  double OutValue;
316  double Tolerance;
321 
322  // information needed by the interpolator funcs
324 
325  void (*InterpolationFuncDouble)(
326  vtkInterpolationInfo* info, const double point[3], double* outPtr);
327  void (*InterpolationFuncFloat)(vtkInterpolationInfo* info, const float point[3], float* outPtr);
328 
329  void (*RowInterpolationFuncDouble)(
330  vtkInterpolationWeights* weights, int idX, int idY, int idZ, double* outPtr, int n);
331  void (*RowInterpolationFuncFloat)(
332  vtkInterpolationWeights* weights, int idX, int idY, int idZ, float* outPtr, int n);
333 
334 private:
336  void operator=(const vtkAbstractImageInterpolator&) = delete;
337 };
338 
339 inline void vtkAbstractImageInterpolator::InterpolateIJK(const double point[3], double* value)
340 {
341  this->InterpolationFuncDouble(this->InterpolationInfo, point, value);
342 }
343 
344 inline void vtkAbstractImageInterpolator::InterpolateIJK(const float point[3], float* value)
345 {
346  this->InterpolationFuncFloat(this->InterpolationInfo, point, value);
347 }
348 
349 inline bool vtkAbstractImageInterpolator::CheckBoundsIJK(const double x[3])
350 {
351  const double* bounds = this->StructuredBoundsDouble;
352  return !((x[0] < bounds[0]) || (x[0] > bounds[1]) || (x[1] < bounds[2]) || (x[1] > bounds[3]) ||
353  (x[2] < bounds[4]) || (x[2] > bounds[5]));
354 }
355 
356 inline bool vtkAbstractImageInterpolator::CheckBoundsIJK(const float x[3])
357 {
358  const float* bounds = this->StructuredBoundsFloat;
359  return !((x[0] < bounds[0]) || (x[0] > bounds[1]) || (x[1] < bounds[2]) || (x[1] > bounds[3]) ||
360  (x[2] < bounds[4]) || (x[2] > bounds[5]));
361 }
362 
364  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, double* value, int n)
365 {
366  this->RowInterpolationFuncDouble(weights, xIdx, yIdx, zIdx, value, n);
367 }
368 
370  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, float* value, int n)
371 {
372  this->RowInterpolationFuncFloat(weights, xIdx, yIdx, zIdx, value, n);
373 }
374 
375 #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...
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:165
general representation of visualization data
topologically and geometrically regular array of data
Definition: vtkImageData.h:163
a simple class to control print indentation
Definition: vtkIndent.h:119
abstract base class for most VTK objects
Definition: vtkObject.h:82
@ 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