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.

218 lines
5.9 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkImageThresholdConnectivity.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 vtkImageThresholdConnectivity
* @brief Flood fill an image region.
*
* vtkImageThresholdConnectivity will perform a flood fill on an image,
* given upper and lower pixel intensity thresholds. It works similarly
* to vtkImageThreshold, but also allows the user to set seed points
* to limit the threshold operation to contiguous regions of the image.
* The filled region, or the "inside", will be passed through to the
* output by default, while the "outside" will be replaced with zeros.
* This behavior can be changed by using the ReplaceIn() and ReplaceOut()
* methods. The scalar type of the output is the same as the input.
* @sa
* vtkImageThreshold
* @par Thanks:
* Thanks to David Gobbi for contributing this class to VTK.
*/
#ifndef vtkImageThresholdConnectivity_h
#define vtkImageThresholdConnectivity_h
#include "vtkImageAlgorithm.h"
#include "vtkImagingMorphologicalModule.h" // For export macro
class vtkPoints;
class vtkImageData;
class vtkImageStencilData;
class VTKIMAGINGMORPHOLOGICAL_EXPORT vtkImageThresholdConnectivity : public vtkImageAlgorithm
{
public:
static vtkImageThresholdConnectivity* New();
vtkTypeMacro(vtkImageThresholdConnectivity, vtkImageAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* Set the seeds. The seeds are in real data coordinates, not in
* voxel index locations.
*/
void SetSeedPoints(vtkPoints* points);
vtkGetObjectMacro(SeedPoints, vtkPoints);
//@}
/**
* Values greater than or equal to this threshold will be filled.
*/
void ThresholdByUpper(double thresh);
/**
* Values less than or equal to this threshold will be filled.
*/
void ThresholdByLower(double thresh);
/**
* Values within this range will be filled, where the range includes
* values that are exactly equal to the lower and upper thresholds.
*/
void ThresholdBetween(double lower, double upper);
//@{
/**
* Replace the filled region by the value set by SetInValue().
*/
vtkSetMacro(ReplaceIn, vtkTypeBool);
vtkGetMacro(ReplaceIn, vtkTypeBool);
vtkBooleanMacro(ReplaceIn, vtkTypeBool);
//@}
//@{
/**
* If ReplaceIn is set, the filled region will be replaced by this value.
*/
void SetInValue(double val);
vtkGetMacro(InValue, double);
//@}
//@{
/**
* Replace the filled region by the value set by SetInValue().
*/
vtkSetMacro(ReplaceOut, vtkTypeBool);
vtkGetMacro(ReplaceOut, vtkTypeBool);
vtkBooleanMacro(ReplaceOut, vtkTypeBool);
//@}
//@{
/**
* If ReplaceOut is set, outside the fill will be replaced by this value.
*/
void SetOutValue(double val);
vtkGetMacro(OutValue, double);
//@}
//@{
/**
* Get the Upper and Lower thresholds.
*/
vtkGetMacro(UpperThreshold, double);
vtkGetMacro(LowerThreshold, double);
//@}
//@{
/**
* Limit the flood to a range of slices in the specified direction.
*/
vtkSetVector2Macro(SliceRangeX, int);
vtkGetVector2Macro(SliceRangeX, int);
vtkSetVector2Macro(SliceRangeY, int);
vtkGetVector2Macro(SliceRangeY, int);
vtkSetVector2Macro(SliceRangeZ, int);
vtkGetVector2Macro(SliceRangeZ, int);
//@}
//@{
/**
* Specify a stencil that will be used to limit the flood fill to
* an arbitrarily-shaped region of the image.
*/
virtual void SetStencilData(vtkImageStencilData* stencil);
vtkImageStencilData* GetStencil();
//@}
//@{
/**
* For multi-component images, you can set which component will be
* used for the threshold checks.
*/
vtkSetMacro(ActiveComponent, int);
vtkGetMacro(ActiveComponent, int);
//@}
//@{
/**
* The radius of the neighborhood that must be within the threshold
* values in order for the voxel to be included in the mask. The
* default radius is zero (one single voxel). The radius is measured
* in voxels.
*/
vtkSetVector3Macro(NeighborhoodRadius, double);
vtkGetVector3Macro(NeighborhoodRadius, double);
//@}
//@{
/**
* The fraction of the neighborhood that must be within the thresholds.
* The default value is 0.5.
*/
vtkSetClampMacro(NeighborhoodFraction, double, 0.0, 1.0);
vtkGetMacro(NeighborhoodFraction, double);
//@}
/**
* Override the MTime to account for the seed points.
*/
vtkMTimeType GetMTime() override;
//@{
/**
* After the filter has executed, use GetNumberOfVoxels() to find
* out how many voxels were filled.
*/
vtkGetMacro(NumberOfInVoxels, int);
//@}
protected:
vtkImageThresholdConnectivity();
~vtkImageThresholdConnectivity() override;
double UpperThreshold;
double LowerThreshold;
double InValue;
double OutValue;
vtkTypeBool ReplaceIn;
vtkTypeBool ReplaceOut;
double NeighborhoodRadius[3];
double NeighborhoodFraction;
vtkPoints* SeedPoints;
int SliceRangeX[2];
int SliceRangeY[2];
int SliceRangeZ[2];
int NumberOfInVoxels;
int ActiveComponent;
vtkImageData* ImageMask;
void ComputeInputUpdateExtent(int inExt[6], int outExt[6]);
int FillInputPortInformation(int port, vtkInformation* info) override;
int RequestUpdateExtent(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
private:
vtkImageThresholdConnectivity(const vtkImageThresholdConnectivity&) = delete;
void operator=(const vtkImageThresholdConnectivity&) = delete;
};
#endif