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++
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
|