You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
5.2 KiB
C++
156 lines
5.2 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkImageBSplineInterpolator.h
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
/**
|
|
* @class vtkImageBSplineInterpolator
|
|
* @brief perform b-spline interpolation on images
|
|
*
|
|
* vtkImageBSplineInterpolator can be used to perform b-spline interpolation
|
|
* on images that have been filtered with vtkImageBSplineCoefficients. The
|
|
* b-spline interpolants provide the maximum possible degree of continuity
|
|
* for a given kernel size, but require that the image data be pre-filtered
|
|
* to generate b-spline coefficients before the interpolation is performed.
|
|
* Interpolating data that has not been pre-filtered will give incorrect
|
|
* results.
|
|
* @sa
|
|
* vtkImageReslice vtkImageBSplineCoefficients vtkBSplineTransform
|
|
* @par Thanks:
|
|
* This class was written by David Gobbi at the Seaman Family MR Research
|
|
* Centre, Foothills Medical Centre, Calgary, Alberta.
|
|
* DG Gobbi and YP Starreveld,
|
|
* "Uniform B-Splines for the VTK Imaging Pipeline,"
|
|
* VTK Journal, 2011,
|
|
* http://hdl.handle.net/10380/3252
|
|
*/
|
|
|
|
#ifndef vtkImageBSplineInterpolator_h
|
|
#define vtkImageBSplineInterpolator_h
|
|
|
|
#include "vtkAbstractImageInterpolator.h"
|
|
#include "vtkImagingCoreModule.h" // For export macro
|
|
|
|
#define VTK_IMAGE_BSPLINE_DEGREE_MAX 9
|
|
|
|
class vtkImageData;
|
|
struct vtkInterpolationInfo;
|
|
|
|
class VTKIMAGINGCORE_EXPORT vtkImageBSplineInterpolator : public vtkAbstractImageInterpolator
|
|
{
|
|
public:
|
|
static vtkImageBSplineInterpolator* New();
|
|
vtkTypeMacro(vtkImageBSplineInterpolator, vtkAbstractImageInterpolator);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
//@{
|
|
/**
|
|
* Set the degree of the spline polynomial. The default value is 3,
|
|
* and the maximum is 9. The data must be pre-filtered for the same
|
|
* degree of polynomial with vtkImageBSplineCoefficients.
|
|
*/
|
|
void SetSplineDegree(int degree);
|
|
int GetSplineDegree() { return this->SplineDegree; }
|
|
int GetSplineDegreeMinValue() { return 0; }
|
|
int GetSplineDegreeMaxValue() { return VTK_IMAGE_BSPLINE_DEGREE_MAX; }
|
|
//@}
|
|
|
|
/**
|
|
* Get the support size for use in computing update extents. If the data
|
|
* will be sampled on a regular grid, then pass a matrix describing the
|
|
* structured coordinate transformation between the output and the input.
|
|
* Otherwise, pass nullptr as the matrix to retrieve the full kernel size.
|
|
*/
|
|
void ComputeSupportSize(const double matrix[16], int support[3]) override;
|
|
|
|
/**
|
|
* Returns true if the interpolator supports weight precomputation.
|
|
* This will always return true for this interpolator.
|
|
*/
|
|
bool IsSeparable() override;
|
|
|
|
//@{
|
|
/**
|
|
* If the data is going to be sampled on a regular grid, then the
|
|
* interpolation weights can be precomputed. A matrix must be
|
|
* supplied that provides a transformation between the provided
|
|
* extent and the structured coordinates of the input. This
|
|
* matrix must perform only permutations, scales, and translation,
|
|
* i.e. each of the three columns must have only one non-zero value.
|
|
* A new extent is provided for out-of-bounds checks.
|
|
* THIS METHOD IS THREAD SAFE.
|
|
*/
|
|
void PrecomputeWeightsForExtent(const double matrix[16], const int extent[6], int newExtent[6],
|
|
vtkInterpolationWeights*& weights) override;
|
|
void PrecomputeWeightsForExtent(const float matrix[16], const int extent[6], int newExtent[6],
|
|
vtkInterpolationWeights*& weights) override;
|
|
//@}
|
|
|
|
/**
|
|
* Free the precomputed weights. THIS METHOD IS THREAD SAFE.
|
|
*/
|
|
void FreePrecomputedWeights(vtkInterpolationWeights*& weights) override;
|
|
|
|
protected:
|
|
vtkImageBSplineInterpolator();
|
|
~vtkImageBSplineInterpolator() override;
|
|
|
|
/**
|
|
* Update the interpolator.
|
|
*/
|
|
void InternalUpdate() override;
|
|
|
|
/**
|
|
* Copy the interpolator.
|
|
*/
|
|
void InternalDeepCopy(vtkAbstractImageInterpolator* obj) override;
|
|
|
|
//@{
|
|
/**
|
|
* Get the interpolation functions.
|
|
*/
|
|
void GetInterpolationFunc(
|
|
void (**doublefunc)(vtkInterpolationInfo*, const double[3], double*)) override;
|
|
void GetInterpolationFunc(
|
|
void (**floatfunc)(vtkInterpolationInfo*, const float[3], float*)) override;
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get the row interpolation functions.
|
|
*/
|
|
void GetRowInterpolationFunc(
|
|
void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int)) override;
|
|
void GetRowInterpolationFunc(
|
|
void (**floatfunc)(vtkInterpolationWeights*, int, int, int, float*, int)) override;
|
|
//@}
|
|
|
|
/**
|
|
* Build the lookup tables used for the interpolation.
|
|
*/
|
|
virtual void BuildKernelLookupTable();
|
|
|
|
/**
|
|
* Free the kernel lookup tables.
|
|
*/
|
|
virtual void FreeKernelLookupTable();
|
|
|
|
int SplineDegree;
|
|
float* KernelLookupTable;
|
|
|
|
private:
|
|
vtkImageBSplineInterpolator(const vtkImageBSplineInterpolator&) = delete;
|
|
void operator=(const vtkImageBSplineInterpolator&) = delete;
|
|
};
|
|
|
|
#endif
|