--- a +++ b/src/sliceImage.cxx @@ -0,0 +1,62 @@ + +#include <nanobind/nanobind.h> +#include <nanobind/stl/vector.h> +#include <nanobind/stl/string.h> +#include <nanobind/stl/tuple.h> +#include <nanobind/ndarray.h> + +#include "itkImage.h" +#include "itkExtractImageFilter.h" + +#include "antsImage.h" + +namespace nb = nanobind; +using namespace nb::literals; + +template < typename ImageType, typename SliceImageType> +AntsImage<SliceImageType> sliceImage( AntsImage<ImageType> & antsImage, int plane, int slice, int collapseStrategy) +{ + typename ImageType::Pointer itkImage = antsImage.ptr; + + typedef itk::ExtractImageFilter< ImageType, SliceImageType > FilterType; + typename FilterType::Pointer filter = FilterType::New(); + + typename ImageType::RegionType inputRegion = itkImage->GetLargestPossibleRegion(); + typename ImageType::SizeType size = inputRegion.GetSize(); + size[plane] = 0; + + typename ImageType::IndexType start = inputRegion.GetIndex(); + const unsigned int sliceNumber = slice; + start[plane] = sliceNumber; + + typename ImageType::RegionType desiredRegion; + desiredRegion.SetSize( size ); + desiredRegion.SetIndex( start ); + + filter->SetExtractionRegion( desiredRegion ); + filter->SetInput( itkImage ); + if( collapseStrategy == 0 ) + { + filter->SetDirectionCollapseToSubmatrix(); + } + else if( collapseStrategy == 1 ) + { + filter->SetDirectionCollapseToIdentity(); + } + else // if( collapseStrategy == 2 ) + { + filter->SetDirectionCollapseToGuess(); + } + + filter->Update(); + + AntsImage<SliceImageType> myImage = { filter->GetOutput() }; + return myImage; + +} + +void local_sliceImage(nb::module_ &m) +{ + m.def("sliceImage", &sliceImage<itk::Image<float,3>, itk::Image<float,2>>); + m.def("sliceImage", &sliceImage<itk::Image<float,4>, itk::Image<float,3>>); +}