diff --git a/Modules/Filtering/ImageGrid/test/Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05.mha.md5 b/Modules/Filtering/ImageGrid/test/Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05.mha.md5 deleted file mode 100644 index 45eb7eec001..00000000000 --- a/Modules/Filtering/ImageGrid/test/Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05.mha.md5 +++ /dev/null @@ -1 +0,0 @@ -d3b13d7262caf683a7a2be8c241c7fae diff --git a/Modules/Filtering/ImageGrid/test/Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05.mha.sha512 b/Modules/Filtering/ImageGrid/test/Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05.mha.sha512 deleted file mode 100644 index 1640a7fe26e..00000000000 --- a/Modules/Filtering/ImageGrid/test/Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05.mha.sha512 +++ /dev/null @@ -1 +0,0 @@ -a38c87c06d5c8175eb26834c927e43a350ccb50882350d3c1f1ffaae7cece4a8a0b7d8a4a56563bd4dc3f48a57d9a924881e3a409ccfa56c8ff118f4a18d5bf8 diff --git a/Modules/Filtering/ImageGrid/test/Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05_magnitude.png.sha512 b/Modules/Filtering/ImageGrid/test/Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05_magnitude.png.sha512 new file mode 100644 index 00000000000..0794dbd8a3c --- /dev/null +++ b/Modules/Filtering/ImageGrid/test/Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05_magnitude.png.sha512 @@ -0,0 +1 @@ +60ff7a61fc2ced761db98f50462f12b64a38024a7fb48e4b3b0fd580ae57555e7ddd08582800bd82cda800546f043cacb616daa28b280775b0d5558b2401e914 diff --git a/Modules/Filtering/ImageGrid/test/CMakeLists.txt b/Modules/Filtering/ImageGrid/test/CMakeLists.txt index 1b4073175c9..2ee09e88cee 100644 --- a/Modules/Filtering/ImageGrid/test/CMakeLists.txt +++ b/Modules/Filtering/ImageGrid/test/CMakeLists.txt @@ -89,9 +89,9 @@ itk_add_test(NAME itkBSplineScatteredDataPointSetToImageFilterTest04 COMMAND ITKImageGridTestDriver itkBSplineScatteredDataPointSetToImageFilterTest4) itk_add_test(NAME itkBSplineScatteredDataPointSetToImageFilterTest05 COMMAND ITKImageGridTestDriver - --compare DATA{Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05.mha} - ${ITK_TEST_OUTPUT_DIR}/itkBSplineScatteredDataPointSetToImageFilterTest05.mha - itkBSplineScatteredDataPointSetToImageFilterTest5 ${ITK_TEST_OUTPUT_DIR}/itkBSplineScatteredDataPointSetToImageFilterTest05.mha) + --compare DATA{Baseline/itkBSplineScatteredDataPointSetToImageFilterTest05_magnitude.png} + ${ITK_TEST_OUTPUT_DIR}/itkBSplineScatteredDataPointSetToImageFilterTest05_magnitude.png + itkBSplineScatteredDataPointSetToImageFilterTest5 ${ITK_TEST_OUTPUT_DIR}/itkBSplineScatteredDataPointSetToImageFilterTest05_magnitude.png) itk_add_test(NAME itkBSplineControlPointImageFilterTest1 COMMAND ITKImageGridTestDriver --compare ${ITK_TEST_OUTPUT_DIR}/N4ControlPoints_2D_output.nii.gz diff --git a/Modules/Filtering/ImageGrid/test/itkBSplineScatteredDataPointSetToImageFilterTest5.cxx b/Modules/Filtering/ImageGrid/test/itkBSplineScatteredDataPointSetToImageFilterTest5.cxx index 856604322e3..36538e8eca0 100644 --- a/Modules/Filtering/ImageGrid/test/itkBSplineScatteredDataPointSetToImageFilterTest5.cxx +++ b/Modules/Filtering/ImageGrid/test/itkBSplineScatteredDataPointSetToImageFilterTest5.cxx @@ -21,6 +21,58 @@ #include "itkPointSet.h" #include "itkBSplineScatteredDataPointSetToImageFilter.h" #include "itkTestingMacros.h" +#include "itkImageRegionIterator.h" + + +/** + * Function to convert image of double precison vector pixels to a + * representation of scalar values that are easy to view and test. + * NOTE: Similar function in itkSymmetricEigenAnalysisImageFilterTest.cxx + */ +template +static void +makeTestableScalarImage(typename InternalImageType::Pointer internalImage, std::string outputFilename) +{ // using OutputPixelType = unsigned char; + using OutputPixelType = uint8_t; + using OutputImageType = itk::Image; + + OutputImageType::Pointer outputImage = OutputImageType::New(); + outputImage->CopyInformation(internalImage); + outputImage->SetRegions(internalImage->GetBufferedRegion()); + outputImage->Allocate(true); + + auto myiterator = itk::ImageRegionConstIterator(internalImage, internalImage->GetBufferedRegion()); + auto myOutiterator = itk::ImageRegionIterator(outputImage, outputImage->GetBufferedRegion()); + + // Convert vector image to magnitude and scale to use range of png values + float max_magnitude_value = 0.0; + while (!myiterator.IsAtEnd()) + { + const auto arr = myiterator.Get(); + const auto magvalue = std::sqrt(arr[0] * arr[0] + arr[1] * arr[1] + arr[2] * arr[2]); + max_magnitude_value = std::max(max_magnitude_value, magvalue); + ++myiterator; + } + const float scale_factor = 255.0 / ceil(max_magnitude_value); + myOutiterator.GoToBegin(); + myiterator.GoToBegin(); + while (!myOutiterator.IsAtEnd()) + { + // Convert vector image to magnitude and scale to use range of png values + const auto arr = myiterator.Get(); + const auto magvalue = std::sqrt(arr[0] * arr[0] + arr[1] * arr[1] + arr[2] * arr[2]); + myOutiterator.Set(magvalue * scale_factor); + ++myiterator; + ++myOutiterator; + } + + // Write the result image + using WriterType = itk::ImageFileWriter; + auto writer = WriterType::New(); + writer->SetFileName(outputFilename); + writer->SetInput(outputImage); + writer->Update(); +} /** @@ -45,11 +97,9 @@ itkBSplineScatteredDataPointSetToImageFilterTest5(int argc, char * argv[]) constexpr unsigned int DataDimension = 3; using RealType = double; - using OutputPixelType = unsigned char; + using VectorType = itk::Vector; - using OutputVectorType = itk::Vector; using ImageType = itk::Image; - using OutputImageType = itk::Image; using PointSetType = itk::PointSet; @@ -65,7 +115,7 @@ itkBSplineScatteredDataPointSetToImageFilterTest5(int argc, char * argv[]) PointSetType::PointType point; point[0] = (u + 2.0 * itk::Math::pi) / (4.0 * itk::Math::pi); point[1] = (v + itk::Math::pi) / (2.0 * itk::Math::pi); - unsigned long i = pointSet->GetNumberOfPoints(); + const unsigned long i = pointSet->GetNumberOfPoints(); pointSet->SetPoint(i, point); VectorType V; @@ -115,21 +165,11 @@ itkBSplineScatteredDataPointSetToImageFilterTest5(int argc, char * argv[]) close.Fill(1); filter->SetCloseDimension(close); - ITK_TRY_EXPECT_NO_EXCEPTION(filter->Update()); - // Cast the PhiLattice - using CastImageFilterType = itk::CastImageFilter; - auto caster = CastImageFilterType::New(); - caster->SetInput(filter->GetPhiLattice()); - - // Write the PhiLattice - using WriterType = itk::ImageFileWriter; - auto writer = WriterType::New(); - writer->SetFileName(argv[1]); - writer->SetInput(caster->GetOutput()); - - ITK_TRY_EXPECT_NO_EXCEPTION(writer->Update()); + const std::string outputFilename = argv[1]; + auto phiLatticeImage = filter->GetPhiLattice(); + ITK_TRY_EXPECT_NO_EXCEPTION(makeTestableScalarImage(phiLatticeImage, outputFilename)); return EXIT_SUCCESS; } diff --git a/Modules/Filtering/ImageIntensity/test/CMakeLists.txt b/Modules/Filtering/ImageIntensity/test/CMakeLists.txt index dd6e6f54baa..f011ede5c1d 100644 --- a/Modules/Filtering/ImageIntensity/test/CMakeLists.txt +++ b/Modules/Filtering/ImageIntensity/test/CMakeLists.txt @@ -138,9 +138,9 @@ itk_add_test(NAME itkInvertIntensityImageFilterTest itk_add_test(NAME itkSymmetricEigenAnalysisImageFilterTestOrderByValue COMMAND ITKImageIntensityTestDriver --compare-MD5 ${ITK_TEST_OUTPUT_DIR}/itkSymmetricEigenAnalysisImageFilterTestOrderByValue.png - 941cdbc107bea093a564a83ed5993d6d + 8e3e4221d36144133d2f6692b2ad980b --compare-MD5 ${ITK_TEST_OUTPUT_DIR}/itkSymmetricEigenAnalysisFixedDimensionImageFilterTestOrderByValue.png - 941cdbc107bea093a564a83ed5993d6d + 8e3e4221d36144133d2f6692b2ad980b itkSymmetricEigenAnalysisImageFilterTest ${ITK_TEST_OUTPUT_DIR}/itkSymmetricEigenAnalysisImageFilterTestOrderByValue.png 1 @@ -148,9 +148,9 @@ itk_add_test(NAME itkSymmetricEigenAnalysisImageFilterTestOrderByValue itk_add_test(NAME itkSymmetricEigenAnalysisImageFilterTestOrderByMagnitude COMMAND ITKImageIntensityTestDriver --compare-MD5 ${ITK_TEST_OUTPUT_DIR}/itkSymmetricEigenAnalysisImageFilterTestOrderByMagnitude.png - dbff47eae29f458759de12b3dee95176 + 8e3e4221d36144133d2f6692b2ad980b --compare-MD5 ${ITK_TEST_OUTPUT_DIR}/itkSymmetricEigenAnalysisFixedDimensionImageFilterTestOrderByMagnitude.png - dbff47eae29f458759de12b3dee95176 + 8e3e4221d36144133d2f6692b2ad980b itkSymmetricEigenAnalysisImageFilterTest ${ITK_TEST_OUTPUT_DIR}/itkSymmetricEigenAnalysisImageFilterTestOrderByMagnitude.png 2 @@ -160,9 +160,9 @@ itk_add_test(NAME itkSymmetricEigenAnalysisImageFilterTestOrderByMagnitude itk_add_test(NAME itkSymmetricEigenAnalysisImageFilterTestDoNotOrder COMMAND ITKImageIntensityTestDriver --compare-MD5 ${ITK_TEST_OUTPUT_DIR}/itkSymmetricEigenAnalysisImageFilterTestDoNotOrder.png - dbff47eae29f458759de12b3dee95176 + 8e3e4221d36144133d2f6692b2ad980b --compare-MD5 ${ITK_TEST_OUTPUT_DIR}/itkSymmetricEigenAnalysisFixedDimensionImageFilterTestDoNotOrder.png - 941cdbc107bea093a564a83ed5993d6d + 8e3e4221d36144133d2f6692b2ad980b itkSymmetricEigenAnalysisImageFilterTest ${ITK_TEST_OUTPUT_DIR}/itkSymmetricEigenAnalysisImageFilterTestDoNotOrder.png 3 diff --git a/Modules/Filtering/ImageIntensity/test/itkSymmetricEigenAnalysisImageFilterTest.cxx b/Modules/Filtering/ImageIntensity/test/itkSymmetricEigenAnalysisImageFilterTest.cxx index d5286cfeef0..6fedf823899 100644 --- a/Modules/Filtering/ImageIntensity/test/itkSymmetricEigenAnalysisImageFilterTest.cxx +++ b/Modules/Filtering/ImageIntensity/test/itkSymmetricEigenAnalysisImageFilterTest.cxx @@ -21,11 +21,62 @@ #include "itkSymmetricSecondRankTensor.h" #include "itkSymmetricEigenAnalysisImageFilter.h" #include "itkTestingMacros.h" +#include "itkImageRegionIterator.h" + +/** + * Function to convert image of double precison vector pixels to a + * representation of scalar values that are easy to view and test. + * NOTE: Similar function in itkBSplineScatteredDataPointSetToImageFilterTest5.cxx + */ +template +static void +makeTestableScalarImage(typename InternalImageType::Pointer internalImage, std::string outputFilename) +{ // using OutputPixelType = unsigned char; + using OutputPixelType = uint8_t; + using OutputImageType = itk::Image; + + OutputImageType::Pointer outputImage = OutputImageType::New(); + outputImage->CopyInformation(internalImage); + outputImage->SetRegions(internalImage->GetBufferedRegion()); + outputImage->Allocate(true); + + auto myiterator = itk::ImageRegionConstIterator(internalImage, internalImage->GetBufferedRegion()); + auto myOutiterator = itk::ImageRegionIterator(outputImage, outputImage->GetBufferedRegion()); + + // Convert vector image to magnitude and scale to use range of png values + float max_magnitude_value = 0.0; + while (!myiterator.IsAtEnd()) + { + const auto arr = myiterator.Get(); + const auto magvalue = std::sqrt(arr[0] * arr[0] + arr[1] * arr[1] + arr[2] * arr[2]); + max_magnitude_value = std::max(max_magnitude_value, magvalue); + ++myiterator; + } + const float scale_factor = 255.0 / ceil(max_magnitude_value); + myOutiterator.GoToBegin(); + myiterator.GoToBegin(); + while (!myOutiterator.IsAtEnd()) + { + // Convert vector image to magnitude and scale to use range of png values + const auto arr = myiterator.Get(); + const auto magvalue = std::sqrt(arr[0] * arr[0] + arr[1] * arr[1] + arr[2] * arr[2]); + myOutiterator.Set(magvalue * scale_factor); + ++myiterator; + ++myOutiterator; + } + // Write the result image + using WriterType = itk::ImageFileWriter; + auto writer = WriterType::New(); + writer->SetFileName(outputFilename); + writer->SetInput(outputImage); + writer->Update(); +} namespace itk { + template class SymmetricEigenAnalysisImageFilterHelper : public SymmetricEigenAnalysisImageFilter { @@ -39,8 +90,6 @@ class SymmetricEigenAnalysisImageFilterHelper : public SymmetricEigenAnalysisIma using InputImageType = TInputImage; using InternalImageType = TInternalImage; - using OutputImageType = TOutputImage; - itkTypeMacro(SymmetricEigenAnalysisImageFilterHelper, SymmetricEigenAnalysisImageFilter); @@ -84,9 +133,6 @@ class SymmetricEigenAnalysisImageFilterHelper : public SymmetricEigenAnalysisIma // Declare Iterator type for the input image using IteratorType = itk::ImageRegionIteratorWithIndex; - // Create one iterator for the input image (this is a light object) - IteratorType it(inputImage, inputImage->GetRequestedRegion()); - typename InputImageType::PixelType tensorValue; tensorValue(0, 0) = 19.0; @@ -96,8 +142,8 @@ class SymmetricEigenAnalysisImageFilterHelper : public SymmetricEigenAnalysisIma tensorValue(1, 2) = 37.0; tensorValue(2, 2) = 39.0; - it.GoToBegin(); - + // Create one iterator for the input image (this is a light object) + IteratorType it(inputImage, inputImage->GetRequestedRegion()); // Initialize the content of the input image while (!it.IsAtEnd()) { @@ -105,7 +151,6 @@ class SymmetricEigenAnalysisImageFilterHelper : public SymmetricEigenAnalysisIma ++it; } - // Create the filter auto filter = SymmetricEigenAnalysisImageFilterType::New(); @@ -130,32 +175,15 @@ class SymmetricEigenAnalysisImageFilterHelper : public SymmetricEigenAnalysisIma // Because the object connected to the output may be changed // by another during GenerateData() call typename InternalImageType::Pointer internalImage = filter->GetOutput(); + ITK_TRY_EXPECT_NO_EXCEPTION(makeTestableScalarImage(internalImage, outputFilename)); - // Get the output image to a writable format - using CastImageFilterType = itk::CastImageFilter; - - auto roundImageFilter = CastImageFilterType::New(); - - roundImageFilter->SetInput(internalImage); - - ITK_TRY_EXPECT_NO_EXCEPTION(roundImageFilter->Update()); - - // Write the result image - using WriterType = itk::ImageFileWriter; - - auto writer = WriterType::New(); - - writer->SetFileName(outputFilename); - - writer->SetInput(roundImageFilter->GetOutput()); - - ITK_TRY_EXPECT_NO_EXCEPTION(writer->Update()); std::cout << "Test succeeded." << std::endl; return EXIT_SUCCESS; } }; + template class SymmetricEigenAnalysisFixedDimensionImageFilterHelper : public SymmetricEigenAnalysisFixedDimensionImageFilter @@ -167,14 +195,11 @@ class SymmetricEigenAnalysisFixedDimensionImageFilterHelper using Pointer = SmartPointer; using ConstPointer = SmartPointer; - using InputImageType = TInputImage; using InternalImageType = TInternalImage; using OutputImageType = TOutputImage; - itkTypeMacro(SymmetricEigenAnalysisFixedDimensionImageFilterHelper, SymmetricEigenAnalysisFixedDimensionImageFilter); - itkNewMacro(Self); static int @@ -216,9 +241,6 @@ class SymmetricEigenAnalysisFixedDimensionImageFilterHelper // Declare Iterator type for the input image using IteratorType = itk::ImageRegionIteratorWithIndex; - // Create one iterator for the input image (this is a light object) - IteratorType it(inputImage, inputImage->GetRequestedRegion()); - typename InputImageType::PixelType tensorValue; tensorValue(0, 0) = 19.0; @@ -228,8 +250,8 @@ class SymmetricEigenAnalysisFixedDimensionImageFilterHelper tensorValue(1, 2) = 37.0; tensorValue(2, 2) = 39.0; - it.GoToBegin(); - + // Create one iterator for the input image (this is a light object) + IteratorType it(inputImage, inputImage->GetRequestedRegion()); // Initialize the content of the input image while (!it.IsAtEnd()) { @@ -243,9 +265,7 @@ class SymmetricEigenAnalysisFixedDimensionImageFilterHelper // Set the input image filter->SetInput(inputImage); - filter->SetFunctor(filter->GetFunctor()); - filter->OrderEigenValuesBy(order); // Execute the filter @@ -256,26 +276,7 @@ class SymmetricEigenAnalysisFixedDimensionImageFilterHelper // Because the object connected to the output may be changed // by another during GenerateData() call typename InternalImageType::Pointer internalImage = filter->GetOutput(); - - // Get the output image to a writable format - using CastImageFilterType = itk::CastImageFilter; - - auto roundImageFilter = CastImageFilterType::New(); - - roundImageFilter->SetInput(internalImage); - - ITK_TRY_EXPECT_NO_EXCEPTION(roundImageFilter->Update()); - - // Write the result image - using WriterType = itk::ImageFileWriter; - - auto writer = WriterType::New(); - - writer->SetFileName(outputFilename); - - writer->SetInput(roundImageFilter->GetOutput()); - - ITK_TRY_EXPECT_NO_EXCEPTION(writer->Update()); + ITK_TRY_EXPECT_NO_EXCEPTION(makeTestableScalarImage(internalImage, outputFilename)); std::cout << "Test succeeded." << std::endl; return EXIT_SUCCESS; @@ -330,7 +331,7 @@ itkSymmetricEigenAnalysisImageFilterTest(int argc, char * argv[]) // Get the input arguments auto order = static_cast(std::stoi(argv[2])); - std::string outputFilename = argv[1]; + const std::string outputFilename = argv[1]; // Test the filter @@ -348,8 +349,8 @@ itkSymmetricEigenAnalysisImageFilterTest(int argc, char * argv[]) using FilterFixedDimensionType = itk::SymmetricEigenAnalysisFixedDimensionImageFilter; - auto orderFixedDimension = static_cast(std::stoi(argv[2])); - std::string outputFilenameFixedDimension = argv[3]; + auto orderFixedDimension = static_cast(std::stoi(argv[2])); + const std::string outputFilenameFixedDimension = argv[3]; // Create an instance to exercise basic object methods auto filterFixedDimension = FilterFixedDimensionType::New(); ITK_EXERCISE_BASIC_OBJECT_METHODS(