@@ -34,6 +34,49 @@ Validate(double input, double desired, double tolerance)
3434 return std::abs<double >(input - desired) > tolerance * std::abs<double >(desired);
3535}
3636
37+ // Returns true if images are different
38+ template <typename ImageType>
39+ bool
40+ imagesDifferent (ImageType * baselineImage, ImageType * outputImage)
41+ {
42+ double tol = 1 .e -3 ; // tolerance
43+
44+ typename ImageType::PointType origin = outputImage->GetOrigin ();
45+ typename ImageType::DirectionType direction = outputImage->GetDirection ();
46+ typename ImageType::SpacingType spacing = outputImage->GetSpacing ();
47+
48+ typename ImageType::PointType origin_d = baselineImage->GetOrigin ();
49+ typename ImageType::DirectionType direction_d = baselineImage->GetDirection ();
50+ typename ImageType::SpacingType spacing_d = baselineImage->GetSpacing ();
51+
52+ // Image info validation
53+ bool result = false ; // no difference by default
54+ for (unsigned int i = 0 ; i < ImageType::ImageDimension; ++i)
55+ {
56+ result = (result || Validate (origin[i], origin_d[i], tol));
57+ result = (result || Validate (spacing[i], spacing_d[i], tol));
58+ for (unsigned int j = 0 ; j < ImageType::ImageDimension; ++j)
59+ {
60+ result = (result || Validate (direction (i, j), direction_d (i, j), tol));
61+ }
62+ }
63+
64+ // Voxel contents validation
65+ using ImageConstIterator = itk::ImageRegionConstIterator<ImageType>;
66+ ImageConstIterator it1 (outputImage, outputImage->GetRequestedRegion ());
67+ ImageConstIterator it2 (baselineImage, baselineImage->GetRequestedRegion ());
68+ it1.GoToBegin ();
69+ it2.GoToBegin ();
70+ while (!it1.IsAtEnd ())
71+ {
72+ result = (result || Validate (it1.Get (), it2.Get (), tol));
73+ ++it1;
74+ ++it2;
75+ }
76+
77+ return result;
78+ }
79+
3780int
3881itkResampleInPlaceImageFilterTest (int argc, char * argv[])
3982{
@@ -45,19 +88,12 @@ itkResampleInPlaceImageFilterTest(int argc, char * argv[])
4588 return EXIT_FAILURE ;
4689 }
4790
48- double tol = 1 .e -3 ; // tolerance
49-
5091 constexpr unsigned int Dimension = 3 ;
5192 using PixelType = short ;
5293
5394 using ImageType = itk::Image<PixelType, Dimension>;
5495 using ImagePointer = ImageType::Pointer;
55- using ImagePointType = ImageType::PointType;
56- using ImageDirectionType = ImageType::DirectionType;
57- using ImageSpacingType = ImageType::SpacingType;
58- using ImageConstIterator = itk::ImageRegionConstIterator<ImageType>;
5996 using TransformType = itk::VersorRigid3DTransform<double >;
60-
6197 using FilterType = itk::ResampleInPlaceImageFilter<ImageType, ImageType>;
6298
6399 // Read in input test image
@@ -92,50 +128,33 @@ itkResampleInPlaceImageFilterTest(int argc, char * argv[])
92128 // Set up the resample filter
93129 FilterType::Pointer filter = FilterType::New ();
94130 ITK_EXERCISE_BASIC_OBJECT_METHODS (filter, ResampleInPlaceImageFilter, ImageToImageFilter);
131+
95132 filter->SetInputImage (inputImage);
96133 ITK_TEST_SET_GET_VALUE (inputImage, filter->GetInputImage ());
97134 filter->SetRigidTransform (transform);
98135 ITK_TEST_SET_GET_VALUE (transform, filter->GetRigidTransform ());
99136 ITK_TRY_EXPECT_NO_EXCEPTION (filter->Update ());
100137 ImagePointer outputImage = filter->GetOutput ();
101-
102- // Get image info
103- ImagePointType origin = outputImage->GetOrigin ();
104- ImageDirectionType direction = outputImage->GetDirection ();
105- ImageSpacingType spacing = outputImage->GetSpacing ();
138+ ITK_TRY_EXPECT_NO_EXCEPTION (itk::WriteImage (outputImage, argv[3 ]));
106139
107140 // Read in baseline image
108141 ImagePointer baselineImage = nullptr ;
109142 ITK_TRY_EXPECT_NO_EXCEPTION (baselineImage = itk::ReadImage<ImageType>(argv[2 ]));
110143
111- ImagePointType origin_d = baselineImage->GetOrigin ();
112- ImageDirectionType direction_d = baselineImage->GetDirection ();
113- ImageSpacingType spacing_d = baselineImage->GetSpacing ();
114- // Image info validation
115- bool result = false ; // test result default = no failure
116- for (unsigned int i = 0 ; i < Dimension; ++i)
117- {
118- result = (result || Validate (origin[i], origin_d[i], tol));
119- result = (result || Validate (spacing[i], spacing_d[i], tol));
120- for (unsigned int j = 0 ; j < Dimension; ++j)
121- {
122- result = (result || Validate (direction (i, j), direction_d (i, j), tol));
123- }
124- }
125-
126- // Voxel contents validation
127- ImageConstIterator it1 (outputImage, outputImage->GetRequestedRegion ());
128- ImageConstIterator it2 (baselineImage, baselineImage->GetRequestedRegion ());
129- it1.GoToBegin ();
130- it2.GoToBegin ();
131- while (!it1.IsAtEnd ())
132- {
133- result = (result || Validate (it1.Get (), it2.Get (), tol));
134- ++it1;
135- ++it2;
136- }
137-
138- ITK_TRY_EXPECT_NO_EXCEPTION (itk::WriteImage (outputImage, argv[3 ]));
144+ // Now do comparisons
145+ bool result = imagesDifferent<ImageType>(baselineImage, outputImage);
146+ transform->ApplyToImageMetadata (inputImage);
147+ result = (result || imagesDifferent<ImageType>(baselineImage, inputImage));
148+
149+ // Make sure we can invoke ApplyToImageMetadata via const/raw pointer
150+ TransformType * rawPointerTransform = transform.GetPointer ();
151+ rawPointerTransform->ApplyToImageMetadata (inputImage);
152+ rawPointerTransform->ApplyToImageMetadata (inputImage.GetPointer ());
153+ const TransformType * constRawPointerTransform = transform.GetPointer ();
154+ constRawPointerTransform->ApplyToImageMetadata (inputImage);
155+ TransformType::ConstPointer constPointerTransform = transform.GetPointer ();
156+ constPointerTransform->ApplyToImageMetadata (inputImage);
157+ constPointerTransform->ApplyToImageMetadata (inputImage.GetPointer ());
139158
140159 return result;
141160}
0 commit comments