|
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 |
} |