diff --git a/Imaging/Core/Testing/CMakeLists.txt b/Imaging/Core/Testing/CMakeLists.txt index f13ff8fda6..18466d2c92 100644 --- a/Imaging/Core/Testing/CMakeLists.txt +++ b/Imaging/Core/Testing/CMakeLists.txt @@ -1,4 +1,6 @@ vtk_module_test_data( + Data/ImageDiff1.png + Data/ImageDiff2.png Data/beach.tif Data/fullhead15.png Data/headsq/,REGEX:.*) diff --git a/Imaging/Core/Testing/Cxx/CMakeLists.txt b/Imaging/Core/Testing/Cxx/CMakeLists.txt index b953befe77..4aaa9f9daa 100644 --- a/Imaging/Core/Testing/Cxx/CMakeLists.txt +++ b/Imaging/Core/Testing/Cxx/CMakeLists.txt @@ -4,6 +4,7 @@ vtk_add_test_cxx(vtkImagingCoreCxxTests tests ImageAccumulateLarge.cxx,NO_VALID,NO_DATA,NO_OUTPUT 32 ImageAutoRange.cxx ImageBSplineCoefficients.cxx + ImageDifference.cxx,NO_VALID ImageGenericInterpolateSlidingWindow3D.cxx ImageHistogram.cxx ImageHistogramStatistics.cxx,NO_VALID diff --git a/Imaging/Core/Testing/Cxx/ImageDifference.cxx b/Imaging/Core/Testing/Cxx/ImageDifference.cxx new file mode 100644 index 0000000000..7febfbb407 --- /dev/null +++ b/Imaging/Core/Testing/Cxx/ImageDifference.cxx @@ -0,0 +1,142 @@ +/*========================================================================= + + Program: Visualization Toolkit + Module: ImageDifference.cxx + + 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. + +=========================================================================*/ +// Test the vtkImageDifference class + +#include "vtkImageDifference.h" +#include "vtkMathUtilities.h" +#include "vtkNew.h" +#include "vtkPNGReader.h" +#include "vtkTestUtilities.h" + +#include +#include + +namespace +{ +bool CheckErrors(vtkImageDifference* differenceFilter, double expectedError, + double expectedThresholdedError, const std::string& info) +{ + if (!vtkMathUtilities::FuzzyCompare(differenceFilter->GetError(), expectedError, 1e-8) || + !vtkMathUtilities::FuzzyCompare( + differenceFilter->GetThresholdedError(), expectedThresholdedError, 1e-8)) + { + std::cerr << std::setprecision(std::numeric_limits::digits10); + std::cerr << std::setprecision(17); + std::cerr << "Unexpected vtkImageDifference errors with " << info << std::endl; + std::cerr << "Expected error: " << expectedError << ", got: " << differenceFilter->GetError() + << " " << (expectedError != differenceFilter->GetError()) << std::endl; + std::cerr << "Expected thresholded error: " << expectedThresholdedError + << ", got: " << differenceFilter->GetThresholdedError() << " " + << (expectedThresholdedError != differenceFilter->GetThresholdedError()) << std::endl; + return false; + } + return true; +} +} + +int ImageDifference(int argc, char* argv[]) +{ + char* fname1 = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/ImageDiff1.png"); + char* fname2 = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/ImageDiff2.png"); + + vtkNew reader1; + reader1->SetFileName(fname1); + reader1->Update(); + + vtkNew reader2; + reader2->SetFileName(fname2); + reader2->Update(); + + delete[] fname1; + delete[] fname2; + + vtkNew differenceFilter; + differenceFilter->SetInputConnection(reader1->GetOutputPort()); + differenceFilter->SetImageConnection(reader2->GetOutputPort()); + + // Default param + differenceFilter->Update(); + if (!::CheckErrors( + differenceFilter, 10600.898039215839, 0.97124183006535825, "default parameters")) + { + return EXIT_FAILURE; + } + + // Testing symmetric + differenceFilter->SetInputConnection(reader2->GetOutputPort()); + differenceFilter->SetImageConnection(reader1->GetOutputPort()); + differenceFilter->Update(); + if (!::CheckErrors( + differenceFilter, 10600.898039215839, 0.97124183006535825, "symmetric testing")) + { + return EXIT_FAILURE; + } + + // Zero threshold + differenceFilter->SetThreshold(0); + differenceFilter->Update(); + if (!::CheckErrors(differenceFilter, 9342.9607843138092, 9342.9607843138092, "zero threshold")) + { + return EXIT_FAILURE; + } + + // Higher average threshold + differenceFilter->SetThreshold(105); + differenceFilter->SetAverageThresholdFactor(1.); + differenceFilter->Update(); + if (!::CheckErrors( + differenceFilter, 10594.431372549172, 0.22614379084967323, "higher average threshold")) + { + return EXIT_FAILURE; + } + + // No averaging + differenceFilter->SetAverageThresholdFactor(0.5); + differenceFilter->SetAveraging(false); + differenceFilter->Update(); + if (!::CheckErrors(differenceFilter, 10600.898039215839, 0.97124183006535825, "no averaging")) + { + return EXIT_FAILURE; + } + + // No shift + differenceFilter->SetAveraging(true); + differenceFilter->SetAllowShift(false); + differenceFilter->Update(); + if (!::CheckErrors(differenceFilter, 9587.1254901961565, 1.1986928104575143, "no shift")) + { + return EXIT_FAILURE; + } + + // Multi param + differenceFilter->SetThreshold(0); + differenceFilter->SetAveraging(false); + differenceFilter->Update(); + if (!::CheckErrors( + differenceFilter, 9587.1254901961565, 9587.1254901961565, "multiple parameters changes")) + { + return EXIT_FAILURE; + } + + // Identical + differenceFilter->SetInputConnection(reader1->GetOutputPort()); + differenceFilter->Update(); + if (!::CheckErrors(differenceFilter, 0., 0., "identical images")) + { + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/Testing/Data/ImageDiff1.png.sha512 b/Testing/Data/ImageDiff1.png.sha512 new file mode 100644 index 0000000000..db387a8ccd --- /dev/null +++ b/Testing/Data/ImageDiff1.png.sha512 @@ -0,0 +1 @@ +d433e15a7e9bfb3b03eb5b5c73d3956782fd1f5662008ceb5180600202c87e4c47e541c4409c1bca5a6083183f3a005aeb70155c218a9977478ae9900d773963 diff --git a/Testing/Data/ImageDiff2.png.sha512 b/Testing/Data/ImageDiff2.png.sha512 new file mode 100644 index 0000000000..3c1c30ed1e --- /dev/null +++ b/Testing/Data/ImageDiff2.png.sha512 @@ -0,0 +1 @@ +2f6bf435136d567d6f9a4199f657073002f39d6c83dafac64223f6f6bb8d3af13cfe8c43f2e781695caff1f13019e02f58007f4d042c85c0eee3211f38758ce8