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

Switch to unified view

a b/src/mergeChannels.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 <exception>
9
#include <vector>
10
#include <string>
11
12
#include "itkImage.h"
13
#include "itkVectorImage.h"
14
#include "itkImageRegionIteratorWithIndex.h"
15
16
#include "antsImage.h"
17
18
namespace nb = nanobind;
19
20
using namespace nb::literals;
21
22
template< class ImageType, class VectorImageType >
23
AntsImage<VectorImageType> mergeChannels( std::vector<AntsImage<ImageType>> imageList )
24
{
25
  typedef typename ImageType::Pointer       ImagePointerType;
26
  typedef typename VectorImageType::Pointer VectorImagePointerType;
27
28
  unsigned int nImages = imageList.size();
29
30
  std::vector<ImagePointerType> images;
31
  for ( unsigned int i=0; i<nImages; i++)
32
  {
33
    images.push_back( imageList[i].ptr );
34
  }
35
36
  VectorImagePointerType vectorImage = VectorImageType::New();
37
  vectorImage->SetRegions( images[0]->GetLargestPossibleRegion() );
38
  vectorImage->SetSpacing( images[0]->GetSpacing() );
39
  vectorImage->SetOrigin( images[0]->GetOrigin() );
40
  vectorImage->SetDirection( images[0]->GetDirection() );
41
  vectorImage->SetNumberOfComponentsPerPixel( nImages );
42
  vectorImage->AllocateInitialized();
43
44
  // Fill image data
45
  itk::ImageRegionIteratorWithIndex<VectorImageType> it( vectorImage,
46
    vectorImage->GetLargestPossibleRegion() );
47
48
  while (!it.IsAtEnd() )
49
    {
50
    typename VectorImageType::PixelType pix;
51
    pix.SetSize( nImages );
52
    for (unsigned int i=0; i<nImages; i++)
53
      {
54
      pix[i] = images[i]->GetPixel(it.GetIndex());
55
      }
56
    vectorImage->SetPixel(it.GetIndex(), pix);
57
    ++it;
58
    }
59
60
    AntsImage<VectorImageType> outImage = { vectorImage };
61
  return outImage;
62
}
63
64
65
template< class ImageType, class VectorImageType >
66
typename VectorImageType::Pointer mergeChannels2( std::vector<AntsImage<ImageType>> imageList )
67
{
68
  typedef typename ImageType::Pointer       ImagePointerType;
69
  typedef typename VectorImageType::Pointer VectorImagePointerType;
70
71
  unsigned int nImages = imageList.size();
72
73
  std::vector<ImagePointerType> images;
74
  for ( unsigned int i=0; i<nImages; i++)
75
  {
76
    images.push_back( imageList[i].ptr );
77
  }
78
79
  VectorImagePointerType vectorImage = VectorImageType::New();
80
  vectorImage->SetRegions( images[0]->GetLargestPossibleRegion() );
81
  vectorImage->SetSpacing( images[0]->GetSpacing() );
82
  vectorImage->SetOrigin( images[0]->GetOrigin() );
83
  vectorImage->SetDirection( images[0]->GetDirection() );
84
  vectorImage->SetNumberOfComponentsPerPixel( nImages );
85
  vectorImage->AllocateInitialized();
86
87
  // Fill image data
88
  itk::ImageRegionIteratorWithIndex<VectorImageType> it( vectorImage,
89
    vectorImage->GetLargestPossibleRegion() );
90
91
  while (!it.IsAtEnd() )
92
    {
93
    typename VectorImageType::PixelType pix;
94
    pix.SetSize( nImages );
95
    for (unsigned int i=0; i<nImages; i++)
96
      {
97
      pix[i] = images[i]->GetPixel(it.GetIndex());
98
      }
99
    vectorImage->SetPixel(it.GetIndex(), pix);
100
    ++it;
101
    }
102
103
  //return wrap<VectorImageType>( vectorImage );
104
  //AntsImage<VectorImageType> outImage = { vectorImage };
105
  return vectorImage;
106
}
107
108
template< class ImageType, class VectorImageType >
109
typename VectorImageType::Pointer mergeChannels3( std::vector<AntsImage<ImageType>> imageList )
110
{
111
  typedef typename ImageType::Pointer       ImagePointerType;
112
  typedef typename VectorImageType::Pointer VectorImagePointerType;
113
114
  unsigned int nImages = imageList.size();
115
116
  std::vector<ImagePointerType> images;
117
  for ( unsigned int i=0; i<nImages; i++)
118
  {
119
    images.push_back( imageList[i].ptr );
120
  }
121
122
  VectorImagePointerType vectorImage = VectorImageType::New();
123
  vectorImage->SetRegions( images[0]->GetLargestPossibleRegion() );
124
  vectorImage->SetSpacing( images[0]->GetSpacing() );
125
  vectorImage->SetOrigin( images[0]->GetOrigin() );
126
  vectorImage->SetDirection( images[0]->GetDirection() );
127
  //vectorImage->SetNumberOfComponentsPerPixel( nImages );
128
  vectorImage->AllocateInitialized();
129
130
  // Fill image data
131
  itk::ImageRegionIteratorWithIndex<VectorImageType> it( vectorImage,
132
    vectorImage->GetLargestPossibleRegion() );
133
134
  while (!it.IsAtEnd() )
135
    {
136
137
    typename VectorImageType::PixelType pix;
138
    //pix.SetSize( nImages );
139
    for (unsigned int i=0; i<nImages; i++)
140
      {
141
      pix[i] = images[i]->GetPixel(it.GetIndex());
142
      }
143
    vectorImage->SetPixel(it.GetIndex(), pix);
144
    ++it;
145
    }
146
147
  //return wrap<VectorImageType>( vectorImage );
148
  //AntsImage<VectorImageType> outImage = { vectorImage };
149
  return vectorImage;
150
}
151
152
153
template< class VectorImageType, class ImageType>
154
std::vector<AntsImage<ImageType>> splitChannels( AntsImage<VectorImageType> & antsimage )
155
{
156
  typedef typename ImageType::Pointer       ImagePointerType;
157
  typedef typename VectorImageType::Pointer VectorImagePointerType;
158
159
  VectorImagePointerType input = antsimage.ptr;
160
  unsigned int nComponents = input->GetNumberOfComponentsPerPixel();
161
162
  // Create output images
163
  std::vector<ImagePointerType> images;
164
  for ( unsigned int i=0; i<nComponents; i++)
165
    {
166
    ImagePointerType image = ImageType::New();
167
    image->SetRegions( input->GetLargestPossibleRegion() );
168
    image->SetSpacing( input->GetSpacing() );
169
    image->SetOrigin( input->GetOrigin() );
170
    image->SetDirection( input->GetDirection() );
171
    image->AllocateInitialized();
172
    images.push_back( image );
173
    }
174
175
  // Fill image data
176
  itk::ImageRegionIteratorWithIndex<VectorImageType> it( input,
177
    input->GetLargestPossibleRegion() );
178
179
  while (!it.IsAtEnd() )
180
    {
181
    typename VectorImageType::PixelType pix = input->GetPixel(it.GetIndex());
182
183
    for (unsigned int i=0; i<nComponents; i++)
184
      {
185
      images[i]->SetPixel(it.GetIndex(), pix[i]);
186
      }
187
    ++it;
188
    }
189
190
  std::vector<AntsImage<ImageType>> outputList( nComponents );
191
  for (unsigned int i=0; i<nComponents; i++)
192
    {
193
        AntsImage<ImageType> tmpImage = { images[i] };
194
    outputList[i] = tmpImage;
195
    }
196
197
  return( outputList );
198
199
}
200
201
202
void local_mergeChannels(nb::module_ &m) {
203
  m.def("mergeChannels", &mergeChannels<itk::Image<unsigned char, 2>, itk::VectorImage<unsigned char, 2> >);
204
  m.def("mergeChannels", &mergeChannels<itk::Image<unsigned char, 3>, itk::VectorImage<unsigned char, 3> >);
205
  m.def("mergeChannels", &mergeChannels<itk::Image<unsigned char, 4>, itk::VectorImage<unsigned char, 4> >);
206
  m.def("mergeChannels", &mergeChannels<itk::Image<unsigned int, 2>, itk::VectorImage<unsigned int, 2> >);
207
  m.def("mergeChannels", &mergeChannels<itk::Image<unsigned int, 3>, itk::VectorImage<unsigned int, 3> >);
208
  m.def("mergeChannels", &mergeChannels<itk::Image<unsigned int, 4>, itk::VectorImage<unsigned int, 4> >);
209
  m.def("mergeChannels", &mergeChannels<itk::Image<float, 2>, itk::VectorImage<float, 2> >);
210
  m.def("mergeChannels", &mergeChannels<itk::Image<float, 3>, itk::VectorImage<float, 3> >);
211
  m.def("mergeChannels", &mergeChannels<itk::Image<float, 4>, itk::VectorImage<float, 4> >);
212
  m.def("mergeChannels", &mergeChannels<itk::Image<double, 2>, itk::VectorImage<double, 2> >);
213
  m.def("mergeChannels", &mergeChannels<itk::Image<double, 3>, itk::VectorImage<double, 3> >);
214
  m.def("mergeChannels", &mergeChannels<itk::Image<double, 4>, itk::VectorImage<double, 4> >);
215
216
  m.def("splitChannels", &splitChannels<itk::VectorImage<unsigned char, 2>, itk::Image<unsigned char, 2> >);
217
  m.def("splitChannels", &splitChannels<itk::VectorImage<unsigned char, 3>, itk::Image<unsigned char, 3> >);
218
  m.def("splitChannels", &splitChannels<itk::VectorImage<unsigned char, 4>, itk::Image<unsigned char, 4> >);
219
  m.def("splitChannels", &splitChannels<itk::VectorImage<unsigned int, 2>, itk::Image<unsigned int, 2> >);
220
  m.def("splitChannels", &splitChannels<itk::VectorImage<unsigned int, 3>, itk::Image<unsigned int, 3> >);
221
  m.def("splitChannels", &splitChannels<itk::VectorImage<unsigned int, 4>, itk::Image<unsigned int, 4> >);
222
  m.def("splitChannels", &splitChannels<itk::VectorImage<float, 2>, itk::Image<float, 2> >);
223
  m.def("splitChannels", &splitChannels<itk::VectorImage<float, 3>, itk::Image<float, 3> >);
224
  m.def("splitChannels", &splitChannels<itk::VectorImage<float, 4>, itk::Image<float, 4> >);
225
  m.def("splitChannels", &splitChannels<itk::VectorImage<double, 2>, itk::Image<double, 2> >);
226
  m.def("splitChannels", &splitChannels<itk::VectorImage<double, 3>, itk::Image<double, 3> >);
227
  m.def("splitChannels", &splitChannels<itk::VectorImage<double, 4>, itk::Image<double, 4> >);
228
  m.def("splitChannels", &splitChannels<itk::Image<itk::RGBPixel<unsigned char>, 2>, itk::Image<unsigned char, 2> >);
229
230
231
}