Diff of /src/rgbToVector.cxx [000000] .. [5d12a0]

Switch to unified view

a b/src/rgbToVector.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/stl/list.h>
7
#include <nanobind/ndarray.h>
8
#include <nanobind/stl/shared_ptr.h>
9
10
#include "itkImage.h"
11
#include "itkImageFileReader.h"
12
#include "itkVectorCurvatureAnisotropicDiffusionImageFilter.h"
13
#include "itkVectorToRGBImageAdaptor.h"
14
#include "itkRGBToVectorImageAdaptor.h"
15
#include "itkCastImageFilter.h"
16
17
#include "mergeChannels.h"
18
#include "antsImage.h"
19
20
namespace nb = nanobind;
21
using namespace nb::literals;
22
23
template <typename VectorImageType, typename ImageOfVectorsType, typename PixelType, unsigned int Dimension>
24
typename VectorImageType::Pointer imageOfVectors_to_VectorImage( typename ImageOfVectorsType::Pointer imageOfVectors )
25
{
26
  typedef typename VectorImageType::Pointer VectorImagePointerType;
27
  typedef typename ImageOfVectorsType::Pointer ImageOfVectorsPointerType;
28
29
  typedef itk::Image<PixelType, Dimension> ImageType;
30
31
  // split channels
32
  std::vector<AntsImage<ImageType>> myChannels;
33
  AntsImage<ImageOfVectorsType> myCapsule = { imageOfVectors };
34
  myChannels = splitChannels<ImageOfVectorsType,ImageType>( myCapsule );
35
36
  // now merge channels into a vectorimage
37
  VectorImagePointerType finalImage = mergeChannels2<ImageType, VectorImageType>( myChannels );
38
  return finalImage;
39
}
40
41
template <typename VectorImageType, typename ImageOfVectorsType, typename PixelType, unsigned int Dimension>
42
typename ImageOfVectorsType::Pointer VectorImage_to_imageOfVectors( typename VectorImageType::Pointer vectorImage )
43
{
44
  typedef typename VectorImageType::Pointer VectorImagePointerType;
45
  typedef typename ImageOfVectorsType::Pointer ImageOfVectorsPointerType;
46
47
  typedef itk::Image<PixelType, Dimension> ImageType;
48
49
  // split channels
50
  std::vector<AntsImage<ImageType>> myChannels;
51
  AntsImage<VectorImageType> myCapsule = { vectorImage };
52
  myChannels = splitChannels<VectorImageType,ImageType>( myCapsule );
53
54
  // now merge channels into a vectorimage
55
  ImageOfVectorsPointerType finalImage = mergeChannels3<ImageType, ImageOfVectorsType>( myChannels );
56
  return finalImage;
57
}
58
59
60
template <typename RGBImageType, unsigned int Dimension>
61
AntsImage<itk::VectorImage<unsigned char, Dimension>> RgbToVector( AntsImage<RGBImageType> & antsImage )
62
{
63
64
  typedef typename RGBImageType::Pointer RGBImagePointerType;
65
66
  typedef itk::Image<itk::Vector<unsigned char,3>, Dimension>  VectorImageType;
67
  typedef typename VectorImageType::Pointer VectorImagePointerType;
68
69
  RGBImagePointerType rgbImage = antsImage.ptr;//as< RGBImageType >( antsImage );
70
  
71
  // 2) Cast to Vector image for processing
72
  typedef itk::RGBToVectorImageAdaptor<RGBImageType> AdaptorInputType;
73
  typename AdaptorInputType::Pointer adaptInput = AdaptorInputType::New();
74
  adaptInput->SetImage( rgbImage );
75
76
  typedef itk::CastImageFilter<AdaptorInputType,VectorImageType> CastInputType;
77
  typename CastInputType::Pointer castInput = CastInputType::New();
78
  castInput->SetInput( adaptInput );
79
  castInput->Update();
80
81
  // get an image of vectors from rgb
82
  VectorImagePointerType vectorImage = castInput->GetOutput();
83
84
  // cast image of vectors to vectorimage
85
  typedef itk::VectorImage<unsigned char, Dimension>  VectorImageType2;
86
  typedef typename VectorImageType2::Pointer VectorImagePointerType2;
87
88
  VectorImagePointerType2 newVectorImage = imageOfVectors_to_VectorImage<VectorImageType2,VectorImageType,unsigned char, Dimension>(vectorImage);
89
  AntsImage<VectorImageType2> outImage = { newVectorImage };
90
  return outImage;
91
}
92
93
template <typename VectorImageType, unsigned int Dimension>
94
AntsImage<itk::Image< itk::RGBPixel<unsigned char>, Dimension >> VectorToRgb( AntsImage<VectorImageType> & antsImage )
95
{
96
  // cast VectorImage to ImageOfVectors
97
  typedef typename VectorImageType::Pointer VectorImagePointerType;
98
  VectorImagePointerType vectorImage = antsImage.ptr;//as<VectorImageType>( antsImage );
99
100
  typedef itk::Image<itk::Vector<unsigned char,3>, Dimension>  VectorImageType2;
101
  typedef typename VectorImageType2::Pointer VectorImagePointerType2;
102
103
  VectorImagePointerType2 newVectorImage = VectorImage_to_imageOfVectors<VectorImageType,VectorImageType2,unsigned char, Dimension>(vectorImage);
104
  
105
  typedef itk::Image< itk::RGBPixel<unsigned char>, Dimension > RGBImageType;
106
  typedef typename RGBImageType::Pointer RGBImagePointerType;
107
  
108
  // 2) Cast to Vector image for processing
109
  typedef itk::VectorToRGBImageAdaptor<VectorImageType2> AdaptorInputType;
110
  typename AdaptorInputType::Pointer adaptInput = AdaptorInputType::New();
111
  adaptInput->SetImage( newVectorImage );
112
 
113
  typedef itk::CastImageFilter<AdaptorInputType,RGBImageType> CastInputType;
114
  typename CastInputType::Pointer castInput = CastInputType::New();
115
  castInput->SetInput( adaptInput );
116
  castInput->Update();
117
  
118
  //return wrap<RGBImageType>( castInput->GetOutput() );
119
  AntsImage<RGBImageType> outImage = { castInput->GetOutput() };
120
  return outImage;
121
122
}
123
124
void local_rgbToVector(nb::module_ &m)
125
{
126
  m.def("RgbToVector2", &RgbToVector<itk::Image<itk::RGBPixel<unsigned char>, 2>, 2>);
127
  m.def("RgbToVector3", &RgbToVector<itk::Image<itk::RGBPixel<unsigned char>, 3>, 3>);
128
  m.def("VectorToRgb2", &VectorToRgb<itk::VectorImage<unsigned char,2>, 2>);
129
  m.def("VectorToRgb3", &VectorToRgb<itk::VectorImage<unsigned char,3>, 3>);
130
}
131
132
133