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.
242 lines
7.7 KiB
C
242 lines
7.7 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkImageHistogram.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 vtkImageHistogram
|
||
|
* @brief Compute the histogram for an image.
|
||
|
*
|
||
|
* vtkImageHistogram generates a histogram from its input, and optionally
|
||
|
* produces a 2D black-and-white image of the histogram as its output.
|
||
|
* Unlike the class vtkImageAccumulate, a multi-component image does not
|
||
|
* result in a multi-dimensional histogram. Instead, the resulting
|
||
|
* histogram will be the sum of the histograms of each of the individual
|
||
|
* components, unless SetActiveComponent is used to choose a single
|
||
|
* component.
|
||
|
* @par Thanks:
|
||
|
* Thanks to David Gobbi at the Seaman Family MR Centre and Dept. of Clinical
|
||
|
* Neurosciences, Foothills Medical Centre, Calgary, for providing this class.
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkImageHistogram_h
|
||
|
#define vtkImageHistogram_h
|
||
|
|
||
|
#include "vtkImagingStatisticsModule.h" // For export macro
|
||
|
#include "vtkThreadedImageAlgorithm.h"
|
||
|
|
||
|
class vtkImageStencilData;
|
||
|
class vtkIdTypeArray;
|
||
|
class vtkImageHistogramThreadData;
|
||
|
class vtkImageHistogramSMPThreadLocal;
|
||
|
|
||
|
class VTKIMAGINGSTATISTICS_EXPORT vtkImageHistogram : public vtkThreadedImageAlgorithm
|
||
|
{
|
||
|
public:
|
||
|
static vtkImageHistogram* New();
|
||
|
vtkTypeMacro(vtkImageHistogram, vtkThreadedImageAlgorithm);
|
||
|
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
/**
|
||
|
* Scale types for the histogram image.
|
||
|
*/
|
||
|
enum
|
||
|
{
|
||
|
Linear = 0,
|
||
|
Log = 1,
|
||
|
Sqrt = 2
|
||
|
};
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the component for which to generate a histogram. The default
|
||
|
* value is -1, which produces a histogram that is the sum of the
|
||
|
* histograms of the individual components.
|
||
|
*/
|
||
|
vtkSetMacro(ActiveComponent, int);
|
||
|
vtkGetMacro(ActiveComponent, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* If this is On, then the histogram binning will be done automatically.
|
||
|
* For char and unsigned char data, there will be 256 bins with unit
|
||
|
* spacing. For data of type short and larger, there will be between
|
||
|
* 256 and MaximumNumberOfBins, depending on the range of the data, and
|
||
|
* the BinOrigin will be set to zero if no negative values are present,
|
||
|
* or to the smallest negative value if negative values are present.
|
||
|
* For float data, the MaximumNumberOfBins will always be used.
|
||
|
* The BinOrigin and BinSpacing will be set so that they provide a mapping
|
||
|
* from bin index to scalar value.
|
||
|
*/
|
||
|
vtkSetMacro(AutomaticBinning, vtkTypeBool);
|
||
|
vtkBooleanMacro(AutomaticBinning, vtkTypeBool);
|
||
|
vtkGetMacro(AutomaticBinning, vtkTypeBool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The maximum number of bins to use when AutomaticBinning is On.
|
||
|
* When AutomaticBinning is On, the size of the output histogram
|
||
|
* will be set to the full range of the input data values, unless
|
||
|
* the full range is greater than this value. By default, the max
|
||
|
* value is 65536, which is large enough to capture the full range
|
||
|
* of 16-bit integers.
|
||
|
*/
|
||
|
vtkSetMacro(MaximumNumberOfBins, int);
|
||
|
vtkGetMacro(MaximumNumberOfBins, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The number of bins in histogram (default 256). This is automatically
|
||
|
* computed unless AutomaticBinning is Off.
|
||
|
*/
|
||
|
vtkSetMacro(NumberOfBins, int);
|
||
|
vtkGetMacro(NumberOfBins, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The value for the center of the first bin (default 0). This is
|
||
|
* automatically computed unless AutomaticBinning is Off.
|
||
|
*/
|
||
|
vtkSetMacro(BinOrigin, double);
|
||
|
vtkGetMacro(BinOrigin, double);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The bin spacing (default 1). This is automatically computed unless
|
||
|
* AutomaticBinning is Off.
|
||
|
*/
|
||
|
vtkSetMacro(BinSpacing, double);
|
||
|
vtkGetMacro(BinSpacing, double);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Use a stencil to compute the histogram for just a part of the image.
|
||
|
*/
|
||
|
void SetStencilData(vtkImageStencilData* stencil);
|
||
|
vtkImageStencilData* GetStencil();
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Equivalent to SetInputConnection(1, algOutput).
|
||
|
*/
|
||
|
void SetStencilConnection(vtkAlgorithmOutput* algOutput);
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* If this is On, then a histogram image will be produced as the output.
|
||
|
* Regardless of this setting, the histogram is always available as a
|
||
|
* vtkIdTypeArray from the GetHistogram method.
|
||
|
*/
|
||
|
vtkSetMacro(GenerateHistogramImage, vtkTypeBool);
|
||
|
vtkBooleanMacro(GenerateHistogramImage, vtkTypeBool);
|
||
|
vtkGetMacro(GenerateHistogramImage, vtkTypeBool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the size of the histogram image that is produced as output.
|
||
|
* The default is 256 by 256.
|
||
|
*/
|
||
|
vtkSetVector2Macro(HistogramImageSize, int);
|
||
|
vtkGetVector2Macro(HistogramImageSize, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the scale to use for the histogram image. The default is
|
||
|
* a linear scale, but sqrt and log provide better visualization.
|
||
|
*/
|
||
|
vtkSetClampMacro(HistogramImageScale, int, vtkImageHistogram::Linear, vtkImageHistogram::Sqrt);
|
||
|
void SetHistogramImageScaleToLinear() { this->SetHistogramImageScale(vtkImageHistogram::Linear); }
|
||
|
void SetHistogramImageScaleToLog() { this->SetHistogramImageScale(vtkImageHistogram::Log); }
|
||
|
void SetHistogramImageScaleToSqrt() { this->SetHistogramImageScale(vtkImageHistogram::Sqrt); }
|
||
|
vtkGetMacro(HistogramImageScale, int);
|
||
|
const char* GetHistogramImageScaleAsString();
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Get the histogram as a vtkIdTypeArray. You must call Update()
|
||
|
* before calling this method.
|
||
|
*/
|
||
|
vtkIdTypeArray* GetHistogram();
|
||
|
|
||
|
/**
|
||
|
* Get the total count of the histogram. This will be the number of
|
||
|
* voxels times the number of components.
|
||
|
*/
|
||
|
vtkIdType GetTotal() { return this->Total; }
|
||
|
|
||
|
/**
|
||
|
* This is part of the executive, but is public so that it can be accessed
|
||
|
* by non-member functions.
|
||
|
*/
|
||
|
void ThreadedRequestData(vtkInformation* request, vtkInformationVector** inputVector,
|
||
|
vtkInformationVector* outputVector, vtkImageData*** inData, vtkImageData** outData, int ext[6],
|
||
|
int id) override;
|
||
|
|
||
|
protected:
|
||
|
vtkImageHistogram();
|
||
|
~vtkImageHistogram() override;
|
||
|
|
||
|
int RequestUpdateExtent(vtkInformation* vtkNotUsed(request), vtkInformationVector** inInfo,
|
||
|
vtkInformationVector* vtkNotUsed(outInfo)) override;
|
||
|
int RequestInformation(vtkInformation* vtkNotUsed(request), vtkInformationVector** inInfo,
|
||
|
vtkInformationVector* vtkNotUsed(outInfo)) override;
|
||
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
||
|
|
||
|
int FillInputPortInformation(int port, vtkInformation* info) override;
|
||
|
int FillOutputPortInformation(int port, vtkInformation* info) override;
|
||
|
|
||
|
/**
|
||
|
* Compute the range of the data. The GetScalarRange() function of
|
||
|
* vtkImageData only computes the range of the first component, but
|
||
|
* this filter requires the range for all components.
|
||
|
*/
|
||
|
void ComputeImageScalarRange(vtkImageData* data, double range[2]);
|
||
|
|
||
|
int ActiveComponent;
|
||
|
vtkTypeBool AutomaticBinning;
|
||
|
int MaximumNumberOfBins;
|
||
|
|
||
|
int HistogramImageSize[2];
|
||
|
int HistogramImageScale;
|
||
|
vtkTypeBool GenerateHistogramImage;
|
||
|
|
||
|
int NumberOfBins;
|
||
|
double BinOrigin;
|
||
|
double BinSpacing;
|
||
|
|
||
|
vtkIdTypeArray* Histogram;
|
||
|
vtkIdType Total;
|
||
|
|
||
|
// Used for vtkMultiThreader operation.
|
||
|
vtkImageHistogramThreadData* ThreadData;
|
||
|
|
||
|
// Used for vtkSMPTools operation.
|
||
|
vtkImageHistogramSMPThreadLocal* SMPThreadData;
|
||
|
|
||
|
private:
|
||
|
vtkImageHistogram(const vtkImageHistogram&) = delete;
|
||
|
void operator=(const vtkImageHistogram&) = delete;
|
||
|
|
||
|
friend class vtkImageHistogramFunctor;
|
||
|
};
|
||
|
|
||
|
#endif
|