diff --git a/Modules/Core/Common/wrapping/itkImageToImageFilterA.wrap b/Modules/Core/Common/wrapping/itkImageToImageFilterA.wrap index 9964a5769c7..d9b02ffcdac 100644 --- a/Modules/Core/Common/wrapping/itkImageToImageFilterA.wrap +++ b/Modules/Core/Common/wrapping/itkImageToImageFilterA.wrap @@ -21,6 +21,16 @@ itk_wrap_class("itk::ImageToImageFilter" POINTER) # Vector types itk_wrap_image_filter_combinations("${WRAP_ITK_VECTOR}" "${WRAP_ITK_VECTOR}") + # VectorImage <-> vector + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + if(ITK_WRAP_vector_float) + itk_wrap_template("${ITKM_IVF${d}${d}}${ITKM_VIF${d}}" "${ITKT_IVF${d}${d}},${ITKT_VIF${d}}") + endif() + if(ITK_WRAP_vector_double) + itk_wrap_template("${ITKM_IVD${d}${d}}${ITKM_VID${d}}" "${ITKT_IVD${d}${d}},${ITKT_VID${d}}") + endif() + endforeach() + # For GradientRecursiveGaussianImageFilter we need some specific combinations foreach(image_dim ${ITK_WRAP_IMAGE_DIMS}) foreach(input_vector_dim ${ITK_WRAP_VECTOR_COMPONENTS}) diff --git a/Modules/Filtering/ImageFilterBase/include/itkCastImageFilter.hxx b/Modules/Filtering/ImageFilterBase/include/itkCastImageFilter.hxx index 7ed5e3d253b..21d34d41430 100644 --- a/Modules/Filtering/ImageFilterBase/include/itkCastImageFilter.hxx +++ b/Modules/Filtering/ImageFilterBase/include/itkCastImageFilter.hxx @@ -120,7 +120,6 @@ CastImageFilter::DynamicThreadedGenerateDataDispatche // Implementation for non-implicit convertible pixels which are // itk-array-like. - static_assert(OutputPixelType::Dimension == InputPixelType::Dimension, "Vector dimensions are required to match!"); static_assert(std::is_convertible::value, "Component types are required to be convertible."); @@ -140,6 +139,8 @@ CastImageFilter::DynamicThreadedGenerateDataDispatche this->CallCopyOutputRegionToInputRegion(inputRegionForThread, outputRegionForThread); + const unsigned int componentsPerPixel = outputPtr->GetNumberOfComponentsPerPixel(); + // Define the iterators ImageScanlineConstIterator inputIt(inputPtr, inputRegionForThread); ImageScanlineIterator outputIt(outputPtr, outputRegionForThread); @@ -152,7 +153,7 @@ CastImageFilter::DynamicThreadedGenerateDataDispatche { const InputPixelType & inputPixel = inputIt.Get(); OutputPixelType value; - for (unsigned int k = 0; k < OutputPixelType::Dimension; k++) + for (unsigned int k = 0; k < componentsPerPixel; k++) { value[k] = static_cast(inputPixel[k]); } diff --git a/Modules/Filtering/ImageFilterBase/wrapping/itkCastImageFilter.wrap b/Modules/Filtering/ImageFilterBase/wrapping/itkCastImageFilter.wrap index 753edfa0528..f05e437c4e3 100644 --- a/Modules/Filtering/ImageFilterBase/wrapping/itkCastImageFilter.wrap +++ b/Modules/Filtering/ImageFilterBase/wrapping/itkCastImageFilter.wrap @@ -7,6 +7,16 @@ itk_wrap_class("itk::CastImageFilter" POINTER_WITH_SUPERCLASS) # vector <-> vector itk_wrap_image_filter_combinations("${WRAP_ITK_VECTOR}" "${WRAP_ITK_VECTOR}") + # VectorImage <-> vector + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + if(ITK_WRAP_vector_float) + itk_wrap_template("${ITKM_IVF${d}${d}}${ITKM_VIF${d}}" "${ITKT_IVF${d}${d}},${ITKT_VIF${d}}") + endif() + if(ITK_WRAP_vector_double) + itk_wrap_template("${ITKM_IVD${d}${d}}${ITKM_VID${d}}" "${ITKT_IVD${d}${d}},${ITKT_VID${d}}") + endif() + endforeach() + # RGB <-> RGB UNIQUE(rgb "RGBUC;${WRAP_ITK_RGB}") itk_wrap_image_filter_combinations("${rgb}" "${rgb}") diff --git a/Modules/Filtering/ImageFilterBase/wrapping/test/CastImageFilterTest.py b/Modules/Filtering/ImageFilterBase/wrapping/test/CastImageFilterTest.py index 6a12b73065e..157c1e30ef2 100644 --- a/Modules/Filtering/ImageFilterBase/wrapping/test/CastImageFilterTest.py +++ b/Modules/Filtering/ImageFilterBase/wrapping/test/CastImageFilterTest.py @@ -25,11 +25,11 @@ itk.auto_progress(2) dim = 2 -IType = itk.Image[itk.F, dim] -OIType = itk.Image[itk.UC, dim] +InputImageType = itk.Image[itk.F, dim] +OutputImageType = itk.Image[itk.UC, dim] -reader = itk.ImageFileReader[IType].New(FileName=argv[1]) -filter = itk.CastImageFilter[IType, OIType].New(reader) -writer = itk.ImageFileWriter[OIType].New(filter, FileName=argv[2]) +reader = itk.ImageFileReader[InputImageType].New(FileName=argv[1]) +filt = itk.CastImageFilter[InputImageType, OutputImageType].New(reader) +writer = itk.ImageFileWriter[OutputImageType].New(filt, FileName=argv[2]) writer.Update()