DGtal 1.4.0
Loading...
Searching...
No Matches
testITKio.cpp
Go to the documentation of this file.
1
31#include "ConfigTest.h"
32#include "DGtal/base/Common.h"
33#include "DGtal/helpers/StdDefs.h"
34#include "DGtal/images/ImageSelector.h"
35#include "DGtal/images/CImage.h"
36#include "DGtal/io/writers/ITKWriter.h"
37#include "DGtal/io/readers/ITKReader.h"
38using namespace DGtal;
39
40#include <string>
41using std::endl;
42using std::string;
43
45// Functions for testing ITK io
47template <typename Image>
48bool
49test_image(const string& filename)
50{
51 BOOST_CONCEPT_ASSERT(( concepts::CImage<Image> ));
52
53 typedef typename Image::Domain::Point Point;
54 Point point0;
55 Point point1;
56 for (typename Image::Domain::Dimension kk=0; kk<Image::Domain::dimension; kk++)
57 {
58 point0[kk] = 5;
59 point1[kk] = 10;
60 }
61
62 typedef typename Image::Domain Domain;
63 const Domain domain(point0, point1);
64 Image image(domain);
65
66 typedef typename std::vector<typename Image::Value> Values;
67 Values values;
68 values.reserve(domain.size());
69 for (typename Domain::Size kk=0; kk<domain.size(); kk++)
70 values.push_back(rand());
71
72 std::copy(values.begin(), values.end(), image.range().outputIterator());
73
74 trace.info() << image << endl;
75 trace.info() << "writing " << filename << endl;
76 if (!ITKWriter<Image>::exportITK(filename, image)) return false;
77
78 trace.info() << "reading " << filename << endl;
79 Image image_read = ITKReader<Image>::importITK(filename);
80 trace.info() << image_read << endl;
81
82 if (image_read.domain().lowerBound() != image.domain().lowerBound()) trace.warning() << "lowerBound mismatch!!" << endl;
83 if (image_read.domain().upperBound() != image.domain().upperBound()) trace.warning() << "upperBound mismatch!!" << endl;
84
85 typename Image::ConstRange::ConstIterator iter_read = image_read.constRange().begin();
86 typename Image::ConstRange::ConstIterator iter_read_end = image_read.constRange().end();
87 typename Values::const_iterator iter_value = values.begin();
88 typename Values::const_iterator iter_value_end = values.end();
89 while (iter_value!=iter_value_end && iter_read!=iter_read_end)
90 {
91 if ((*iter_read)!=(*iter_value)) {
92 trace.error() << "values mismatch" << endl;
93 return false;
94 }
95 iter_value++;
96 iter_read++;
97 }
98
99 return true;
100}
101
102bool
104{
107 Image3DITK input = ITKReader<Image3DITK>::importITK("image_3d_int.mha");
108 Image3DITK copy(input.domain());
109 Image3DITK::ImageSpacing s (0.2, 0.3, 0.4);
110 trace.info() << "setting image spacing to 0.2, 0.3, 0.4" << std::endl;
111 copy.setImageSpacing(s);
112 for (auto p: input.domain() ) {copy.setValue(p, input(p));}
113 ITKWriter<Image3DITK>::exportITK("image_3d_intSpace0.2.mha", copy);
114 Image3DITK check = ITKReader<Image3DITK>::importITK("image_3d_intSpace0.2.mha");
115 s = check.getImageSpacing();
116 trace.info() << "reading image spacing after write (should be 0.2, 0.3, 0.4)" << std::endl;
117 trace.info() << "spacing: " << s[0] << " " << s[1] << " " << s[2] << std::endl;
118 Image3D img (input.domain());
119 ITKWriter<Image3D>::exportITK("imageVect_3d_intSpace0.8.mha", img, Z3i::RealPoint(0.8, 0.9, 1.0));
120 Image3DITK check3 = ITKReader<Image3DITK>::importITK("imageVect_3d_intSpace0.8.mha");
121 auto s3 = check3.getImageSpacing();
122 trace.info() << "reading image spacing after export with spacing mention (should be 0.8, 0.9, 1.0)" << std::endl;
123 trace.info() << "spacing: " << s3[0] << " " << s3[1] << " " << s3[2] << std::endl;
124
126 Image2DITK input2 = ITKReader<Image2DITK>::importITK("image_2d_int.mha");
127 Image2DITK copy2(input2.domain());
128 Image2DITK::ImageSpacing s2 (0.2, 0.3);
129 trace.info() << "setting image spacing to 0.2, 0.3" << std::endl;
130 copy2.setImageSpacing(s2);
131 for (auto p: input2.domain() ) {copy2.setValue(p, input2(p));}
132 ITKWriter<Image2DITK>::exportITK("image_2d_intSpace0.2.mha", copy2);
133 Image2DITK check2 = ITKReader<Image2DITK>::importITK("image_2d_intSpace0.2.mha");
134 s2 = check2.getImageSpacing();
135 trace.info() << "reading image spacing after write (should be 0.2, 0.3)" << std::endl;
136 trace.info() << "spacing: " << s2[0] << " " << s2[1] << std::endl;
137
138
139 return s[0] == 0.2 && s[1] == 0.3 && s[2] == 0.4 &&
140 s2[0] == 0.2 && s2[1] == 0.3 &&
141 s3[0] == 0.8 && s3[1] == 0.9 && s3[2] == 1.0;
142}
143
144
146{
147 unsigned int nbok = 0;
148 unsigned int nb = 0;
149
150 nb += 8;
151 trace.beginBlock ( "Testing 2D ITK image value types ..." );
152 nbok += test_image<ImageSelector<Z2i::Domain, int>::Type>("image_2d_int.mha");
153 nbok += test_image<ImageSelector<Z2i::Domain, bool>::Type>("image_2d_bool.mha");
154 nbok += test_image<ImageSelector<Z2i::Domain, unsigned int>::Type>("image_2d_unsigned_int.mha");
155 nbok += test_image<ImageSelector<Z2i::Domain, unsigned char>::Type>("image_2d_unsigned_char.mha");
156 nbok += test_image<ImageSelector<Z2i::Domain, unsigned long>::Type>("image_2d_unsigned_long.mha");
157 nbok += test_image<ImageSelector<Z2i::Domain, long>::Type>("image_2d_long.mha");
158 nbok += test_image<ImageSelector<Z2i::Domain, float>::Type>("image_2d_float.mha");
159 nbok += test_image<ImageSelector<Z2i::Domain, double>::Type>("image_2d_double.mha");
160 trace.endBlock();
161
162 nb += 8;
163 trace.beginBlock ( "Testing 3D ITK image value types ..." );
164 nbok += test_image<ImageSelector<Z3i::Domain, int>::Type>("image_3d_int.mha");
165 nbok += test_image<ImageSelector<Z3i::Domain, bool>::Type>("image_3d_bool.mha");
166 nbok += test_image<ImageSelector<Z3i::Domain, unsigned int>::Type>("image_3d_unsigned_int.mha");
167 nbok += test_image<ImageSelector<Z3i::Domain, unsigned char>::Type>("image_3d_unsigned_char.mha");
168 nbok += test_image<ImageSelector<Z3i::Domain, unsigned long>::Type>("image_3d_unsigned_long.mha");
169 nbok += test_image<ImageSelector<Z3i::Domain, long>::Type>("image_3d_long.mha");
170 nbok += test_image<ImageSelector<Z3i::Domain, float>::Type>("image_3d_float.mha");
171 nbok += test_image<ImageSelector<Z3i::Domain, double>::Type>("image_3d_double.mha");
172 trace.endBlock();
173
174 nb += 3;
175 trace.beginBlock ( "Testing 2D ITK image formats ..." );
176 nbok += test_image<ImageSelector<Z2i::Domain, unsigned char>::Type>("image_unsigned_char.jpg"); nb--; // jpg is lossy
177 nbok += test_image<ImageSelector<Z2i::Domain, unsigned char>::Type>("image_unsigned_char.png");
178 nbok += test_image<ImageSelector<Z2i::Domain, unsigned char>::Type>("image_unsigned_char.bmp");
179 trace.endBlock();
180
181 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
182 nb += 1;
183 trace.beginBlock ( "Testing 3D ITK image with spacing ..." );
184 nbok += testITKSpacingIO();
185 trace.endBlock();
186 return nbok == nb;
187}
188
190// Standard services - public :
191
192int main( int /*argc*/, char** /*argv*/ )
193{
194 bool res = testITKio(); // && ... other tests
195 trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
196 return res ? 0 : 1;
197}
198// //
Aim: implements a model of CImageContainer using a ITK Image.
Aim: implements association bewteen points lying in a digital domain and values.
Definition Image.h:70
const Domain & domain() const
Definition Image.h:192
ConstRange constRange() const
Definition Image.h:203
void beginBlock(const std::string &keyword="")
std::ostream & warning()
std::ostream & emphase()
std::ostream & error()
std::ostream & info()
double endBlock()
DGtal is the top-level namespace which contains all DGtal functions and types.
Trace trace
Definition Common.h:153
static Image importITK(const std::string &filename, const TFunctor &aFunctor=TFunctor(), bool shiftDomainUsingOrigin=true)
Export a 2D/3D Image using the ITK formats.
Definition ITKWriter.h:65
static bool exportITK(const std::string &filename, const Image &aImage, const Functor &aFunctor=Functor())
Aim: Defines the concept describing a read/write image, having an output iterator.
Definition CImage.h:103
int main()
Definition testBits.cpp:56
MyPointD Point
bool test_image(const string &filename)
Definition testITKio.cpp:49
bool testITKio()
bool testITKSpacingIO()
Domain domain
HyperRectDomain< Space > Domain