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