From 0a0d9a10b65a90814018f58a6a3dc30856090c8e Mon Sep 17 00:00:00 2001 From: Roman Grothausmann Date: Tue, 25 Sep 2018 14:54:50 +0200 Subject: [PATCH 1/7] TEST: plain copy of itkResampleImageTest.cxx and its cmake --- .../Filtering/ImageGrid/test/CMakeLists.txt | 16 ++ .../ImageGrid/test/itkResampleImageTest2s.cxx | 248 ++++++++++++++++++ 2 files changed, 264 insertions(+) create mode 100644 Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx diff --git a/Modules/Filtering/ImageGrid/test/CMakeLists.txt b/Modules/Filtering/ImageGrid/test/CMakeLists.txt index bd7bd4bfea2..5d680bd6145 100644 --- a/Modules/Filtering/ImageGrid/test/CMakeLists.txt +++ b/Modules/Filtering/ImageGrid/test/CMakeLists.txt @@ -223,6 +223,22 @@ itk_add_test(NAME itkResampleImageTest2 ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2b.png ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2c.png ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2d.png) +itk_add_test(NAME itkResampleImageTest2 + COMMAND ITKImageGridTestDriver + --compare DATA{${ITK_DATA_ROOT}/Baseline/BasicFilters/ResampleImageTest2.png} + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2a.png + --compare DATA{${ITK_DATA_ROOT}/Baseline/BasicFilters/ResampleImageTest2.png} + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2b.png + --compare DATA{Baseline/ResampleImageTest2NearestExtrapolate.png} + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2c.png + --compare DATA{Baseline/ResampleImageTest2NearestExtrapolate.png} + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2d.png + itkResampleImageTest2 DATA{${ITK_DATA_ROOT}/Input/cthead1.png} + DATA{${ITK_DATA_ROOT}/Input/circle.png} + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2a.png + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2b.png + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2c.png + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2d.png) itk_add_test(NAME itkResampleImageTest3 COMMAND ITKImageGridTestDriver --compare DATA{Baseline/ResampleImageTest3.png} diff --git a/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx b/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx new file mode 100644 index 00000000000..09e18f4efd4 --- /dev/null +++ b/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx @@ -0,0 +1,248 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include + +#include "itkAffineTransform.h" +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkResampleImageFilter.h" +#include "itkNearestNeighborExtrapolateImageFunction.h" +#include "itkTestingMacros.h" + +/* Further testing of itkResampleImageFilter + * Output is compared with baseline image using the cmake itk_add_test + * '--compare' option. + */ + +namespace { + +template +class NonlinearAffineTransform: + public itk::AffineTransform +{ +public: + /** Standard class typedefs. */ + typedef NonlinearAffineTransform Self; + typedef itk::AffineTransform< TCoordRepType, NDimensions > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + /** New macro for creation of through a smart pointer. */ + itkSimpleNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkTypeMacro(NonlinearAffineTransform, AffineTransform); + + /** Override this. See test below. */ + virtual bool IsLinear() const ITK_OVERRIDE { return false; } +}; +} + +int itkResampleImageTest2(int argc, char * argv [] ) +{ + + if( argc < 5 ) + { + std::cerr << "Missing arguments ! " << std::endl; + std::cerr << "Usage : " << std::endl; + std::cerr << argv[0] << "inputImage referenceImage " + << "resampledImageLinear resampledImageNonLinear " + << "resampledImageLinearNearestExtrapolate" + << "resampledImageNonLinearNearestExtrapolate"; + std::cerr << std::endl; + return EXIT_FAILURE; + } + + const unsigned int NDimensions = 2; + + typedef unsigned char PixelType; + typedef itk::Image ImageType; + typedef double CoordRepType; + + typedef itk::AffineTransform + AffineTransformType; + typedef NonlinearAffineTransform + NonlinearAffineTransformType; + typedef itk::LinearInterpolateImageFunction + InterpolatorType; + typedef itk::NearestNeighborExtrapolateImageFunction + ExtrapolatorType; + + typedef itk::ImageFileReader< ImageType > ReaderType; + typedef itk::ImageFileWriter< ImageType > WriterType; + + ReaderType::Pointer reader1 = ReaderType::New(); + ReaderType::Pointer reader2 = ReaderType::New(); + ReaderType::Pointer reader3 = ReaderType::New(); + ReaderType::Pointer reader4 = ReaderType::New(); + + WriterType::Pointer writer1 = WriterType::New(); + WriterType::Pointer writer2 = WriterType::New(); + WriterType::Pointer writer3 = WriterType::New(); + WriterType::Pointer writer4 = WriterType::New(); + + reader1->SetFileName( argv[1] ); + reader2->SetFileName( argv[2] ); + reader3->SetFileName( argv[3] ); + reader4->SetFileName( argv[4] ); + + writer1->SetFileName( argv[3] ); + writer2->SetFileName( argv[4] ); + writer3->SetFileName( argv[5] ); + writer4->SetFileName( argv[6] ); + + // Create an affine transformation + AffineTransformType::Pointer affineTransform = AffineTransformType::New(); + affineTransform->Scale(2.0); + + // Create a linear interpolation image function + InterpolatorType::Pointer interpolator = InterpolatorType::New(); + + // Create a nearest neighbor extrapolate image function + ExtrapolatorType::Pointer extrapolator = ExtrapolatorType::New(); + + // Create and configure a resampling filter + typedef itk::ResampleImageFilter< ImageType, ImageType > ResampleFilterType; + + ResampleFilterType::Pointer resample = ResampleFilterType::New(); + + EXERCISE_BASIC_OBJECT_METHODS( resample, ResampleImageFilter, ImageToImageFilter ); + + resample->SetInput( reader1->GetOutput() ); + TEST_SET_GET_VALUE( reader1->GetOutput(), resample->GetInput() ); + + resample->SetReferenceImage( reader2->GetOutput() ); + TEST_SET_GET_VALUE( reader2->GetOutput(), resample->GetReferenceImage() ); + + resample->UseReferenceImageOn(); + TEST_EXPECT_TRUE( resample->GetUseReferenceImage() ); + + resample->SetTransform( affineTransform ); + TEST_SET_GET_VALUE( affineTransform, resample->GetTransform() ); + + resample->SetInterpolator( interpolator ); + TEST_SET_GET_VALUE( interpolator, resample->GetInterpolator() ); + + writer1->SetInput( resample->GetOutput() ); + + // Check GetReferenceImage + if( resample->GetReferenceImage() != reader2->GetOutput() ) + { + std::cerr << "GetReferenceImage() failed ! " << std::endl; + return EXIT_FAILURE; + } + + // Run the resampling filter with the normal, linear, affine transform. + // This will use ResampleImageFilter::LinearThreadedGenerateData(). + std::cout << "Test with normal AffineTransform." << std::endl; + try + { + writer1->Update(); + } + catch( itk::ExceptionObject & excp ) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + // Assign an affine transform that returns + // false for IsLinear() instead of true, to force + // the filter to use the NonlinearThreadedGenerateData method + // instead of LinearThreadedGenerateData. This will test that + // we get the same results for both methods. + std::cout << "Test with NonlinearAffineTransform." << std::endl; + NonlinearAffineTransformType::Pointer nonlinearAffineTransform = + NonlinearAffineTransformType::New(); + + nonlinearAffineTransform->Scale(2.0); + resample->SetTransform( nonlinearAffineTransform ); + writer2->SetInput( resample->GetOutput() ); + try + { + writer2->Update(); + } + catch( itk::ExceptionObject & excp ) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + // Instead of using the default pixel when sampling outside the input image, + // we use a nearest neighbor extrapolator. + resample->SetTransform( affineTransform ); + resample->SetExtrapolator( extrapolator ); + writer3->SetInput( resample->GetOutput() ); + std::cout << "Test with nearest neighbor extrapolator, affine transform." << std::endl; + try + { + writer3->Update(); + } + catch( itk::ExceptionObject & excp ) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + // Instead of using the default pixel when sampling outside the input image, + // we use a nearest neighbor extrapolator. + resample->SetTransform( nonlinearAffineTransform ); + writer4->SetInput( resample->GetOutput() ); + std::cout << "Test with nearest neighbor extrapolator, nonlinear transform." << std::endl; + try + { + writer4->Update(); + } + catch( itk::ExceptionObject & excp ) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + // Check UseReferenceImage methods + resample->UseReferenceImageOff(); + if( resample->GetUseReferenceImage() ) + { + std::cerr << "GetUseReferenceImage() or UseReferenceImageOff() failed ! "; + std::cerr << std::endl; + return EXIT_FAILURE; + } + + // Check UseReferenceImage methods + resample->UseReferenceImageOn(); + if( !resample->GetUseReferenceImage() ) + { + std::cerr << "GetUseReferenceImage() or UseReferenceImageOn() failed ! "; + std::cerr << std::endl; + return EXIT_FAILURE; + } + + // Check UseReferenceImage methods + resample->SetUseReferenceImage( false ); + if( resample->GetUseReferenceImage() ) + { + std::cerr << "GetUseReferenceImage() or SetUseReferenceImage() failed ! "; + std::cerr << std::endl; + return EXIT_FAILURE; + } + + + std::cout << "Test passed." << std::endl; + return EXIT_SUCCESS; + +} From f768f4daec8c9728e213efe67e534a12aede1942 Mon Sep 17 00:00:00 2001 From: Roman Grothausmann Date: Tue, 25 Sep 2018 14:57:59 +0200 Subject: [PATCH 2/7] TEST: employ itkResampleImageTest2s, still the same as itkResampleImageTest2 --- Modules/Filtering/ImageGrid/test/CMakeLists.txt | 5 +++-- Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/ImageGrid/test/CMakeLists.txt b/Modules/Filtering/ImageGrid/test/CMakeLists.txt index 5d680bd6145..1d256fb09fc 100644 --- a/Modules/Filtering/ImageGrid/test/CMakeLists.txt +++ b/Modules/Filtering/ImageGrid/test/CMakeLists.txt @@ -45,6 +45,7 @@ itkWrapPadImageTest.cxx itkMirrorPadImageTest.cxx itkResampleImageTest.cxx itkResampleImageTest2.cxx +itkResampleImageTest2s.cxx itkResampleImageTest3.cxx itkResampleImageTest4.cxx itkResampleImageTest5.cxx @@ -223,7 +224,7 @@ itk_add_test(NAME itkResampleImageTest2 ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2b.png ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2c.png ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2d.png) -itk_add_test(NAME itkResampleImageTest2 +itk_add_test(NAME itkResampleImageTest2s COMMAND ITKImageGridTestDriver --compare DATA{${ITK_DATA_ROOT}/Baseline/BasicFilters/ResampleImageTest2.png} ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2a.png @@ -233,7 +234,7 @@ itk_add_test(NAME itkResampleImageTest2 ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2c.png --compare DATA{Baseline/ResampleImageTest2NearestExtrapolate.png} ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2d.png - itkResampleImageTest2 DATA{${ITK_DATA_ROOT}/Input/cthead1.png} + itkResampleImageTest2s DATA{${ITK_DATA_ROOT}/Input/cthead1.png} DATA{${ITK_DATA_ROOT}/Input/circle.png} ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2a.png ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2b.png diff --git a/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx b/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx index 09e18f4efd4..b291dbed00c 100644 --- a/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx +++ b/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx @@ -54,7 +54,7 @@ class NonlinearAffineTransform: }; } -int itkResampleImageTest2(int argc, char * argv [] ) +int itkResampleImageTest2s(int argc, char * argv [] ) { if( argc < 5 ) From 320411724a895c8a423d497ac67675f3b2eb02b1 Mon Sep 17 00:00:00 2001 From: Roman Grothausmann Date: Wed, 26 Sep 2018 15:05:43 +0200 Subject: [PATCH 3/7] TEST: write MHAs (which support streaming) instead of PNGs --- .../Baseline/ResampleImageTest2.mha.sha512 | 1 + ...pleImageTest2NearestExtrapolate.mha.sha512 | 1 + .../Filtering/ImageGrid/test/CMakeLists.txt | 24 +++++++++---------- 3 files changed, 14 insertions(+), 12 deletions(-) create mode 100644 Modules/Filtering/ImageGrid/test/Baseline/ResampleImageTest2.mha.sha512 create mode 100644 Modules/Filtering/ImageGrid/test/Baseline/ResampleImageTest2NearestExtrapolate.mha.sha512 diff --git a/Modules/Filtering/ImageGrid/test/Baseline/ResampleImageTest2.mha.sha512 b/Modules/Filtering/ImageGrid/test/Baseline/ResampleImageTest2.mha.sha512 new file mode 100644 index 00000000000..3d8c0b91c51 --- /dev/null +++ b/Modules/Filtering/ImageGrid/test/Baseline/ResampleImageTest2.mha.sha512 @@ -0,0 +1 @@ +6dcda44ce36e39fb6a792e26c8cd93830bab8edbe9f33385dc59b24bd6b40c99bbadf9b6ada967b1d1b6624e986f1161960d86db63b2d6b71da58eec0a2b911c diff --git a/Modules/Filtering/ImageGrid/test/Baseline/ResampleImageTest2NearestExtrapolate.mha.sha512 b/Modules/Filtering/ImageGrid/test/Baseline/ResampleImageTest2NearestExtrapolate.mha.sha512 new file mode 100644 index 00000000000..b4c87795633 --- /dev/null +++ b/Modules/Filtering/ImageGrid/test/Baseline/ResampleImageTest2NearestExtrapolate.mha.sha512 @@ -0,0 +1 @@ +bbc1a32a82e88334df11c79f54ba4260ea291f8316c882d6360e7546739eb92109a169cc07abe32250a4e12e49a4bb8bad22c45580ccb78c4ee482fa68675e4f diff --git a/Modules/Filtering/ImageGrid/test/CMakeLists.txt b/Modules/Filtering/ImageGrid/test/CMakeLists.txt index 1d256fb09fc..f2045babe8d 100644 --- a/Modules/Filtering/ImageGrid/test/CMakeLists.txt +++ b/Modules/Filtering/ImageGrid/test/CMakeLists.txt @@ -226,20 +226,20 @@ itk_add_test(NAME itkResampleImageTest2 ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2d.png) itk_add_test(NAME itkResampleImageTest2s COMMAND ITKImageGridTestDriver - --compare DATA{${ITK_DATA_ROOT}/Baseline/BasicFilters/ResampleImageTest2.png} - ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2a.png - --compare DATA{${ITK_DATA_ROOT}/Baseline/BasicFilters/ResampleImageTest2.png} - ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2b.png - --compare DATA{Baseline/ResampleImageTest2NearestExtrapolate.png} - ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2c.png - --compare DATA{Baseline/ResampleImageTest2NearestExtrapolate.png} - ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2d.png + --compare DATA{Baseline/ResampleImageTest2.mha} + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2a.mha + --compare DATA{Baseline/ResampleImageTest2.mha} + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2b.mha + --compare DATA{Baseline/ResampleImageTest2NearestExtrapolate.mha} + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2c.mha + --compare DATA{Baseline/ResampleImageTest2NearestExtrapolate.mha} + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2d.mha itkResampleImageTest2s DATA{${ITK_DATA_ROOT}/Input/cthead1.png} DATA{${ITK_DATA_ROOT}/Input/circle.png} - ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2a.png - ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2b.png - ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2c.png - ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2d.png) + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2a.mha + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2b.mha + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2c.mha + ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest2d.mha) itk_add_test(NAME itkResampleImageTest3 COMMAND ITKImageGridTestDriver --compare DATA{Baseline/ResampleImageTest3.png} From a44c9675935d83f07d6ebc8fc1741a8b07fb2d10 Mon Sep 17 00:00:00 2001 From: Roman Grothausmann Date: Tue, 25 Sep 2018 15:05:58 +0200 Subject: [PATCH 4/7] TEST: demand streaming and employ where possible --- Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx b/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx index b291dbed00c..ebd95c76732 100644 --- a/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx +++ b/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx @@ -153,6 +153,7 @@ int itkResampleImageTest2s(int argc, char * argv [] ) std::cout << "Test with normal AffineTransform." << std::endl; try { + writer1->SetNumberOfStreamDivisions(8); //split into 8 pieces for streaming. writer1->Update(); } catch( itk::ExceptionObject & excp ) @@ -175,6 +176,7 @@ int itkResampleImageTest2s(int argc, char * argv [] ) writer2->SetInput( resample->GetOutput() ); try { + writer2->SetNumberOfStreamDivisions(8); //demand splitting into 8 pieces for streaming, but faked non-linearity will disable streaming writer2->Update(); } catch( itk::ExceptionObject & excp ) @@ -191,6 +193,7 @@ int itkResampleImageTest2s(int argc, char * argv [] ) std::cout << "Test with nearest neighbor extrapolator, affine transform." << std::endl; try { + writer3->SetNumberOfStreamDivisions(8); //split into 8 pieces for streaming. writer3->Update(); } catch( itk::ExceptionObject & excp ) @@ -206,6 +209,7 @@ int itkResampleImageTest2s(int argc, char * argv [] ) std::cout << "Test with nearest neighbor extrapolator, nonlinear transform." << std::endl; try { + writer4->SetNumberOfStreamDivisions(8); //demand splitting into 8 pieces for streaming, but faked non-linearity will disable streaming writer4->Update(); } catch( itk::ExceptionObject & excp ) From 5d765b4d881335f973ad007ca4dcb0fca1cdc174 Mon Sep 17 00:00:00 2001 From: Roman Grothausmann Date: Tue, 25 Sep 2018 15:16:55 +0200 Subject: [PATCH 5/7] TEST: verify streaming for linear case --- .../ImageGrid/test/itkResampleImageTest2s.cxx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx b/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx index ebd95c76732..f4ce5734bd7 100644 --- a/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx +++ b/Modules/Filtering/ImageGrid/test/itkResampleImageTest2s.cxx @@ -23,6 +23,7 @@ #include "itkImageFileWriter.h" #include "itkResampleImageFilter.h" #include "itkNearestNeighborExtrapolateImageFunction.h" +#include "itkPipelineMonitorImageFilter.h" #include "itkTestingMacros.h" /* Further testing of itkResampleImageFilter @@ -122,6 +123,10 @@ int itkResampleImageTest2s(int argc, char * argv [] ) ResampleFilterType::Pointer resample = ResampleFilterType::New(); + typedef itk::PipelineMonitorImageFilter< ImageType > MonitorFilter; + + MonitorFilter::Pointer monitor = MonitorFilter::New(); + EXERCISE_BASIC_OBJECT_METHODS( resample, ResampleImageFilter, ImageToImageFilter ); resample->SetInput( reader1->GetOutput() ); @@ -139,7 +144,8 @@ int itkResampleImageTest2s(int argc, char * argv [] ) resample->SetInterpolator( interpolator ); TEST_SET_GET_VALUE( interpolator, resample->GetInterpolator() ); - writer1->SetInput( resample->GetOutput() ); + monitor->SetInput( resample->GetOutput() ); + writer1->SetInput( monitor->GetOutput() ); // Check GetReferenceImage if( resample->GetReferenceImage() != reader2->GetOutput() ) @@ -161,6 +167,15 @@ int itkResampleImageTest2s(int argc, char * argv [] ) std::cerr << excp << std::endl; return EXIT_FAILURE; } + + // this verifies that the pipeline was executed as expected along + // with correct region propagation and output information + if (!monitor->VerifyAllInputCanStream(8)) + { + std::cout << "Streaming failed to execute as expected!" << std::endl; + std::cout << monitor; + return EXIT_FAILURE; + } // Assign an affine transform that returns // false for IsLinear() instead of true, to force From 9cd71e9b3a460fab730520d23072da6690b6471a Mon Sep 17 00:00:00 2001 From: Roman Grothausmann Date: Mon, 22 Oct 2018 15:24:04 +0200 Subject: [PATCH 6/7] TEST: itkResampleImageTest7.cxx for comparing output of stream driven imaging (SDI) and without SDI --- .../Filtering/ImageGrid/test/CMakeLists.txt | 3 + .../ImageGrid/test/itkResampleImageTest7.cxx | 169 ++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 Modules/Filtering/ImageGrid/test/itkResampleImageTest7.cxx diff --git a/Modules/Filtering/ImageGrid/test/CMakeLists.txt b/Modules/Filtering/ImageGrid/test/CMakeLists.txt index f2045babe8d..e0754b605f2 100644 --- a/Modules/Filtering/ImageGrid/test/CMakeLists.txt +++ b/Modules/Filtering/ImageGrid/test/CMakeLists.txt @@ -50,6 +50,7 @@ itkResampleImageTest3.cxx itkResampleImageTest4.cxx itkResampleImageTest5.cxx itkResampleImageTest6.cxx +itkResampleImageTest7.cxx itkResamplePhasedArray3DSpecialCoordinatesImageTest.cxx itkPushPopTileImageFilterTest.cxx itkShrinkImageStreamingTest.cxx @@ -258,6 +259,8 @@ itk_add_test(NAME itkResampleImageTest6 --compare DATA{Baseline/ResampleImageTest6.png} ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest6.png itkResampleImageTest6 10 ${ITK_TEST_OUTPUT_DIR}/ResampleImageTest6.png) +itk_add_test(NAME itkResampleImageTest7 + COMMAND ITKImageGridTestDriver itkResampleImageTest7) itk_add_test(NAME itkResamplePhasedArray3DSpecialCoordinatesImageTest COMMAND ITKImageGridTestDriver itkResamplePhasedArray3DSpecialCoordinatesImageTest) itk_add_test(NAME itkPushPopTileImageFilterTest diff --git a/Modules/Filtering/ImageGrid/test/itkResampleImageTest7.cxx b/Modules/Filtering/ImageGrid/test/itkResampleImageTest7.cxx new file mode 100644 index 00000000000..9bb2636dfed --- /dev/null +++ b/Modules/Filtering/ImageGrid/test/itkResampleImageTest7.cxx @@ -0,0 +1,169 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include + +#include "itkAffineTransform.h" +#include "itkResampleImageFilter.h" +#include "itkPipelineMonitorImageFilter.h" +#include "itkStreamingImageFilter.h" +#include "itkTestingMacros.h" +#include "itkMath.h" + +/* itkResampleImageFilter output compared to streamed output + */ + +int itkResampleImageTest7( int argc, char * argv [] ) +{ + + if (argc > 1) + { + std::cout << "Usage: " << argv[0] + << " noParams" << std::endl; + return EXIT_FAILURE; + } + + const unsigned int NDimensions = 2; + + typedef unsigned char PixelType; + typedef itk::Image ImageType; + typedef ImageType::IndexType ImageIndexType; + typedef ImageType::Pointer ImagePointerType; + typedef ImageType::RegionType ImageRegionType; + typedef ImageType::SizeType ImageSizeType; + typedef double CoordRepType; + + typedef itk::AffineTransform + AffineTransformType; + + // Create and configure an image + ImagePointerType image = ImageType::New(); + ImageIndexType index = {{0, 0}}; + ImageSizeType size = {{64,64}}; + ImageRegionType region; + region.SetSize ( size ); + region.SetIndex( index ); + image->SetLargestPossibleRegion( region ); + image->SetBufferedRegion( region ); + image->Allocate(); + + // Fill image with a ramp + std::cout << "init image..." << std::flush; + itk::ImageRegionIteratorWithIndex iter(image, region); + PixelType value; + for (iter.GoToBegin(); !iter.IsAtEnd(); ++iter) + { + index = iter.GetIndex(); + value = index[0] + index[1]; + iter.Set(value); + } + std::cout << "Done." << std::endl; + + // Create an affine transformation + AffineTransformType::Pointer affineTransform = AffineTransformType::New(); + affineTransform->Scale(2.0); + + // Create and configure a resampling filter + typedef itk::ResampleImageFilter< ImageType, ImageType > ResampleFilterType; + ResampleFilterType::Pointer resample = ResampleFilterType::New(); + + typedef itk::PipelineMonitorImageFilter< ImageType > MonitorFilter; + MonitorFilter::Pointer monitor = MonitorFilter::New(); + + typedef itk::StreamingImageFilter StreamerType; + StreamerType::Pointer streamer = StreamerType::New(); + + std::cout << "Test with normal AffineTransform." << std::endl; + resample->SetInput( image ); + resample->SetTransform( affineTransform ); + monitor->SetInput( resample->GetOutput() ); + streamer->SetInput( monitor->GetOutput() ); + + unsigned char numStreamDiv; + + // Run the resampling filter without streaming, i.e. 1 StreamDivisions + numStreamDiv= 1; // do not split, i.e. do not stream + try + { + streamer->SetNumberOfStreamDivisions(numStreamDiv); + streamer->Update(); + } + catch( itk::ExceptionObject & excp ) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + if (!monitor->VerifyAllInputCanStream(numStreamDiv)) + { + std::cout << "Avoiding streaming failed to execute as expected!" << std::endl; + std::cout << monitor; + return EXIT_FAILURE; + } + + ImagePointerType outputNoSDI= streamer->GetOutput(); + outputNoSDI->DisconnectPipeline(); + + // Run the resampling filter with streaming + numStreamDiv= 8; // split into numStream pieces for streaming. + try + { + streamer->SetNumberOfStreamDivisions(numStreamDiv); + streamer->Update(); + } + catch( itk::ExceptionObject & excp ) + { + std::cerr << excp << std::endl; + return EXIT_FAILURE; + } + + if (!monitor->VerifyAllInputCanStream(numStreamDiv)) + { + std::cout << "Streaming failed to execute as expected!" << std::endl; + std::cout << monitor; + return EXIT_FAILURE; + } + + ImagePointerType outputSDI= streamer->GetOutput(); + outputSDI->DisconnectPipeline(); + + itk::ImageRegionIterator + itNoSDI(outputNoSDI, outputNoSDI->GetLargestPossibleRegion()), + itSDI(outputSDI, outputSDI->GetLargestPossibleRegion()); + for(itNoSDI.GoToBegin(), itSDI.GoToBegin(); + !itNoSDI.IsAtEnd() && !itSDI.IsAtEnd(); + ++itNoSDI, ++itSDI) + { + if(itk::Math::NotAlmostEquals( itNoSDI.Value(), itSDI.Value() )) + { + std::cout << "Pixels differ " + << itNoSDI.Value() << " " + << itSDI.Value() << std::endl; + return EXIT_FAILURE; + } + } + if(itNoSDI.IsAtEnd() != itSDI.IsAtEnd()) + { + std::cout << "Iterators don't agree on end of image" << std::endl; + return EXIT_FAILURE; + } + + std::cout << "Test passed." << std::endl; + return EXIT_SUCCESS; + +} From 0f962c5c30ec28d96b950f64ed3cdce8fa0887f3 Mon Sep 17 00:00:00 2001 From: Roman Grothausmann Date: Tue, 23 Oct 2018 08:26:39 +0200 Subject: [PATCH 7/7] mark resample as modified to enforce re-execution of filter chain --- Modules/Filtering/ImageGrid/test/itkResampleImageTest7.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Filtering/ImageGrid/test/itkResampleImageTest7.cxx b/Modules/Filtering/ImageGrid/test/itkResampleImageTest7.cxx index 9bb2636dfed..2f471a88953 100644 --- a/Modules/Filtering/ImageGrid/test/itkResampleImageTest7.cxx +++ b/Modules/Filtering/ImageGrid/test/itkResampleImageTest7.cxx @@ -121,6 +121,7 @@ int itkResampleImageTest7( int argc, char * argv [] ) // Run the resampling filter with streaming numStreamDiv= 8; // split into numStream pieces for streaming. + resample->Modified(); try { streamer->SetNumberOfStreamDivisions(numStreamDiv);