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.
147 lines
4.6 KiB
C++
147 lines
4.6 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkImageDifference.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 vtkImageDifference
|
|
* @brief Compares images for regression tests.
|
|
*
|
|
* vtkImageDifference takes two rgb unsigned char images and compares them.
|
|
* It allows the images to be slightly different. If AllowShift is on,
|
|
* then each pixel can be shifted by two pixels. Threshold is the allowable
|
|
* error for each pixel.
|
|
*
|
|
* This is a symmetric filter and the difference computed is symmetric.
|
|
* The resulting value is the maximum error of the two directions
|
|
* A->B and B->A
|
|
*/
|
|
|
|
#ifndef vtkImageDifference_h
|
|
#define vtkImageDifference_h
|
|
|
|
#include "vtkImagingCoreModule.h" // For export macro
|
|
#include "vtkThreadedImageAlgorithm.h"
|
|
|
|
class vtkImageDifferenceThreadData;
|
|
class vtkImageDifferenceSMPThreadLocal;
|
|
|
|
class VTKIMAGINGCORE_EXPORT vtkImageDifference : public vtkThreadedImageAlgorithm
|
|
{
|
|
public:
|
|
static vtkImageDifference* New();
|
|
vtkTypeMacro(vtkImageDifference, vtkThreadedImageAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
//@{
|
|
/**
|
|
* Specify the Image to compare the input to.
|
|
*/
|
|
void SetImageConnection(vtkAlgorithmOutput* output) { this->SetInputConnection(1, output); }
|
|
void SetImageData(vtkDataObject* image) { this->SetInputData(1, image); }
|
|
vtkImageData* GetImage();
|
|
//@}
|
|
|
|
/**
|
|
* Return the total error in comparing the two images.
|
|
*/
|
|
double GetError() { return this->Error; }
|
|
void GetError(double* e) { *e = this->GetError(); }
|
|
|
|
/**
|
|
* Return the total thresholded error in comparing the two images.
|
|
* The thresholded error is the error for a given pixel minus the
|
|
* threshold and clamped at a minimum of zero.
|
|
*/
|
|
double GetThresholdedError() { return this->ThresholdedError; }
|
|
void GetThresholdedError(double* e) { *e = this->GetThresholdedError(); }
|
|
|
|
//@{
|
|
/**
|
|
* Specify a threshold tolerance for pixel differences.
|
|
*/
|
|
vtkSetMacro(Threshold, int);
|
|
vtkGetMacro(Threshold, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Specify whether the comparison will allow a shift of two
|
|
* pixels between the images. If set, then the minimum difference
|
|
* between input images will be used to determine the difference.
|
|
* Otherwise, the difference is computed directly between pixels
|
|
* of identical row/column values.
|
|
*/
|
|
vtkSetMacro(AllowShift, vtkTypeBool);
|
|
vtkGetMacro(AllowShift, vtkTypeBool);
|
|
vtkBooleanMacro(AllowShift, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Specify whether the comparison will include comparison of
|
|
* averaged 3x3 data between the images. For graphics renderings
|
|
* you normally would leave this on. For imaging operations it
|
|
* should be off.
|
|
*/
|
|
vtkSetMacro(Averaging, vtkTypeBool);
|
|
vtkGetMacro(Averaging, vtkTypeBool);
|
|
vtkBooleanMacro(Averaging, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* When doing Averaging, adjust the threshold for the average
|
|
* by this factor. Defaults to 0.5 requiring a better match
|
|
*/
|
|
vtkSetMacro(AverageThresholdFactor, double);
|
|
vtkGetMacro(AverageThresholdFactor, double);
|
|
//@}
|
|
|
|
protected:
|
|
vtkImageDifference();
|
|
~vtkImageDifference() override {}
|
|
|
|
// Parameters
|
|
vtkTypeBool AllowShift;
|
|
int Threshold;
|
|
vtkTypeBool Averaging;
|
|
|
|
// Outputs
|
|
const char* ErrorMessage;
|
|
double Error;
|
|
double ThresholdedError;
|
|
double AverageThresholdFactor;
|
|
|
|
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 extent[6], int threadId) override;
|
|
|
|
// Used for vtkMultiThreader operation.
|
|
vtkImageDifferenceThreadData* ThreadData;
|
|
|
|
// Used for vtkSMPTools operation.
|
|
vtkImageDifferenceSMPThreadLocal* SMPThreadData;
|
|
|
|
private:
|
|
vtkImageDifference(const vtkImageDifference&) = delete;
|
|
void operator=(const vtkImageDifference&) = delete;
|
|
|
|
friend class vtkImageDifferenceSMPFunctor;
|
|
};
|
|
|
|
#endif
|