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.
160 lines
6.0 KiB
C++
160 lines
6.0 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkImageBSplineCoefficients.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 vtkImageBSplineCoefficients
|
|
* @brief convert image to b-spline knots
|
|
*
|
|
* vtkImageBSplineCoefficients prepares an image for b-spline
|
|
* interpolation by converting the image values into b-spline
|
|
* knot coefficients. It is a necessary pre-filtering step
|
|
* before applying b-spline interpolation with vtkImageReslice.
|
|
*
|
|
* This class is based on code provided by Philippe Thevenaz of
|
|
* EPFL, Lausanne, Switzerland. Please acknowledge his contribution
|
|
* by citing the following paper:
|
|
* [1] P. Thevenaz, T. Blu, M. Unser, "Interpolation Revisited,"
|
|
* IEEE Transactions on Medical Imaging 19(7):739-758, 2000.
|
|
*
|
|
* The clamped boundary condition (which is the default) is taken
|
|
* from code presented in the following paper:
|
|
* [2] D. Ruijters, P. Thevenaz,
|
|
* "GPU Prefilter for Accurate Cubic B-spline Interpolation,"
|
|
* The Computer Journal, doi: 10.1093/comjnl/bxq086, 2010.
|
|
*
|
|
* @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 vtkImageBSplineCoefficients_h
|
|
#define vtkImageBSplineCoefficients_h
|
|
|
|
#include "vtkImageBSplineInterpolator.h" // for constants
|
|
#include "vtkImagingCoreModule.h" // For export macro
|
|
#include "vtkThreadedImageAlgorithm.h"
|
|
|
|
class VTKIMAGINGCORE_EXPORT vtkImageBSplineCoefficients : public vtkThreadedImageAlgorithm
|
|
{
|
|
public:
|
|
static vtkImageBSplineCoefficients* New();
|
|
vtkTypeMacro(vtkImageBSplineCoefficients, vtkThreadedImageAlgorithm);
|
|
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
//@{
|
|
/**
|
|
* Set the degree of the spline polynomial. The default value is 3,
|
|
* and the maximum is 9.
|
|
*/
|
|
vtkSetClampMacro(SplineDegree, int, 0, VTK_IMAGE_BSPLINE_DEGREE_MAX);
|
|
vtkGetMacro(SplineDegree, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set the border mode. The filter that is used to create the
|
|
* coefficients must repeat the image somehow to make a theoritically
|
|
* infinite input. The default is to clamp values that are off the
|
|
* edge of the image, to the value at the closest point on the edge.
|
|
* The other ways of virtually extending the image are to produce
|
|
* mirrored copies, which results in optimal smoothness at the boundary,
|
|
* or to repeat the image, which results in a cyclic or periodic spline.
|
|
*/
|
|
vtkSetClampMacro(BorderMode, int, VTK_IMAGE_BORDER_CLAMP, VTK_IMAGE_BORDER_MIRROR);
|
|
void SetBorderModeToClamp() { this->SetBorderMode(VTK_IMAGE_BORDER_CLAMP); }
|
|
void SetBorderModeToRepeat() { this->SetBorderMode(VTK_IMAGE_BORDER_REPEAT); }
|
|
void SetBorderModeToMirror() { this->SetBorderMode(VTK_IMAGE_BORDER_MIRROR); }
|
|
vtkGetMacro(BorderMode, int);
|
|
const char* GetBorderModeAsString();
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set the scalar type of the output. Default is float.
|
|
* Floating-point output is used to avoid overflow, since the
|
|
* range of the output values is larger than the input values.
|
|
*/
|
|
vtkSetClampMacro(OutputScalarType, int, VTK_FLOAT, VTK_DOUBLE);
|
|
vtkGetMacro(OutputScalarType, int);
|
|
void SetOutputScalarTypeToFloat() { this->SetOutputScalarType(VTK_FLOAT); }
|
|
void SetOutputScalarTypeToDouble() { this->SetOutputScalarType(VTK_DOUBLE); }
|
|
const char* GetOutputScalarTypeAsString();
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Bypass the filter, do not do any processing. If this is on,
|
|
* then the output data will reference the input data directly,
|
|
* and the output type will be the same as the input type. This
|
|
* is useful a downstream filter sometimes uses b-spline interpolation
|
|
* and sometimes uses other forms of interpolation.
|
|
*/
|
|
vtkSetMacro(Bypass, vtkTypeBool);
|
|
vtkBooleanMacro(Bypass, vtkTypeBool);
|
|
vtkGetMacro(Bypass, vtkTypeBool);
|
|
//@}
|
|
|
|
/**
|
|
* Check a point against the image bounds. Return 0 if out of bounds,
|
|
* and 1 if inside bounds. Calling Evaluate on a point outside the
|
|
* bounds will not generate an error, but the value returned will
|
|
* depend on the BorderMode.
|
|
*/
|
|
int CheckBounds(const double point[3]);
|
|
|
|
//@{
|
|
/**
|
|
* Interpolate a value from the image. You must call Update() before
|
|
* calling this method for the first time. The first signature can
|
|
* return multiple components, while the second signature is for use
|
|
* on single-component images.
|
|
*/
|
|
void Evaluate(const double point[3], double* value);
|
|
double Evaluate(double x, double y, double z);
|
|
double Evaluate(const double point[3]) { return this->Evaluate(point[0], point[1], point[2]); }
|
|
//@}
|
|
|
|
protected:
|
|
vtkImageBSplineCoefficients();
|
|
~vtkImageBSplineCoefficients() override;
|
|
|
|
void AllocateOutputData(vtkImageData* out, vtkInformation* outInfo, int* uExtent) override;
|
|
vtkImageData* AllocateOutputData(vtkDataObject* out, vtkInformation* outInfo) override;
|
|
|
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
|
int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
|
int RequestUpdateExtent(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
|
|
|
void ThreadedExecute(
|
|
vtkImageData* inData, vtkImageData* outData, int outExt[6], int threadId) override;
|
|
|
|
int SplineDegree;
|
|
int BorderMode;
|
|
int OutputScalarType;
|
|
vtkTypeBool Bypass;
|
|
int DataWasPassed;
|
|
int Iteration;
|
|
|
|
private:
|
|
vtkImageBSplineCoefficients(const vtkImageBSplineCoefficients&) = delete;
|
|
void operator=(const vtkImageBSplineCoefficients&) = delete;
|
|
};
|
|
|
|
#endif
|