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.
197 lines
6.4 KiB
C
197 lines
6.4 KiB
C
|
3 weeks ago
|
/*=========================================================================
|
||
|
|
|
||
|
|
Program: Visualization Toolkit
|
||
|
|
Module: vtkImageResize.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 vtkImageResize
|
||
|
|
* @brief High-quality image resizing filter
|
||
|
|
*
|
||
|
|
* vtkImageResize will magnify or shrink an image with interpolation and
|
||
|
|
* antialiasing. The resizing is done with a 5-lobe Lanczos-windowed sinc
|
||
|
|
* filter that is bandlimited to the output sampling frequency in order to
|
||
|
|
* avoid aliasing when the image size is reduced. This filter utilizes a
|
||
|
|
* O(n) algorithm to provide good effiency even though the filtering kernel
|
||
|
|
* is large. The sinc interpolator can be turned off if nearest-neighbor
|
||
|
|
* interpolation is required, or it can be replaced with a different
|
||
|
|
* vtkImageInterpolator object.
|
||
|
|
* @par Thanks:
|
||
|
|
* Thanks to David Gobbi for contributing this class to VTK.
|
||
|
|
*/
|
||
|
|
|
||
|
|
#ifndef vtkImageResize_h
|
||
|
|
#define vtkImageResize_h
|
||
|
|
|
||
|
|
#include "vtkImagingCoreModule.h" // For export macro
|
||
|
|
#include "vtkThreadedImageAlgorithm.h"
|
||
|
|
|
||
|
|
class vtkAbstractImageInterpolator;
|
||
|
|
|
||
|
|
class VTKIMAGINGCORE_EXPORT vtkImageResize : public vtkThreadedImageAlgorithm
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
static vtkImageResize *New();
|
||
|
|
vtkTypeMacro(vtkImageResize, vtkThreadedImageAlgorithm);
|
||
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
||
|
|
|
||
|
|
enum
|
||
|
|
{
|
||
|
|
OUTPUT_DIMENSIONS,
|
||
|
|
OUTPUT_SPACING,
|
||
|
|
MAGNIFICATION_FACTORS
|
||
|
|
};
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* The resizing method to use. The default is to set the output image
|
||
|
|
* dimensions, and allow the filter to resize the image to these new
|
||
|
|
* dimensions. It is also possible to resize the image by setting the
|
||
|
|
* output image spacing or by setting a magnification factor.
|
||
|
|
*/
|
||
|
|
vtkSetClampMacro(ResizeMethod, int, OUTPUT_DIMENSIONS, MAGNIFICATION_FACTORS);
|
||
|
|
vtkGetMacro(ResizeMethod, int);
|
||
|
|
void SetResizeMethodToOutputDimensions() {
|
||
|
|
this->SetResizeMethod(OUTPUT_DIMENSIONS); }
|
||
|
|
void SetResizeMethodToOutputSpacing() {
|
||
|
|
this->SetResizeMethod(OUTPUT_SPACING); }
|
||
|
|
void SetResizeMethodToMagnificationFactors() {
|
||
|
|
this->SetResizeMethod(MAGNIFICATION_FACTORS); }
|
||
|
|
virtual const char *GetResizeMethodAsString();
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* The desired output dimensions. This is only used if the ResizeMethod is
|
||
|
|
* set to OutputDimensions. If you want to keep one of the image dimensions
|
||
|
|
* the same as the input, then set that dimension to -1.
|
||
|
|
*/
|
||
|
|
vtkSetVector3Macro(OutputDimensions, int);
|
||
|
|
vtkGetVector3Macro(OutputDimensions, int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* The desired output spacing. This is only used if the ResizeMethod is
|
||
|
|
* set to OutputSpacing. If you want to keep one of the original spacing
|
||
|
|
* values, then set that spacing value to zero.
|
||
|
|
*/
|
||
|
|
vtkSetVector3Macro(OutputSpacing, double);
|
||
|
|
vtkGetVector3Macro(OutputSpacing, double);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* The desired magnification factor, meaning that the sample spacing will
|
||
|
|
* be reduced by this factor. This setting is only used if the ResizeMethod
|
||
|
|
* is set to MagnificationFactors.
|
||
|
|
*/
|
||
|
|
vtkSetVector3Macro(MagnificationFactors, double);
|
||
|
|
vtkGetVector3Macro(MagnificationFactors, double);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* If Border is Off (the default), then the centers of each of the corner
|
||
|
|
* voxels will be considered to form the rectangular bounds of the image.
|
||
|
|
* This is the way that VTK normally computes image bounds. If Border is On,
|
||
|
|
* then the image bounds will be defined by the outer corners of the voxels.
|
||
|
|
* This setting impacts how the resizing is done. For example, if a
|
||
|
|
* MagnificationFactor of two is applied to a 256x256 image, the output
|
||
|
|
* image will be 512x512 if Border is On, or 511x511 if Border is Off.
|
||
|
|
*/
|
||
|
|
vtkSetMacro(Border, int);
|
||
|
|
vtkBooleanMacro(Border, int);
|
||
|
|
vtkGetMacro(Border, int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Whether to crop the input image before resizing (Off by default). If this
|
||
|
|
* is On, then the CroppingRegion must be set.
|
||
|
|
*/
|
||
|
|
vtkSetMacro(Cropping, int);
|
||
|
|
vtkBooleanMacro(Cropping, int);
|
||
|
|
vtkGetMacro(Cropping, int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* If Cropping is On, then the CroppingRegion will be used to crop the image
|
||
|
|
* before it is resized. The region must be specified in data coordinates,
|
||
|
|
* rather than voxel indices.
|
||
|
|
*/
|
||
|
|
vtkSetVector6Macro(CroppingRegion, double);
|
||
|
|
vtkGetVector6Macro(CroppingRegion, double);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Turn interpolation on or off (by default, interpolation is on).
|
||
|
|
*/
|
||
|
|
vtkSetMacro(Interpolate, int);
|
||
|
|
vtkBooleanMacro(Interpolate, int);
|
||
|
|
vtkGetMacro(Interpolate, int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Set the interpolator for resampling the data.
|
||
|
|
*/
|
||
|
|
virtual void SetInterpolator(vtkAbstractImageInterpolator *sampler);
|
||
|
|
virtual vtkAbstractImageInterpolator *GetInterpolator();
|
||
|
|
//@}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the modified time of the filter.
|
||
|
|
*/
|
||
|
|
vtkMTimeType GetMTime();
|
||
|
|
|
||
|
|
protected:
|
||
|
|
vtkImageResize();
|
||
|
|
~vtkImageResize();
|
||
|
|
|
||
|
|
virtual vtkAbstractImageInterpolator *GetInternalInterpolator();
|
||
|
|
|
||
|
|
virtual int RequestInformation(vtkInformation *, vtkInformationVector **,
|
||
|
|
vtkInformationVector *);
|
||
|
|
virtual int RequestUpdateExtent(vtkInformation *, vtkInformationVector **,
|
||
|
|
vtkInformationVector *);
|
||
|
|
virtual int RequestData(vtkInformation *, vtkInformationVector **,
|
||
|
|
vtkInformationVector *);
|
||
|
|
virtual void ThreadedRequestData(vtkInformation *request,
|
||
|
|
vtkInformationVector **inputVector,
|
||
|
|
vtkInformationVector *outputVector,
|
||
|
|
vtkImageData ***inData,
|
||
|
|
vtkImageData **outData, int ext[6], int id);
|
||
|
|
|
||
|
|
int ResizeMethod;
|
||
|
|
int OutputDimensions[3];
|
||
|
|
double OutputSpacing[3];
|
||
|
|
double MagnificationFactors[3];
|
||
|
|
int Border;
|
||
|
|
int Cropping;
|
||
|
|
double CroppingRegion[6];
|
||
|
|
|
||
|
|
double IndexStretch[3];
|
||
|
|
double IndexTranslate[3];
|
||
|
|
|
||
|
|
vtkAbstractImageInterpolator *Interpolator;
|
||
|
|
vtkAbstractImageInterpolator *NNInterpolator;
|
||
|
|
int Interpolate;
|
||
|
|
|
||
|
|
private:
|
||
|
|
vtkImageResize(const vtkImageResize&) VTK_DELETE_FUNCTION;
|
||
|
|
void operator=(const vtkImageResize&) VTK_DELETE_FUNCTION;
|
||
|
|
};
|
||
|
|
|
||
|
|
#endif
|