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.

189 lines
6.3 KiB
C++

/*=========================================================================
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 efficiency 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) override;
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, vtkTypeBool);
vtkBooleanMacro(Border, vtkTypeBool);
vtkGetMacro(Border, vtkTypeBool);
//@}
//@{
/**
* Whether to crop the input image before resizing (Off by default). If this
* is On, then the CroppingRegion must be set.
*/
vtkSetMacro(Cropping, vtkTypeBool);
vtkBooleanMacro(Cropping, vtkTypeBool);
vtkGetMacro(Cropping, vtkTypeBool);
//@}
//@{
/**
* 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, vtkTypeBool);
vtkBooleanMacro(Interpolate, vtkTypeBool);
vtkGetMacro(Interpolate, vtkTypeBool);
//@}
//@{
/**
* Set the interpolator for resampling the data.
*/
virtual void SetInterpolator(vtkAbstractImageInterpolator* sampler);
virtual vtkAbstractImageInterpolator* GetInterpolator();
//@}
/**
* Get the modified time of the filter.
*/
vtkMTimeType GetMTime() override;
protected:
vtkImageResize();
~vtkImageResize() override;
virtual vtkAbstractImageInterpolator* GetInternalInterpolator();
int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestUpdateExtent(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
void ThreadedRequestData(vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector, vtkImageData*** inData, vtkImageData** outData, int ext[6],
int id) override;
int ResizeMethod;
int OutputDimensions[3];
double OutputSpacing[3];
double MagnificationFactors[3];
vtkTypeBool Border;
vtkTypeBool Cropping;
double CroppingRegion[6];
double IndexStretch[3];
double IndexTranslate[3];
vtkAbstractImageInterpolator* Interpolator;
vtkAbstractImageInterpolator* NNInterpolator;
vtkTypeBool Interpolate;
private:
vtkImageResize(const vtkImageResize&) = delete;
void operator=(const vtkImageResize&) = delete;
};
#endif