a b/src/readImage.cxx
1
#include <nanobind/nanobind.h>
2
#include <nanobind/stl/vector.h>
3
#include <nanobind/stl/string.h>
4
#include <nanobind/stl/tuple.h>
5
#include <nanobind/ndarray.h>
6
7
#include <tuple>
8
#include "itkImageFileWriter.h"
9
#include "itkImageIOBase.h"
10
#include "itkNiftiImageIOFactory.h"
11
#include "itkMetaImageIOFactory.h"
12
#include "itkImageFileReader.h"
13
#include "itkImage.h"
14
#include "itkPyBuffer.h"
15
16
#include "readImage.h"
17
#include "antsImage.h"
18
19
20
namespace nb = nanobind;
21
using namespace nb::literals;
22
23
24
template <typename ImageType>
25
AntsImage<ImageType> imageRead( std::string filename )
26
{
27
    typedef typename ImageType::Pointer           ImagePointerType;
28
    typedef itk::ImageFileReader< ImageType >     ImageReaderType;
29
30
    typename ImageReaderType::Pointer image_reader = ImageReaderType::New() ;
31
    image_reader->SetFileName( filename.c_str() ) ;
32
    image_reader->Update();
33
34
    ImagePointerType itkImage = image_reader->GetOutput();
35
    AntsImage<ImageType> myImage = { itkImage };
36
    return myImage;
37
}
38
39
/**
40
 * Create an ANTsImage from a numpy array
41
 *
42
 * The data array must be C-contiguous, and ordered correctly
43
 * See "4.1.7 Importing Image Data from a Buffer"
44
 * https://itk.org/ITKSoftwareGuide/html/Book1/ITKSoftwareGuide-Book1ch4.html
45
 */
46
template <typename ImageType>
47
AntsImage<ImageType> fromNumpy( nb::ndarray<nb::numpy> data, nb::tuple datashape )
48
{
49
    typedef typename ImageType::Pointer ImagePointerType;
50
    ImagePointerType antsImage = ImageType::New();
51
    typedef itk::PyBuffer<ImageType> PyBufferType;
52
53
    nb::object o = nb::cast(data);
54
    antsImage = PyBufferType::_GetImageViewFromArray(o.ptr(), datashape.ptr(), nb::make_tuple(1)[0].ptr());
55
56
    AntsImage<ImageType> myImage = { antsImage };
57
    return myImage;
58
}
59
60
61
void local_readImage(nb::module_ &m) {
62
63
    m.def("imageReadUC2", &imageRead<itk::Image<unsigned char,2>>);
64
    m.def("imageReadUC3", &imageRead<itk::Image<unsigned char,3>>);
65
    m.def("imageReadUC4", &imageRead<itk::Image<unsigned char,4>>);
66
    m.def("imageReadUI2", &imageRead<itk::Image<unsigned int,2>>);
67
    m.def("imageReadUI3", &imageRead<itk::Image<unsigned int,3>>);
68
    m.def("imageReadUI4", &imageRead<itk::Image<unsigned int,4>>);
69
    m.def("imageReadF2", &imageRead<itk::Image<float,2>>);
70
    m.def("imageReadF3", &imageRead<itk::Image<float,3>>);
71
    m.def("imageReadF4", &imageRead<itk::Image<float,4>>);
72
    m.def("imageReadD2", &imageRead<itk::Image<double,2>>);
73
    m.def("imageReadD3", &imageRead<itk::Image<double,3>>);
74
    m.def("imageReadD4", &imageRead<itk::Image<double,4>>);
75
    m.def("imageReadVUC2", &imageRead<itk::VectorImage<unsigned char,2>>);
76
    m.def("imageReadVUC3", &imageRead<itk::VectorImage<unsigned char,3>>);
77
    m.def("imageReadVUC4", &imageRead<itk::VectorImage<unsigned char,4>>);
78
    m.def("imageReadVUI2", &imageRead<itk::VectorImage<unsigned int,2>>);
79
    m.def("imageReadVUI3", &imageRead<itk::VectorImage<unsigned int,3>>);
80
    m.def("imageReadVUI4", &imageRead<itk::VectorImage<unsigned int,4>>);
81
    m.def("imageReadVF2", &imageRead<itk::VectorImage<float,2>>);
82
    m.def("imageReadVF3", &imageRead<itk::VectorImage<float,3>>);
83
    m.def("imageReadVF4", &imageRead<itk::VectorImage<float,4>>);
84
    m.def("imageReadVD2", &imageRead<itk::VectorImage<double,2>>);
85
    m.def("imageReadVD3", &imageRead<itk::VectorImage<double,3>>);
86
    m.def("imageReadVD4", &imageRead<itk::VectorImage<double,4>>);
87
    m.def("imageReadRGBUC2", &imageRead<itk::Image<itk::RGBPixel<unsigned char>,2>>);
88
    m.def("imageReadRGBUC3", &imageRead<itk::Image<itk::RGBPixel<unsigned char>,3>>);
89
    m.def("imageReadRGBF2", &imageRead<itk::Image<itk::RGBPixel<float>,2>>);
90
    m.def("imageReadRGBF3", &imageRead<itk::Image<itk::RGBPixel<float>,3>>);
91
92
93
    m.def("fromNumpyUC2", &fromNumpy<itk::Image<unsigned char,2>>);
94
    m.def("fromNumpyUC3", &fromNumpy<itk::Image<unsigned char,3>>);
95
    m.def("fromNumpyUC4", &fromNumpy<itk::Image<unsigned char,4>>);
96
    m.def("fromNumpyUI2", &fromNumpy<itk::Image<unsigned int,2>>);
97
    m.def("fromNumpyUI3", &fromNumpy<itk::Image<unsigned int,3>>);
98
    m.def("fromNumpyUI4", &fromNumpy<itk::Image<unsigned int,4>>);
99
    m.def("fromNumpyF2", &fromNumpy<itk::Image<float,2>>);
100
    m.def("fromNumpyF3", &fromNumpy<itk::Image<float,3>>);
101
    m.def("fromNumpyF4", &fromNumpy<itk::Image<float,4>>);
102
    m.def("fromNumpyD2", &fromNumpy<itk::Image<double,2>>);
103
    m.def("fromNumpyD3", &fromNumpy<itk::Image<double,3>>);
104
    m.def("fromNumpyD4", &fromNumpy<itk::Image<double,4>>);
105
}