a b/src/sliceImage.cxx
1
2
#include <nanobind/nanobind.h>
3
#include <nanobind/stl/vector.h>
4
#include <nanobind/stl/string.h>
5
#include <nanobind/stl/tuple.h>
6
#include <nanobind/ndarray.h>
7
8
#include "itkImage.h"
9
#include "itkExtractImageFilter.h"
10
11
#include "antsImage.h"
12
13
namespace nb = nanobind;
14
using namespace nb::literals;
15
16
template < typename ImageType, typename SliceImageType>
17
AntsImage<SliceImageType> sliceImage( AntsImage<ImageType> & antsImage, int plane, int slice, int collapseStrategy)
18
{
19
    typename ImageType::Pointer itkImage = antsImage.ptr;
20
21
    typedef itk::ExtractImageFilter< ImageType, SliceImageType > FilterType;
22
    typename FilterType::Pointer filter = FilterType::New();
23
24
    typename ImageType::RegionType inputRegion = itkImage->GetLargestPossibleRegion();
25
    typename ImageType::SizeType size = inputRegion.GetSize();
26
    size[plane] = 0;
27
28
    typename ImageType::IndexType start = inputRegion.GetIndex();
29
    const unsigned int sliceNumber = slice;
30
    start[plane] = sliceNumber;
31
32
    typename ImageType::RegionType desiredRegion;
33
    desiredRegion.SetSize( size );
34
    desiredRegion.SetIndex( start );
35
36
    filter->SetExtractionRegion( desiredRegion );
37
    filter->SetInput( itkImage );
38
    if( collapseStrategy == 0 )
39
      { 
40
      filter->SetDirectionCollapseToSubmatrix();
41
      } 
42
    else if( collapseStrategy == 1 )
43
      {
44
      filter->SetDirectionCollapseToIdentity();
45
      } 
46
    else // if( collapseStrategy == 2 ) 
47
      {
48
      filter->SetDirectionCollapseToGuess();
49
      } 
50
  
51
    filter->Update();
52
53
    AntsImage<SliceImageType> myImage = { filter->GetOutput() };
54
    return myImage;
55
56
}
57
58
void local_sliceImage(nb::module_ &m) 
59
{
60
    m.def("sliceImage", &sliceImage<itk::Image<float,3>, itk::Image<float,2>>);
61
    m.def("sliceImage", &sliceImage<itk::Image<float,4>, itk::Image<float,3>>);
62
}