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
40class vtkDataObject;
41class vtkImageData;
42class vtkDataArray;
45
46class VTKIMAGINGCORE_EXPORT vtkAbstractImageInterpolator : public vtkObject
47{
48public:
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
113 void SetComponentOffset(int offset);
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; }
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
259protected:
262
266 virtual void InternalUpdate() = 0;
267
272
274
278 void (**doublefunc)(vtkInterpolationInfo*, const double[3], double*));
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
298 void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int));
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
328private:
330 void operator=(const vtkAbstractImageInterpolator&) = delete;
331};
332
333inline void vtkAbstractImageInterpolator::InterpolateIJK(const double point[3], double* value)
334{
335 this->InterpolationFuncDouble(this->InterpolationInfo, point, value);
336}
337
338inline void vtkAbstractImageInterpolator::InterpolateIJK(const float point[3], float* value)
339{
340 this->InterpolationFuncFloat(this->InterpolationInfo, point, value);
341}
342
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
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
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.
const char * GetBorderModeAsString()
The border mode (default: clamp).
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:159
general representation of visualization data
topologically and geometrically regular array of data
Definition: vtkImageData.h:157
a simple class to control print indentation
Definition: vtkIndent.h:113
abstract base class for most VTK objects
Definition: vtkObject.h:82
#define VTK_IMAGE_BORDER_REPEAT
#define VTK_IMAGE_BORDER_MIRROR
#define VTK_IMAGE_BORDER_CLAMP