VTK  9.3.20240423
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
34VTK_ABI_NAMESPACE_BEGIN
35class vtkDataObject;
36class vtkImageData;
37class vtkDataArray;
40
41class VTKIMAGINGCORE_EXPORT vtkAbstractImageInterpolator : public vtkObject
42{
43public:
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
108 void SetComponentOffset(int offset);
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; }
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
261protected:
264
268 virtual void InternalUpdate() = 0;
269
274
278 void CoordinateToIJK(const double point[3], double ijk[3]);
279
281
285 void (**doublefunc)(vtkInterpolationInfo*, const double[3], double*));
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
305 void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int));
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
338private:
340 void operator=(const vtkAbstractImageInterpolator&) = delete;
341};
342
343inline void vtkAbstractImageInterpolator::InterpolateIJK(const double point[3], double* value)
344{
345 this->InterpolationFuncDouble(this->InterpolationInfo, point, value);
346}
347
348inline void vtkAbstractImageInterpolator::InterpolateIJK(const float point[3], float* value)
349{
350 this->InterpolationFuncFloat(this->InterpolationInfo, point, value);
351}
352
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
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
379VTK_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
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.
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.
abstract superclass for arrays of numeric data
general representation of visualization data
topologically and geometrically regular array of data
a simple class to control print indentation
Definition vtkIndent.h:108
abstract base class for most VTK objects
Definition vtkObject.h:162