diff --git a/Modules/Filtering/ImageFilterBase/include/itkCastImageFilter.hxx b/Modules/Filtering/ImageFilterBase/include/itkCastImageFilter.hxx index 7b55a566867..d6ce09c177c 100644 --- a/Modules/Filtering/ImageFilterBase/include/itkCastImageFilter.hxx +++ b/Modules/Filtering/ImageFilterBase/include/itkCastImageFilter.hxx @@ -147,12 +147,12 @@ CastImageFilter::DynamicThreadedGenerateDataDispatche inputIt.GoToBegin(); outputIt.GoToBegin(); + OutputPixelType value{ outputIt.Get() }; while (!inputIt.IsAtEnd()) { while (!inputIt.IsAtEndOfLine()) { const InputPixelType & inputPixel = inputIt.Get(); - OutputPixelType value; for (unsigned int k = 0; k < componentsPerPixel; k++) { value[k] = static_cast(inputPixel[k]); diff --git a/Modules/Filtering/ImageFilterBase/test/itkCastImageFilterTest.cxx b/Modules/Filtering/ImageFilterBase/test/itkCastImageFilterTest.cxx index 0c52ea5bdaa..ac81dc8f8e2 100644 --- a/Modules/Filtering/ImageFilterBase/test/itkCastImageFilterTest.cxx +++ b/Modules/Filtering/ImageFilterBase/test/itkCastImageFilterTest.cxx @@ -44,22 +44,32 @@ namespace itk // Compile time check -template class itk::CastImageFilter>, itk::Image>>; -template class itk::CastImageFilter>, itk::Image>>; -template class itk::CastImageFilter>, itk::Image>>; -template class itk::CastImageFilter>, itk::Image>>; - - -template class itk::CastImageFilter>, - itk::Image>>; -template class itk::CastImageFilter>, itk::Image>>; -template class itk::CastImageFilter>, itk::Image>>; -template class itk::CastImageFilter>, - itk::Image>>; -template class itk::CastImageFilter>, itk::Image>>; -template class itk::CastImageFilter>, itk::Image>>; - -template class itk::CastImageFilter, itk::VectorImage>; +template class itk::CastImageFilter, 2>, itk::Image, 2>>; +template class itk::CastImageFilter, 2>, itk::Image, 2>>; +template class itk::CastImageFilter, 2>, itk::Image, 2>>; +template class itk::CastImageFilter, 2>, itk::Image, 2>>; + +template class itk::CastImageFilter, 2>, + itk::Image, 2>>; +template class itk::CastImageFilter, 2>, itk::Image, 2>>; +template class itk::CastImageFilter, 2>, itk::Image, 2>>; +template class itk::CastImageFilter, 2>, + itk::Image, 2>>; +template class itk::CastImageFilter, 2>, + itk::Image, 2>>; +template class itk::CastImageFilter, 2>, itk::Image, 2>>; +template class itk::CastImageFilter, 2>, itk::Image, 2>>; +template class itk::CastImageFilter, 2>, + itk::Image, 2>>; +template class itk::CastImageFilter, 2>, itk::Image, 2>>; +template class itk::CastImageFilter, 2>, + itk::Image, 2>>; + +template class itk::CastImageFilter, itk::VectorImage>; +template class itk::CastImageFilter, itk::Image, 2>>; +template class itk::CastImageFilter, 2>, itk::VectorImage>; +template class itk::CastImageFilter, itk::Image, 2>>; +template class itk::CastImageFilter, 2>, itk::VectorImage>; template std::string @@ -262,13 +272,11 @@ TestCastFrom() } bool -TestVectorImageCast() +TestVectorImageCast1() { // This function casts a VectorImage // to a VectorImage - std::cout << "Casting from a VectorImage \ - to VectorImage ..." - << std::endl; + std::cout << "Casting from a VectorImage to VectorImage ... "; using UnsignedCharVectorImageType = itk::VectorImage; using FloatVectorImageType = itk::VectorImage; @@ -310,7 +318,74 @@ TestVectorImageCast() if (static_cast(originalImageIterator.Get()[0]) != castedImageIterator.Get()[0] || static_cast(originalImageIterator.Get()[1]) != castedImageIterator.Get()[1]) { - std::cerr << "Error in TestVectorImageCast!" << std::endl; + std::cerr << "Error in TestVectorImageCast1!" << std::endl; + success = false; + } + ++originalImageIterator; + ++castedImageIterator; + } + + if (success) + { + std::cout << "[PASSED]" << std::endl; + } + else + { + std::cout << "[FAILED]" << std::endl; + } + + return success; +} + + +bool +TestVectorImageCast2() +{ + // This function casts a VectorImage + // to a Image, 2> + std::cout << "Casting from a VectorImage to Image, 2> ... "; + + using UnsignedCharVectorImageType = itk::Image, 2>; + using FloatVectorImageType = itk::VectorImage; + + // Create a 1x3 image of 2D vectors + FloatVectorImageType::Pointer image = FloatVectorImageType::New(); + + const itk::Size<2> size{ { 1, 3 } }; + const itk::Index<2> start{ { 0, 0 } }; + + itk::ImageRegion<2> region(start, size); + image->SetNumberOfComponentsPerPixel(2); + image->SetRegions(region); + image->Allocate(); + itk::VariableLengthVector vec; + vec.SetSize(2); + // All pixels will be the vector (1.3, 5.3) + vec[0] = 1.3; + vec[1] = 5.3; + image->FillBuffer(vec); + + using CastImageFilterType = itk::CastImageFilter; + CastImageFilterType::Pointer castImageFilter = CastImageFilterType::New(); + castImageFilter->SetInput(image); + castImageFilter->Update(); + + // Setup iterators for the original and casted images + itk::ImageRegionConstIterator castedImageIterator( + castImageFilter->GetOutput(), castImageFilter->GetOutput()->GetLargestPossibleRegion()); + + itk::ImageRegionConstIterator originalImageIterator(image, image->GetLargestPossibleRegion()); + + // Compare both dimensions of all of the pixels from the manually + // casted original image to the corresponding pixels in the filter-casted + // image + bool success = true; + while (!originalImageIterator.IsAtEnd()) + { + if (static_cast(originalImageIterator.Get()[0]) != castedImageIterator.Get()[0] || + static_cast(originalImageIterator.Get()[1]) != castedImageIterator.Get()[1]) + { + std::cerr << "Error in TestVectorImageCast1!" << std::endl; success = false; } ++originalImageIterator; @@ -359,7 +434,8 @@ itkCastImageFilterTest(int, char *[]) success &= TestCastFrom(); success &= TestCastFrom(); success &= TestCastFrom(); - success &= TestVectorImageCast(); + success &= TestVectorImageCast1(); + success &= TestVectorImageCast2(); std::cout << std::endl; if (!success)