diff --git a/Modules/Filtering/ImageGrid/include/itkWarpImageFilter.h b/Modules/Filtering/ImageGrid/include/itkWarpImageFilter.h index 44558f581e7..86c626b8bb5 100644 --- a/Modules/Filtering/ImageGrid/include/itkWarpImageFilter.h +++ b/Modules/Filtering/ImageGrid/include/itkWarpImageFilter.h @@ -240,7 +240,7 @@ class WarpImageFilter: itkConceptMacro( SameDimensionCheck2, ( Concept::SameDimension< ImageDimension, DisplacementFieldDimension > ) ); itkConceptMacro( InputHasNumericTraitsCheck, - ( Concept::HasNumericTraits< typename TInputImage::PixelType > ) ); + ( Concept::HasNumericTraits< typename TInputImage::InternalPixelType > ) ); itkConceptMacro( DisplacementFieldHasNumericTraitsCheck, ( Concept::HasNumericTraits< typename TDisplacementField::PixelType::ValueType > ) ); // End concept checking diff --git a/Modules/Filtering/ImageGrid/include/itkWarpImageFilter.hxx b/Modules/Filtering/ImageGrid/include/itkWarpImageFilter.hxx index a9a72a258b9..cae18eb0d4c 100644 --- a/Modules/Filtering/ImageGrid/include/itkWarpImageFilter.hxx +++ b/Modules/Filtering/ImageGrid/include/itkWarpImageFilter.hxx @@ -43,7 +43,7 @@ WarpImageFilter< TInputImage, TOutputImage, TDisplacementField > m_OutputOrigin.Fill(0.0); m_OutputDirection.SetIdentity(); m_OutputSize.Fill(0); - m_EdgePaddingValue = NumericTraits< PixelType >::ZeroValue(); + m_EdgePaddingValue = NumericTraits< typename OutputImageType::InternalPixelType >::ZeroValue(); m_OutputStartIndex.Fill(0); // Setup default interpolator typename DefaultInterpolatorType::Pointer interp = @@ -179,6 +179,16 @@ WarpImageFilter< TInputImage, TOutputImage, TDisplacementField > } DisplacementFieldPointer fieldPtr = this->GetDisplacementField(); + + if (NumericTraits::GetLength(m_EdgePaddingValue) + != this->GetInput()->GetNumberOfComponentsPerPixel() ) + { + // Assume EdgePaddingValue has not been set externally + // initialize it here with ZeroValue, when we know the number of components + const PixelType& pixel = this->GetInput()->GetPixel( this->GetInput()->GetBufferedRegion().GetIndex() ); + m_EdgePaddingValue = NumericTraits::ZeroValue( pixel ); + } + // Connect input image to interpolator m_Interpolator->SetInputImage( this->GetInput() ); @@ -292,7 +302,7 @@ WarpImageFilter< TInputImage, TOutputImage, TDisplacementField > { const DisplacementType input = fieldPtr->GetPixel(neighIndex); - for ( unsigned int k = 0; k < ImageDimension; k++ ) + for ( unsigned int k = 0; k < NumericTraits::GetLength(input); k++ ) { output[k] += overlap * static_cast< double >( input[k] ); } diff --git a/Modules/Filtering/ImageGrid/test/itkWarpImageFilterTest.cxx b/Modules/Filtering/ImageGrid/test/itkWarpImageFilterTest.cxx index 117cb8a1df0..d7f91c26334 100644 --- a/Modules/Filtering/ImageGrid/test/itkWarpImageFilterTest.cxx +++ b/Modules/Filtering/ImageGrid/test/itkWarpImageFilterTest.cxx @@ -22,6 +22,7 @@ #include "itkWarpImageFilter.h" #include "itkVectorCastImageFilter.h" #include "itkStreamingImageFilter.h" +#include "itkVectorImage.h" #include "itkMath.h" // class to produce a linear image pattern @@ -97,8 +98,8 @@ int itkWarpImageFilterTest(int, char* [] ) typedef float PixelType; enum { ImageDimension = 2 }; typedef itk::Image ImageType; - - typedef itk::Vector VectorType; + typedef itk::VectorImage VectorImageType; + typedef itk::Vector VectorType; typedef itk::Image FieldType; bool testPassed = true; @@ -169,7 +170,13 @@ int itkWarpImageFilterTest(int, char* [] ) } //============================================================= + std::cout << "Instanciate WarpImageFilter with VectorImage."; + std::cout << std::endl; + typedef itk::WarpImageFilter WarpVectorImageFilterType; + WarpVectorImageFilterType::Pointer warpVectorImageFilter = WarpVectorImageFilterType::New(); + + //============================================================= std::cout << "Run WarpImageFilter in standalone mode with progress."; std::cout << std::endl; typedef itk::WarpImageFilter WarperType;