--- a
+++ b/src/antsImage.cxx
@@ -0,0 +1,401 @@
+#include <nanobind/nanobind.h>
+#include <nanobind/stl/vector.h>
+#include <nanobind/stl/string.h>
+#include <nanobind/stl/tuple.h>
+#include <nanobind/stl/list.h>
+#include <nanobind/ndarray.h>
+#include <nanobind/stl/shared_ptr.h>
+
+#include <iostream>
+#include <fstream>
+#include <cstdio>
+#include "itkPyBuffer.h"
+#include "itkImageIOBase.h"
+#include "itkImage.h"
+#include "itkImageFileWriter.h"
+#include "itkImageIOBase.h"
+#include "itkNiftiImageIOFactory.h"
+#include "itkMetaImageIOFactory.h"
+#include "itkImageFileReader.h"
+#include "itkImage.h"
+#include <iostream>
+
+#include "antsImage.h"
+
+
+namespace nb = nanobind;
+using namespace nb::literals;
+
+template <typename ImageType>
+nb::object toNumpy( AntsImage<ImageType> & myPointer )
+{
+    typename ImageType::Pointer image = myPointer.ptr;
+    typedef itk::PyBuffer<ImageType> PyBufferType;
+    PyObject * itkArray = PyBufferType::_GetArrayViewFromImage( image );
+    nb::object itkArrayObject = nb::steal( itkArray );
+    return itkArrayObject;
+}
+
+
+std::string ptrstr2(void * c)
+{
+    std::stringstream ss;
+    ss << (void const *)c;
+    std::string s = ss.str();
+    return s;
+}
+
+
+/*
+The return value (const char * file) from this function should be able to go
+through the following code block without segfaulting. This is what ANTs uses
+to convert back to an itk image.
+
+void *             ptr;
+sscanf(file, "%p", (void **)&ptr);
+typename ImageType::Pointer newImage = *(static_cast<typename ImageType::Pointer *>(ptr));
+*/
+template <typename ImageType>
+std::string ptrstr(AntsImage<ImageType> & myPointer)
+{
+    typename ImageType::Pointer * itkImage = & myPointer.ptr;
+    std::stringstream ss;
+    ss << (void const *)itkImage;
+    std::string s = ss.str();
+    return s;
+}
+
+void local_antsImage(nb::module_ &m) {
+
+    m.def("ptrstr",  &ptrstr<itk::Image<unsigned char,2>>);
+    m.def("ptrstr",  &ptrstr<itk::Image<unsigned char,3>>);
+    m.def("ptrstr",  &ptrstr<itk::Image<unsigned char,4>>);
+    m.def("ptrstr",  &ptrstr<itk::Image<unsigned int,2>>);
+    m.def("ptrstr",  &ptrstr<itk::Image<unsigned int,3>>);
+    m.def("ptrstr",  &ptrstr<itk::Image<unsigned int,4>>);
+    m.def("ptrstr",   &ptrstr<itk::Image<float,2>>);
+    m.def("ptrstr",   &ptrstr<itk::Image<float,3>>);
+    m.def("ptrstr",   &ptrstr<itk::Image<float,4>>);
+    m.def("ptrstr",   &ptrstr<itk::Image<double,2>>);
+    m.def("ptrstr",   &ptrstr<itk::Image<double,3>>);
+    m.def("ptrstr",   &ptrstr<itk::Image<double,4>>);
+    m.def("ptrstr", &ptrstr<itk::VectorImage<unsigned char,2>>);
+    m.def("ptrstr", &ptrstr<itk::VectorImage<unsigned char,3>>);
+    m.def("ptrstr", &ptrstr<itk::VectorImage<unsigned char,4>>);
+    m.def("ptrstr", &ptrstr<itk::VectorImage<unsigned int,2>>);
+    m.def("ptrstr", &ptrstr<itk::VectorImage<unsigned int,3>>);
+    m.def("ptrstr", &ptrstr<itk::VectorImage<unsigned int,4>>);
+    m.def("ptrstr",  &ptrstr<itk::VectorImage<float,2>>);
+    m.def("ptrstr",  &ptrstr<itk::VectorImage<float,3>>);
+    m.def("ptrstr",  &ptrstr<itk::VectorImage<float,4>>);
+    m.def("ptrstr",  &ptrstr<itk::VectorImage<double,2>>);
+    m.def("ptrstr",  &ptrstr<itk::VectorImage<double,3>>);
+    m.def("ptrstr",  &ptrstr<itk::VectorImage<double,4>>);
+    m.def("ptrstr", &ptrstr<itk::Image<itk::RGBPixel<unsigned char>,2>>);
+    m.def("ptrstr", &ptrstr<itk::Image<itk::RGBPixel<unsigned char>,3>>);
+    m.def("ptrstr", &ptrstr<itk::Image<itk::RGBPixel<float>,2>>);
+    m.def("ptrstr", &ptrstr<itk::Image<itk::RGBPixel<float>,3>>);
+
+    m.def("getComponents", &getComponents<itk::VectorImage<unsigned char,2>>);
+    m.def("getComponents", &getComponents<itk::VectorImage<unsigned char,3>>);
+    m.def("getComponents", &getComponents<itk::VectorImage<unsigned char,4>>);
+    m.def("getComponents", &getComponents<itk::VectorImage<unsigned int,2>>);
+    m.def("getComponents", &getComponents<itk::VectorImage<unsigned int,3>>);
+    m.def("getComponents", &getComponents<itk::VectorImage<unsigned int,4>>);
+    m.def("getComponents",  &getComponents<itk::VectorImage<float,2>>);
+    m.def("getComponents",  &getComponents<itk::VectorImage<float,3>>);
+    m.def("getComponents",  &getComponents<itk::VectorImage<float,4>>);
+    m.def("getComponents",  &getComponents<itk::VectorImage<double,2>>);
+    m.def("getComponents",  &getComponents<itk::VectorImage<double,3>>);
+    m.def("getComponents",  &getComponents<itk::VectorImage<double,4>>);
+
+    m.def("getShape",  &getShape<itk::Image<unsigned char,2>>);
+    m.def("getShape",  &getShape<itk::Image<unsigned char,3>>);
+    m.def("getShape",  &getShape<itk::Image<unsigned char,4>>);
+    m.def("getShape",  &getShape<itk::Image<unsigned int,2>>);
+    m.def("getShape",  &getShape<itk::Image<unsigned int,3>>);
+    m.def("getShape",  &getShape<itk::Image<unsigned int,4>>);
+    m.def("getShape",   &getShape<itk::Image<float,2>>);
+    m.def("getShape",   &getShape<itk::Image<float,3>>);
+    m.def("getShape",   &getShape<itk::Image<float,4>>);
+    m.def("getShape",   &getShape<itk::Image<double,2>>);
+    m.def("getShape",   &getShape<itk::Image<double,3>>);
+    m.def("getShape",   &getShape<itk::Image<double,4>>);
+    m.def("getShape", &getShape<itk::VectorImage<unsigned char,2>>);
+    m.def("getShape", &getShape<itk::VectorImage<unsigned char,3>>);
+    m.def("getShape", &getShape<itk::VectorImage<unsigned char,4>>);
+    m.def("getShape", &getShape<itk::VectorImage<unsigned int,2>>);
+    m.def("getShape", &getShape<itk::VectorImage<unsigned int,3>>);
+    m.def("getShape", &getShape<itk::VectorImage<unsigned int,4>>);
+    m.def("getShape",  &getShape<itk::VectorImage<float,2>>);
+    m.def("getShape",  &getShape<itk::VectorImage<float,3>>);
+    m.def("getShape",  &getShape<itk::VectorImage<float,4>>);
+    m.def("getShape",  &getShape<itk::VectorImage<double,2>>);
+    m.def("getShape",  &getShape<itk::VectorImage<double,3>>);
+    m.def("getShape",  &getShape<itk::VectorImage<double,4>>);
+    m.def("getShape", &getShape<itk::Image<itk::RGBPixel<unsigned char>,2>>);
+    m.def("getShape", &getShape<itk::Image<itk::RGBPixel<unsigned char>,3>>);
+    m.def("getShape", &getShape<itk::Image<itk::RGBPixel<float>,2>>);
+    m.def("getShape", &getShape<itk::Image<itk::RGBPixel<float>,3>>);
+
+    m.def("getOrigin",  &getOrigin<itk::Image<unsigned char,2>>);
+    m.def("getOrigin",  &getOrigin<itk::Image<unsigned char,3>>);
+    m.def("getOrigin",  &getOrigin<itk::Image<unsigned char,4>>);
+    m.def("getOrigin",  &getOrigin<itk::Image<unsigned int,2>>);
+    m.def("getOrigin",  &getOrigin<itk::Image<unsigned int,3>>);
+    m.def("getOrigin",  &getOrigin<itk::Image<unsigned int,4>>);
+    m.def("getOrigin",   &getOrigin<itk::Image<float,2>>);
+    m.def("getOrigin",   &getOrigin<itk::Image<float,3>>);
+    m.def("getOrigin",   &getOrigin<itk::Image<float,4>>);
+    m.def("getOrigin",   &getOrigin<itk::Image<double,2>>);
+    m.def("getOrigin",   &getOrigin<itk::Image<double,3>>);
+    m.def("getOrigin",   &getOrigin<itk::Image<double,4>>);
+    m.def("getOrigin", &getOrigin<itk::VectorImage<unsigned char,2>>);
+    m.def("getOrigin", &getOrigin<itk::VectorImage<unsigned char,3>>);
+    m.def("getOrigin", &getOrigin<itk::VectorImage<unsigned char,4>>);
+    m.def("getOrigin", &getOrigin<itk::VectorImage<unsigned int,2>>);
+    m.def("getOrigin", &getOrigin<itk::VectorImage<unsigned int,3>>);
+    m.def("getOrigin", &getOrigin<itk::VectorImage<unsigned int,4>>);
+    m.def("getOrigin",  &getOrigin<itk::VectorImage<float,2>>);
+    m.def("getOrigin",  &getOrigin<itk::VectorImage<float,3>>);
+    m.def("getOrigin",  &getOrigin<itk::VectorImage<float,4>>);
+    m.def("getOrigin",  &getOrigin<itk::VectorImage<double,2>>);
+    m.def("getOrigin",  &getOrigin<itk::VectorImage<double,3>>);
+    m.def("getOrigin",  &getOrigin<itk::VectorImage<double,4>>);
+    m.def("getOrigin", &getOrigin<itk::Image<itk::RGBPixel<unsigned char>,2>>);
+    m.def("getOrigin", &getOrigin<itk::Image<itk::RGBPixel<unsigned char>,3>>);
+    m.def("getOrigin", &getOrigin<itk::Image<itk::RGBPixel<float>,2>>);
+    m.def("getOrigin", &getOrigin<itk::Image<itk::RGBPixel<float>,3>>);
+
+    m.def("setOrigin",  &setOrigin<itk::Image<unsigned char,2>>);
+    m.def("setOrigin",  &setOrigin<itk::Image<unsigned char,3>>);
+    m.def("setOrigin",  &setOrigin<itk::Image<unsigned char,4>>);
+    m.def("setOrigin",  &setOrigin<itk::Image<unsigned int,2>>);
+    m.def("setOrigin",  &setOrigin<itk::Image<unsigned int,3>>);
+    m.def("setOrigin",  &setOrigin<itk::Image<unsigned int,4>>);
+    m.def("setOrigin",   &setOrigin<itk::Image<float,2>>);
+    m.def("setOrigin",   &setOrigin<itk::Image<float,3>>);
+    m.def("setOrigin",   &setOrigin<itk::Image<float,4>>);
+    m.def("setOrigin",   &setOrigin<itk::Image<double,2>>);
+    m.def("setOrigin",   &setOrigin<itk::Image<double,3>>);
+    m.def("setOrigin",   &setOrigin<itk::Image<double,4>>);
+    m.def("setOrigin", &setOrigin<itk::VectorImage<unsigned char,2>>);
+    m.def("setOrigin", &setOrigin<itk::VectorImage<unsigned char,3>>);
+    m.def("setOrigin", &setOrigin<itk::VectorImage<unsigned char,4>>);
+    m.def("setOrigin", &setOrigin<itk::VectorImage<unsigned int,2>>);
+    m.def("setOrigin", &setOrigin<itk::VectorImage<unsigned int,3>>);
+    m.def("setOrigin", &setOrigin<itk::VectorImage<unsigned int,4>>);
+    m.def("setOrigin",  &setOrigin<itk::VectorImage<float,2>>);
+    m.def("setOrigin",  &setOrigin<itk::VectorImage<float,3>>);
+    m.def("setOrigin",  &setOrigin<itk::VectorImage<float,4>>);
+    m.def("setOrigin",  &setOrigin<itk::VectorImage<double,2>>);
+    m.def("setOrigin",  &setOrigin<itk::VectorImage<double,3>>);
+    m.def("setOrigin",  &setOrigin<itk::VectorImage<double,4>>);
+    m.def("setOrigin", &setOrigin<itk::Image<itk::RGBPixel<unsigned char>,2>>);
+    m.def("setOrigin", &setOrigin<itk::Image<itk::RGBPixel<unsigned char>,3>>);
+    m.def("setOrigin", &setOrigin<itk::Image<itk::RGBPixel<float>,2>>);
+    m.def("setOrigin", &setOrigin<itk::Image<itk::RGBPixel<float>,3>>);
+
+    m.def("getSpacing",  &getSpacing<itk::Image<unsigned char,2>>);
+    m.def("getSpacing",  &getSpacing<itk::Image<unsigned char,3>>);
+    m.def("getSpacing",  &getSpacing<itk::Image<unsigned char,4>>);
+    m.def("getSpacing",  &getSpacing<itk::Image<unsigned int,2>>);
+    m.def("getSpacing",  &getSpacing<itk::Image<unsigned int,3>>);
+    m.def("getSpacing",  &getSpacing<itk::Image<unsigned int,4>>);
+    m.def("getSpacing",   &getSpacing<itk::Image<float,2>>);
+    m.def("getSpacing",   &getSpacing<itk::Image<float,3>>);
+    m.def("getSpacing",   &getSpacing<itk::Image<float,4>>);
+    m.def("getSpacing",   &getSpacing<itk::Image<double,2>>);
+    m.def("getSpacing",   &getSpacing<itk::Image<double,3>>);
+    m.def("getSpacing",   &getSpacing<itk::Image<double,4>>);
+    m.def("getSpacing", &getSpacing<itk::VectorImage<unsigned char,2>>);
+    m.def("getSpacing", &getSpacing<itk::VectorImage<unsigned char,3>>);
+    m.def("getSpacing", &getSpacing<itk::VectorImage<unsigned char,4>>);
+    m.def("getSpacing", &getSpacing<itk::VectorImage<unsigned int,2>>);
+    m.def("getSpacing", &getSpacing<itk::VectorImage<unsigned int,3>>);
+    m.def("getSpacing", &getSpacing<itk::VectorImage<unsigned int,4>>);
+    m.def("getSpacing",  &getSpacing<itk::VectorImage<float,2>>);
+    m.def("getSpacing",  &getSpacing<itk::VectorImage<float,3>>);
+    m.def("getSpacing",  &getSpacing<itk::VectorImage<float,4>>);
+    m.def("getSpacing",  &getSpacing<itk::VectorImage<double,2>>);
+    m.def("getSpacing",  &getSpacing<itk::VectorImage<double,3>>);
+    m.def("getSpacing",  &getSpacing<itk::VectorImage<double,4>>);
+    m.def("getSpacing", &getSpacing<itk::Image<itk::RGBPixel<unsigned char>,2>>);
+    m.def("getSpacing", &getSpacing<itk::Image<itk::RGBPixel<unsigned char>,3>>);
+    m.def("getSpacing", &getSpacing<itk::Image<itk::RGBPixel<float>,2>>);
+    m.def("getSpacing", &getSpacing<itk::Image<itk::RGBPixel<float>,3>>);
+
+    m.def("setSpacing",  &setSpacing<itk::Image<unsigned char,2>>);
+    m.def("setSpacing",  &setSpacing<itk::Image<unsigned char,3>>);
+    m.def("setSpacing",  &setSpacing<itk::Image<unsigned char,4>>);
+    m.def("setSpacing",  &setSpacing<itk::Image<unsigned int,2>>);
+    m.def("setSpacing",  &setSpacing<itk::Image<unsigned int,3>>);
+    m.def("setSpacing",  &setSpacing<itk::Image<unsigned int,4>>);
+    m.def("setSpacing",   &setSpacing<itk::Image<float,2>>);
+    m.def("setSpacing",   &setSpacing<itk::Image<float,3>>);
+    m.def("setSpacing",   &setSpacing<itk::Image<float,4>>);
+    m.def("setSpacing",   &setSpacing<itk::Image<double,2>>);
+    m.def("setSpacing",   &setSpacing<itk::Image<double,3>>);
+    m.def("setSpacing",   &setSpacing<itk::Image<double,4>>);
+    m.def("setSpacing", &setSpacing<itk::VectorImage<unsigned char,2>>);
+    m.def("setSpacing", &setSpacing<itk::VectorImage<unsigned char,3>>);
+    m.def("setSpacing", &setSpacing<itk::VectorImage<unsigned char,4>>);
+    m.def("setSpacing", &setSpacing<itk::VectorImage<unsigned int,2>>);
+    m.def("setSpacing", &setSpacing<itk::VectorImage<unsigned int,3>>);
+    m.def("setSpacing", &setSpacing<itk::VectorImage<unsigned int,4>>);
+    m.def("setSpacing",  &setSpacing<itk::VectorImage<float,2>>);
+    m.def("setSpacing",  &setSpacing<itk::VectorImage<float,3>>);
+    m.def("setSpacing",  &setSpacing<itk::VectorImage<float,4>>);
+    m.def("setSpacing",  &setSpacing<itk::VectorImage<double,2>>);
+    m.def("setSpacing",  &setSpacing<itk::VectorImage<double,3>>);
+    m.def("setSpacing",  &setSpacing<itk::VectorImage<double,4>>);
+    m.def("setSpacing", &setSpacing<itk::Image<itk::RGBPixel<unsigned char>,2>>);
+    m.def("setSpacing", &setSpacing<itk::Image<itk::RGBPixel<unsigned char>,3>>);
+    m.def("setSpacing", &setSpacing<itk::Image<itk::RGBPixel<float>,2>>);
+    m.def("setSpacing", &setSpacing<itk::Image<itk::RGBPixel<float>,3>>);
+
+    m.def("getDirection",  &getDirection<itk::Image<unsigned char,2>>);
+    m.def("getDirection",  &getDirection<itk::Image<unsigned char,3>>);
+    m.def("getDirection",  &getDirection<itk::Image<unsigned char,4>>);
+    m.def("getDirection",  &getDirection<itk::Image<unsigned int,2>>);
+    m.def("getDirection",  &getDirection<itk::Image<unsigned int,3>>);
+    m.def("getDirection",  &getDirection<itk::Image<unsigned int,4>>);
+    m.def("getDirection",   &getDirection<itk::Image<float,2>>);
+    m.def("getDirection",   &getDirection<itk::Image<float,3>>);
+    m.def("getDirection",   &getDirection<itk::Image<float,4>>);
+    m.def("getDirection",   &getDirection<itk::Image<double,2>>);
+    m.def("getDirection",   &getDirection<itk::Image<double,3>>);
+    m.def("getDirection",   &getDirection<itk::Image<double,4>>);
+    m.def("getDirection", &getDirection<itk::VectorImage<unsigned char,2>>);
+    m.def("getDirection", &getDirection<itk::VectorImage<unsigned char,3>>);
+    m.def("getDirection", &getDirection<itk::VectorImage<unsigned char,4>>);
+    m.def("getDirection", &getDirection<itk::VectorImage<unsigned int,2>>);
+    m.def("getDirection", &getDirection<itk::VectorImage<unsigned int,3>>);
+    m.def("getDirection", &getDirection<itk::VectorImage<unsigned int,4>>);
+    m.def("getDirection",  &getDirection<itk::VectorImage<float,2>>);
+    m.def("getDirection",  &getDirection<itk::VectorImage<float,3>>);
+    m.def("getDirection",  &getDirection<itk::VectorImage<float,4>>);
+    m.def("getDirection",  &getDirection<itk::VectorImage<double,2>>);
+    m.def("getDirection",  &getDirection<itk::VectorImage<double,3>>);
+    m.def("getDirection",  &getDirection<itk::VectorImage<double,4>>);
+    m.def("getDirection", &getDirection<itk::Image<itk::RGBPixel<unsigned char>,2>>);
+    m.def("getDirection", &getDirection<itk::Image<itk::RGBPixel<unsigned char>,3>>);
+    m.def("getDirection", &getDirection<itk::Image<itk::RGBPixel<float>,2>>);
+    m.def("getDirection", &getDirection<itk::Image<itk::RGBPixel<float>,3>>);
+
+    m.def("setDirection",  &setDirection<itk::Image<unsigned char,2>>);
+    m.def("setDirection",  &setDirection<itk::Image<unsigned char,3>>);
+    m.def("setDirection",  &setDirection<itk::Image<unsigned char,4>>);
+    m.def("setDirection",  &setDirection<itk::Image<unsigned int,2>>);
+    m.def("setDirection",  &setDirection<itk::Image<unsigned int,3>>);
+    m.def("setDirection",  &setDirection<itk::Image<unsigned int,4>>);
+    m.def("setDirection",   &setDirection<itk::Image<float,2>>);
+    m.def("setDirection",   &setDirection<itk::Image<float,3>>);
+    m.def("setDirection",   &setDirection<itk::Image<float,4>>);
+    m.def("setDirection",   &setDirection<itk::Image<double,2>>);
+    m.def("setDirection",   &setDirection<itk::Image<double,3>>);
+    m.def("setDirection",   &setDirection<itk::Image<double,4>>);
+    m.def("setDirection", &setDirection<itk::VectorImage<unsigned char,2>>);
+    m.def("setDirection", &setDirection<itk::VectorImage<unsigned char,3>>);
+    m.def("setDirection", &setDirection<itk::VectorImage<unsigned char,4>>);
+    m.def("setDirection", &setDirection<itk::VectorImage<unsigned int,2>>);
+    m.def("setDirection", &setDirection<itk::VectorImage<unsigned int,3>>);
+    m.def("setDirection", &setDirection<itk::VectorImage<unsigned int,4>>);
+    m.def("setDirection",  &setDirection<itk::VectorImage<float,2>>);
+    m.def("setDirection",  &setDirection<itk::VectorImage<float,3>>);
+    m.def("setDirection",  &setDirection<itk::VectorImage<float,4>>);
+    m.def("setDirection",  &setDirection<itk::VectorImage<double,2>>);
+    m.def("setDirection",  &setDirection<itk::VectorImage<double,3>>);
+    m.def("setDirection",  &setDirection<itk::VectorImage<double,4>>);
+    m.def("setDirection", &setDirection<itk::Image<itk::RGBPixel<unsigned char>,2>>);
+    m.def("setDirection", &setDirection<itk::Image<itk::RGBPixel<unsigned char>,3>>);
+    m.def("setDirection", &setDirection<itk::Image<itk::RGBPixel<float>,2>>);
+    m.def("setDirection", &setDirection<itk::Image<itk::RGBPixel<float>,3>>);
+
+    m.def("toFile",  &toFile<itk::Image<unsigned char,2>>);
+    m.def("toFile",  &toFile<itk::Image<unsigned char,3>>);
+    m.def("toFile",  &toFile<itk::Image<unsigned char,4>>);
+    m.def("toFile",  &toFile<itk::Image<unsigned int,2>>);
+    m.def("toFile",  &toFile<itk::Image<unsigned int,3>>);
+    m.def("toFile",  &toFile<itk::Image<unsigned int,4>>);
+    m.def("toFile",   &toFile<itk::Image<float,2>>);
+    m.def("toFile",   &toFile<itk::Image<float,3>>);
+    m.def("toFile",   &toFile<itk::Image<float,4>>);
+    m.def("toFile",   &toFile<itk::Image<double,2>>);
+    m.def("toFile",   &toFile<itk::Image<double,3>>);
+    m.def("toFile",   &toFile<itk::Image<double,4>>);
+    m.def("toFile", &toFile<itk::VectorImage<unsigned char,2>>);
+    m.def("toFile", &toFile<itk::VectorImage<unsigned char,3>>);
+    m.def("toFile", &toFile<itk::VectorImage<unsigned char,4>>);
+    m.def("toFile", &toFile<itk::VectorImage<unsigned int,2>>);
+    m.def("toFile", &toFile<itk::VectorImage<unsigned int,3>>);
+    m.def("toFile", &toFile<itk::VectorImage<unsigned int,4>>);
+    m.def("toFile",  &toFile<itk::VectorImage<float,2>>);
+    m.def("toFile",  &toFile<itk::VectorImage<float,3>>);
+    m.def("toFile",  &toFile<itk::VectorImage<float,4>>);
+    m.def("toFile",  &toFile<itk::VectorImage<double,2>>);
+    m.def("toFile",  &toFile<itk::VectorImage<double,3>>);
+    m.def("toFile",  &toFile<itk::VectorImage<double,4>>);
+    m.def("toFile", &toFile<itk::Image<itk::RGBPixel<unsigned char>,2>>);
+    m.def("toFile", &toFile<itk::Image<itk::RGBPixel<unsigned char>,3>>);
+    m.def("toFile", &toFile<itk::Image<itk::RGBPixel<float>,2>>);
+    m.def("toFile", &toFile<itk::Image<itk::RGBPixel<float>,3>>);
+
+    m.def("toNumpy",  &toNumpy<itk::Image<unsigned char,2>>);
+    m.def("toNumpy",  &toNumpy<itk::Image<unsigned char,3>>);
+    m.def("toNumpy",  &toNumpy<itk::Image<unsigned char,4>>);
+    m.def("toNumpy",  &toNumpy<itk::Image<unsigned int,2>>);
+    m.def("toNumpy",  &toNumpy<itk::Image<unsigned int,3>>);
+    m.def("toNumpy",  &toNumpy<itk::Image<unsigned int,4>>);
+    m.def("toNumpy",   &toNumpy<itk::Image<float,2>>);
+    m.def("toNumpy",   &toNumpy<itk::Image<float,3>>);
+    m.def("toNumpy",   &toNumpy<itk::Image<float,4>>);
+    m.def("toNumpy",   &toNumpy<itk::Image<double,2>>);
+    m.def("toNumpy",   &toNumpy<itk::Image<double,3>>);
+    m.def("toNumpy",   &toNumpy<itk::Image<double,4>>);
+    m.def("toNumpy", &toNumpy<itk::VectorImage<unsigned char,2>>);
+    m.def("toNumpy", &toNumpy<itk::VectorImage<unsigned char,3>>);
+    m.def("toNumpy", &toNumpy<itk::VectorImage<unsigned char,4>>);
+    m.def("toNumpy", &toNumpy<itk::VectorImage<unsigned int,2>>);
+    m.def("toNumpy", &toNumpy<itk::VectorImage<unsigned int,3>>);
+    m.def("toNumpy", &toNumpy<itk::VectorImage<unsigned int,4>>);
+    m.def("toNumpy",  &toNumpy<itk::VectorImage<float,2>>);
+    m.def("toNumpy",  &toNumpy<itk::VectorImage<float,3>>);
+    m.def("toNumpy",  &toNumpy<itk::VectorImage<float,4>>);
+    m.def("toNumpy",  &toNumpy<itk::VectorImage<double,2>>);
+    m.def("toNumpy",  &toNumpy<itk::VectorImage<double,3>>);
+    m.def("toNumpy",  &toNumpy<itk::VectorImage<double,4>>);
+    m.def("toNumpy", &toNumpy<itk::Image<itk::RGBPixel<unsigned char>,2>>);
+    m.def("toNumpy", &toNumpy<itk::Image<itk::RGBPixel<unsigned char>,3>>);
+    m.def("toNumpy", &toNumpy<itk::Image<itk::RGBPixel<float>,2>>);
+    m.def("toNumpy", &toNumpy<itk::Image<itk::RGBPixel<float>,3>>);
+
+    nb::class_<AntsImage<itk::Image<unsigned char,2>>>(m, "AntsImageUC2");
+    nb::class_<AntsImage<itk::Image<unsigned char,3>>>(m, "AntsImageUC3");
+    nb::class_<AntsImage<itk::Image<unsigned char,4>>>(m, "AntsImageUC4");
+    nb::class_<AntsImage<itk::Image<unsigned int,2>>>(m, "AntsImageUI2");
+    nb::class_<AntsImage<itk::Image<unsigned int,3>>>(m, "AntsImageUI3");
+    nb::class_<AntsImage<itk::Image<unsigned int,4>>>(m, "AntsImageUI4");
+    nb::class_<AntsImage<itk::Image<float,2>>>(m, "AntsImageF2");
+    nb::class_<AntsImage<itk::Image<float,3>>>(m, "AntsImageF3");
+    nb::class_<AntsImage<itk::Image<float,4>>>(m, "AntsImageF4");
+    nb::class_<AntsImage<itk::Image<double,2>>>(m, "AntsImageD2");
+    nb::class_<AntsImage<itk::Image<double,3>>>(m, "AntsImageD3");
+    nb::class_<AntsImage<itk::Image<double,4>>>(m, "AntsImageD4");
+    nb::class_<AntsImage<itk::VectorImage<unsigned char,2>>>(m, "AntsImageVUC2");
+    nb::class_<AntsImage<itk::VectorImage<unsigned char,3>>>(m, "AntsImageVUC3");
+    nb::class_<AntsImage<itk::VectorImage<unsigned char,4>>>(m, "AntsImageVUC4");
+    nb::class_<AntsImage<itk::VectorImage<unsigned int,2>>>(m, "AntsImageVUI2");
+    nb::class_<AntsImage<itk::VectorImage<unsigned int,3>>>(m, "AntsImageVUI3");
+    nb::class_<AntsImage<itk::VectorImage<unsigned int,4>>>(m, "AntsImageVUI4");
+    nb::class_<AntsImage<itk::VectorImage<float,2>>>(m, "AntsImageVF2");
+    nb::class_<AntsImage<itk::VectorImage<float,3>>>(m, "AntsImageVF3");
+    nb::class_<AntsImage<itk::VectorImage<float,4>>>(m, "AntsImageVF4");
+    nb::class_<AntsImage<itk::VectorImage<double,2>>>(m, "AntsImageVD2");
+    nb::class_<AntsImage<itk::VectorImage<double,3>>>(m, "AntsImageVD3");
+    nb::class_<AntsImage<itk::VectorImage<double,4>>>(m, "AntsImageVD4");
+    nb::class_<AntsImage<itk::Image<itk::RGBPixel<unsigned char>,2>>>(m, "AntsImageRGBUC2");
+    nb::class_<AntsImage<itk::Image<itk::RGBPixel<unsigned char>,3>>>(m, "AntsImageRGBUC3");
+    nb::class_<AntsImage<itk::Image<itk::RGBPixel<float>,2>>>(m, "AntsImageRGBF2");
+    nb::class_<AntsImage<itk::Image<itk::RGBPixel<float>,3>>>(m, "AntsImageRGBF3");
+}