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

/*=========================================================================
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