diff --git a/Modules/Core/Common/wrapping/itkImageToImageFilterA.wrap b/Modules/Core/Common/wrapping/itkImageToImageFilterA.wrap index 3ad5895b903..08c3cf36bbe 100644 --- a/Modules/Core/Common/wrapping/itkImageToImageFilterA.wrap +++ b/Modules/Core/Common/wrapping/itkImageToImageFilterA.wrap @@ -15,6 +15,54 @@ itk_wrap_class("itk::ImageToImageFilter" POINTER) # Vector types itk_wrap_image_filter_combinations("${WRAP_ITK_VECTOR}" "${WRAP_ITK_VECTOR}") + foreach(image_dim ${ITK_WRAP_IMAGE_DIMS}) + if(ITK_WRAP_vector_float AND ITK_WRAP_vector_double) + if(ITKM_VIF${image_dim} AND ITKM_VID${image_dim} AND ITKT_VIF${image_dim} AND ITKT_VID${image_dim}) + # VectorImage(float) <-> VectorImage(double) + itk_wrap_template("${ITKM_VIF${image_dim}}${ITKM_VID${image_dim}}" "${ITKT_VIF${image_dim}},${ITKT_VID${image_dim}}") + itk_wrap_template("${ITKM_VID${image_dim}}${ITKM_VIF${image_dim}}" "${ITKT_VID${image_dim}},${ITKT_VIF${image_dim}}") + endif() + foreach(pixel_type "${WRAP_ITK_RGB};${WRAP_ITK_RGBA}") + if(ITKM_VIF${image_dim} AND ITKM_I${ITKM_${pixel_type}}${image_dim} AND ITKT_VIF${image_dim} AND ITKT_I${ITKM_${pixel_type}}${image_dim}) + # VectorImage(float) <-> (RGBPixel, RGBAPixel) + itk_wrap_template("${ITKM_VIF${image_dim}}${ITKM_I${ITKM_${pixel_type}}${image_dim}}" "${ITKT_VIF${image_dim}},${ITKT_I${ITKM_${pixel_type}}${image_dim}}") + itk_wrap_template("${ITKM_I${ITKM_${pixel_type}}${image_dim}}${ITKM_VIF${image_dim}}" "${ITKT_I${ITKM_${pixel_type}}${image_dim}},${ITKT_VIF${image_dim}}") + endif() + if(ITKM_VID${image_dim} AND ITKM_I${ITKM_${pixel_type}}${image_dim} AND ITKT_VID${image_dim} AND ITKT_I${ITKM_${pixel_type}}${image_dim}) + # VectorImage(double) <-> (RGBPixel, RGBAPixel) + itk_wrap_template("${ITKM_VID${image_dim}}${ITKM_I${ITKM_${pixel_type}}${image_dim}}" "${ITKT_VID${image_dim}},${ITKT_I${ITKM_${pixel_type}}${image_dim}}") + itk_wrap_template("${ITKM_I${ITKM_${pixel_type}}${image_dim}}${ITKM_VID${image_dim}}" "${ITKT_I${ITKM_${pixel_type}}${image_dim}},${ITKT_VID${image_dim}}") + endif() + endforeach() + endif() + foreach(vector_components ${ITK_WRAP_VECTOR_COMPONENTS}) + if(ITK_WRAP_vector_float) + if(ITKM_IVF${vector_components}${image_dim} AND ITKM_VIF${image_dim} AND ITKT_IVF${vector_components}${image_dim} AND ITKT_VIF${image_dim}) + # VectorImage(float) <-> Vector(float) + itk_wrap_template("${ITKM_IVF${vector_components}${image_dim}}${ITKM_VIF${image_dim}}" "${ITKT_IVF${vector_components}${image_dim}},${ITKT_VIF${image_dim}}") + itk_wrap_template("${ITKM_VIF${image_dim}}${ITKM_IVF${vector_components}${image_dim}}" "${ITKT_VIF${image_dim}},${ITKT_IVF${vector_components}${image_dim}}") + endif() + if(ITKM_ICVF${vector_components}${image_dim} AND ITKM_VIF${image_dim} AND ITKT_ICVF${vector_components}${image_dim} AND ITKT_VIF${image_dim}) + # VectorImage(float) <-> CovariantVector(float) + itk_wrap_template("${ITKM_ICVF${vector_components}${image_dim}}${ITKM_VIF${image_dim}}" "${ITKT_ICVF${vector_components}${image_dim}},${ITKT_VIF${image_dim}}") + itk_wrap_template("${ITKM_VIF${image_dim}}${ITKM_ICVF${vector_components}${image_dim}}" "${ITKT_VIF${image_dim}},${ITKT_ICVF${vector_components}${image_dim}}") + endif() + endif() + if(ITK_WRAP_vector_double) + if(ITKM_IVD${vector_components}${image_dim} AND ITKM_VID${image_dim} AND ITKT_IVD${vector_components}${image_dim} AND ITKT_VID${image_dim}) + # VectorImage(double) <-> Vector(double) + itk_wrap_template("${ITKM_VID${image_dim}}${ITKM_IVD${vector_components}${image_dim}}" "${ITKT_VID${image_dim}},${ITKT_IVD${vector_components}${image_dim}}") + itk_wrap_template("${ITKM_IVD${vector_components}${image_dim}}${ITKM_VID${image_dim}}" "${ITKT_IVD${vector_components}${image_dim}},${ITKT_VID${image_dim}}") + endif() + if(ITKM_ICVD${vector_components}${image_dim} AND ITKM_VID${image_dim} AND ITKT_ICVD${vector_components}${image_dim} AND ITKT_VID${image_dim}) + # VectorImage(double) <-> CovariantVector(double) + itk_wrap_template("${ITKM_VID${image_dim}}${ITKM_ICVD${vector_components}${image_dim}}" "${ITKT_VID${image_dim}},${ITKT_ICVD${vector_components}${image_dim}}") + itk_wrap_template("${ITKM_ICVD${vector_components}${image_dim}}${ITKM_VID${image_dim}}" "${ITKT_ICVD${vector_components}${image_dim}},${ITKT_VID${image_dim}}") + endif() + endif() + endforeach() + 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 2c5dbf73973..7b55a566867 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 b63d2837b0c..3f4841759cf 100644 --- a/Modules/Filtering/ImageFilterBase/wrapping/itkCastImageFilter.wrap +++ b/Modules/Filtering/ImageFilterBase/wrapping/itkCastImageFilter.wrap @@ -8,6 +8,54 @@ itk_wrap_class("itk::CastImageFilter" POINTER_WITH_SUPERCLASS) # vector <-> vector itk_wrap_image_filter_combinations("${WRAP_ITK_VECTOR}" "${WRAP_ITK_VECTOR}") + foreach(image_dim ${ITK_WRAP_IMAGE_DIMS}) + if(ITK_WRAP_vector_float AND ITK_WRAP_vector_double) + if(ITKM_VIF${image_dim} AND ITKM_VID${image_dim} AND ITKT_VIF${image_dim} AND ITKT_VID${image_dim}) + # VectorImage(float) <-> VectorImage(double) + itk_wrap_template("${ITKM_VIF${image_dim}}${ITKM_VID${image_dim}}" "${ITKT_VIF${image_dim}},${ITKT_VID${image_dim}}") + itk_wrap_template("${ITKM_VID${image_dim}}${ITKM_VIF${image_dim}}" "${ITKT_VID${image_dim}},${ITKT_VIF${image_dim}}") + endif() + foreach(pixel_type "${WRAP_ITK_RGB};${WRAP_ITK_RGBA}") + if(ITKM_VIF${image_dim} AND ITKM_I${ITKM_${pixel_type}}${image_dim} AND ITKT_VIF${image_dim} AND ITKT_I${ITKM_${pixel_type}}${image_dim}) + # VectorImage(float) <-> (RGBPixel, RGBAPixel) + itk_wrap_template("${ITKM_VIF${image_dim}}${ITKM_I${ITKM_${pixel_type}}${image_dim}}" "${ITKT_VIF${image_dim}},${ITKT_I${ITKM_${pixel_type}}${image_dim}}") + itk_wrap_template("${ITKM_I${ITKM_${pixel_type}}${image_dim}}${ITKM_VIF${image_dim}}" "${ITKT_I${ITKM_${pixel_type}}${image_dim}},${ITKT_VIF${image_dim}}") + endif() + if(ITKM_VID${image_dim} AND ITKM_I${ITKM_${pixel_type}}${image_dim} AND ITKT_VID${image_dim} AND ITKT_I${ITKM_${pixel_type}}${image_dim}) + # VectorImage(double) <-> (RGBPixel, RGBAPixel) + itk_wrap_template("${ITKM_VID${image_dim}}${ITKM_I${ITKM_${pixel_type}}${image_dim}}" "${ITKT_VID${image_dim}},${ITKT_I${ITKM_${pixel_type}}${image_dim}}") + itk_wrap_template("${ITKM_I${ITKM_${pixel_type}}${image_dim}}${ITKM_VID${image_dim}}" "${ITKT_I${ITKM_${pixel_type}}${image_dim}},${ITKT_VID${image_dim}}") + endif() + endforeach() + endif() + foreach(vector_components ${ITK_WRAP_VECTOR_COMPONENTS}) + if(ITK_WRAP_vector_float) + if(ITKM_IVF${vector_components}${image_dim} AND ITKM_VIF${image_dim} AND ITKT_IVF${vector_components}${image_dim} AND ITKT_VIF${image_dim}) + # VectorImage(float) <-> Vector(float) + itk_wrap_template("${ITKM_IVF${vector_components}${image_dim}}${ITKM_VIF${image_dim}}" "${ITKT_IVF${vector_components}${image_dim}},${ITKT_VIF${image_dim}}") + itk_wrap_template("${ITKM_VIF${image_dim}}${ITKM_IVF${vector_components}${image_dim}}" "${ITKT_VIF${image_dim}},${ITKT_IVF${vector_components}${image_dim}}") + endif() + if(ITKM_ICVF${vector_components}${image_dim} AND ITKM_VIF${image_dim} AND ITKT_ICVF${vector_components}${image_dim} AND ITKT_VIF${image_dim}) + # VectorImage(float) <-> CovariantVector(float) + itk_wrap_template("${ITKM_ICVF${vector_components}${image_dim}}${ITKM_VIF${image_dim}}" "${ITKT_ICVF${vector_components}${image_dim}},${ITKT_VIF${image_dim}}") + itk_wrap_template("${ITKM_VIF${image_dim}}${ITKM_ICVF${vector_components}${image_dim}}" "${ITKT_VIF${image_dim}},${ITKT_ICVF${vector_components}${image_dim}}") + endif() + endif() + if(ITK_WRAP_vector_double) + if(ITKM_IVD${vector_components}${image_dim} AND ITKM_VID${image_dim} AND ITKT_IVD${vector_components}${image_dim} AND ITKT_VID${image_dim}) + # VectorImage(double) <-> Vector(double) + itk_wrap_template("${ITKM_VID${image_dim}}${ITKM_IVD${vector_components}${image_dim}}" "${ITKT_VID${image_dim}},${ITKT_IVD${vector_components}${image_dim}}") + itk_wrap_template("${ITKM_IVD${vector_components}${image_dim}}${ITKM_VID${image_dim}}" "${ITKT_IVD${vector_components}${image_dim}},${ITKT_VID${image_dim}}") + endif() + if(ITKM_ICVD${vector_components}${image_dim} AND ITKM_VID${image_dim} AND ITKT_ICVD${vector_components}${image_dim} AND ITKT_VID${image_dim}) + # VectorImage(double) <-> CovariantVector(double) + itk_wrap_template("${ITKM_VID${image_dim}}${ITKM_ICVD${vector_components}${image_dim}}" "${ITKT_VID${image_dim}},${ITKT_ICVD${vector_components}${image_dim}}") + itk_wrap_template("${ITKM_ICVD${vector_components}${image_dim}}${ITKM_VID${image_dim}}" "${ITKT_ICVD${vector_components}${image_dim}},${ITKT_VID${image_dim}}") + endif() + endif() + endforeach() + 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 4cc7e2cb93d..4a51fcdf227 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() diff --git a/Modules/Segmentation/SuperPixel/wrapping/itkSLICImageFilter.wrap b/Modules/Segmentation/SuperPixel/wrapping/itkSLICImageFilter.wrap index ddb1c2e08b0..131f1bda4f9 100644 --- a/Modules/Segmentation/SuperPixel/wrapping/itkSLICImageFilter.wrap +++ b/Modules/Segmentation/SuperPixel/wrapping/itkSLICImageFilter.wrap @@ -8,11 +8,27 @@ itk_wrap_class("itk::SLICImageFilter" POINTER_WITH_SUPERCLASS) set(from_types "${WRAP_ITK_SCALAR}") - # VectorImages foreach(d ${ITK_WRAP_IMAGE_DIMS}) foreach(f ${from_types}) foreach(t ${to_types}) - itk_wrap_template("${ITKM_VI${f}${d}}${ITKM_I${t}${d}}" "${ITKT_VI${f}${d}},${ITKT_I${t}${d}}") + if(ITKM_VI${f}${d} AND ITKT_VI${f}${d}) + # VectorImage as input + itk_wrap_template("${ITKM_VI${f}${d}}${ITKM_I${t}${d}}" "${ITKT_VI${f}${d}},${ITKT_I${t}${d}}") + endif() + if(ITKM_I${ITKM_RGB${f}}${d} AND ITKT_I${ITKM_RGB${f}}${d}) + # Image of RGBPixel as input + itk_wrap_template("${ITKM_I${ITKM_RGB${f}}${d}}${ITKM_I${t}${d}}" "${ITKT_I${ITKM_RGB${f}}${d}},${ITKT_I${t}${d}}") + endif() + foreach(c ${ITK_WRAP_VECTOR_COMPONENTS}) + if(ITKM_I${ITKM_V${f}${c}}${d} AND ITKT_I${ITKM_V${f}${c}}${d}) + # Image of Vector as input + itk_wrap_template("${ITKM_I${ITKM_V${f}${c}}${d}}${ITKM_I${t}${d}}" "${ITKT_I${ITKM_V${f}${c}}${d}},${ITKT_I${t}${d}}") + endif() + if(ITKM_I${ITKM_CV${f}${c}}${d} AND ITKT_I${ITKM_CV${f}${c}}${d}) + # Image of CovariantVector as input + itk_wrap_template("${ITKM_I${ITKM_CV${f}${c}}${d}}${ITKM_I${t}${d}}" "${ITKT_I${ITKM_CV${f}${c}}${d}},${ITKT_I${t}${d}}") + endif() + endforeach() endforeach() endforeach() endforeach()