# Using SplitComponentsImageFilter to split by dimension

**URL:** <https://discourse.itk.org/t/using-splitcomponentsimagefilter-to-split-by-dimension/6603>\
**Category:** Engineering\
**Tags:** itk\
**Created:** [April 29, 2024, 3:05pm UTC](https://discourse.itk.org/t/using-splitcomponentsimagefilter-to-split-by-dimension/6603 "2024-04-29T15:05:37Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![cpinter](https://discourse.itk.org/user_avatar/discourse.itk.org/cpinter/32/3683_2.png) [@cpinter](https://discourse.itk.org/u/cpinter)\
**Post date:** [April 29, 2024, 3:05pm UTC](https://discourse.itk.org/t/using-splitcomponentsimagefilter-to-split-by-dimension/6603/1 "2024-04-29T15:05:37Z")

</div>

Hi all,

I’m trying to use the `SplitComponentsImageFilter` class to split a 5D image (component + 3D spatial + time) by time, and I’m getting a compilation error when I try to build a very simple test.

For context, this is related to this work (adding sequence of 3D + component image IO support to 3D Slicer):

> [@Reading and writing of 5D images - a dimension disappears](https://discourse.itk.org/t/reading-and-writing-of-5d-images-a-dimension-disappears/6210):
>
> Hi all, We’re trying to enable 3D Slicer to read and write vector image sequences (displacement field or velocity field: 3D spatial + component + time = 5 dimensions) into a single file. The format of choice is NRRD, and we thought the most correct way would be to use ITK’s NrrdImageIO (the alternative would be to improve vtkTeemNRRDWriter/Reader, but ITK is a much more core dependency than teem). I started testing the IO with a valid-looking 5D nrrd file that I created using pynrrd. The heade…

The code that compiles (based on [this test](https://github.com/thewtex/ITKSplitComponents/blob/master/test/itkSplitComponentsImageFilterTest.cxx)):

```auto
  constexpr unsigned int Dimension = 4;
  using PixelType = signed short;
  using FrameImageType = itk::Image<PixelType, Dimension>;
  using VectorType = itk::Vector<PixelType, Dimension>;
  using ImageType = itk::Image<VectorType, Dimension>;

  using SplitComponentsFilterType = itk::SplitComponentsImageFilter<ImageType, FrameImageType>;
  SplitComponentsFilterType::Pointer splitComponentsFilter = SplitComponentsFilterType::New();

```

The code that I’d need for my use case:

```auto
  constexpr unsigned int Dimension = 4;
  using PixelType = itk::RGBAPixel<unsigned short>;
  using ImageType = itk::Image< PixelType, Dimension >;
  using FrameImageType = itk::Image< PixelType, Dimension-1 >;

  using SplitComponentsFilterType = itk::SplitComponentsImageFilter<ImageType, FrameImageType>;
  SplitComponentsFilterType::Pointer splitComponentsFilter = SplitComponentsFilterType::New();

```

When building this latter (VS2022), I get this error:

```auto
7>C:\d\S5D\ITK\Modules\Remote\SplitComponents\include\itkSplitComponentsImageFilter.hxx(82,48): error C2665: 'slicer_itk::ImageRegionConstIterator<slicer_itk::Image<PixelType,4>>::ImageRegionConstIterator': no overloaded function could convert all the argument types
7>C:\d\S5D\ITK\Modules\Core\Common\include\itkImageRegionConstIterator.h(151,3): message : could be 'slicer_itk::ImageRegionConstIterator<slicer_itk::Image<PixelType,4>>::ImageRegionConstIterator(const TImage *,const slicer_itk::ImageRegion<4> &)'
7> with
7> [
7> TImage=slicer_itk::Image<PixelType,4>
7> ]
7>C:\d\S5D\ITK\Modules\Remote\SplitComponents\include\itkSplitComponentsImageFilter.hxx(82,48): message : 'slicer_itk::ImageRegionConstIterator<slicer_itk::Image<PixelType,4>>::ImageRegionConstIterator(const TImage *,const slicer_itk::ImageRegion<4> &)': cannot convert argument 2 from 'const slicer_itk::ImageRegion<3>' to 'const slicer_itk::ImageRegion<4> &'
7> with
7> [
7> TImage=slicer_itk::Image<PixelType,4>
7> ]
7>C:\d\S5D\ITK\Modules\Remote\SplitComponents\include\itkSplitComponentsImageFilter.hxx(82,56): message : Reason: cannot convert from 'const slicer_itk::ImageRegion<3>' to 'const slicer_itk::ImageRegion<4>'
7>C:\d\S5D\ITK\Modules\Remote\SplitComponents\include\itkSplitComponentsImageFilter.hxx(82,56): message : No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
7>C:\d\S5D\ITK\Modules\Remote\SplitComponents\include\itkSplitComponentsImageFilter.hxx(82,48): message : while trying to match the argument list '(slicer_itk::SmartPointer<const slicer_itk::Image<PixelType,4>>, const slicer_itk::ImageRegion<3>)'
7>C:\d\S5D\ITK\Modules\Remote\SplitComponents\include\itkSplitComponentsImageFilter.hxx(76,1): message : while compiling class template member function 'void slicer_itk::SplitComponentsImageFilter<ImageType,FrameImageType,4>::DynamicThreadedGenerateData(const slicer_itk::ImageRegion<3> &)'
7>C:\d\Slicer\Libs\vtkITK\vtkITKImageSequenceReader.cxx(195,38): message : see reference to class template instantiation 'slicer_itk::SplitComponentsImageFilter<ImageType,FrameImageType,4>' being compiled

```

The line in question is this:

> <https://github.com/InsightSoftwareConsortium/ITKSplitComponents/blob/master/include/itkSplitComponentsImageFilter.hxx#L82>

My quesion is whether this class is designed to be able to be used for such splitting, and if not, what should I use instead? Thank you!

---

<div class="post-metadata">

**Author:** ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)\
**Post date:** [April 29, 2024, 4:02pm UTC](https://discourse.itk.org/t/using-splitcomponentsimagefilter-to-split-by-dimension/6603/2 "2024-04-29T16:02:11Z")

</div>

Split components is only meant for `VectorImage` and `Image<Vector>`. For what you want to do, I think that [ExtractImageFilter](https://itk.org/Doxygen/html/classitk_1_1ExtractImageFilter.html) is the answer.

---

<div class="post-metadata">

**Author:** ![cpinter](https://discourse.itk.org/user_avatar/discourse.itk.org/cpinter/32/3683_2.png) [@cpinter](https://discourse.itk.org/u/cpinter)\
**Post date:** [May 27, 2024, 9:17am UTC](https://discourse.itk.org/t/using-splitcomponentsimagefilter-to-split-by-dimension/6603/3 "2024-05-27T09:17:04Z")

</div>

Sorry it just took a while until I got the whole code working. Just want to confirm that the ExtractImageFilter indeed does what I want. Thank you for the super quick help!
