DGtal
2.2.0
Toggle main menu visibility
Loading...
Searching...
No Matches
testITKio.cpp
Go to the documentation of this file.
1
16
29
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"
38
using namespace
DGtal
;
39
40
#include <string>
41
using
std::endl;
42
using
std::string;
43
45
// Functions for testing ITK io
47
template
<
typename
Image>
48
bool
49
test_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
102
bool
103
testITKSpacingIO
()
104
{
105
typedef
ImageContainerBySTLVector<Z3i::Domain, int>
Image3D;
106
typedef
ImageContainerByITKImage<Z3i::Domain, int>
Image3DITK;
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
125
typedef
ImageContainerByITKImage<Z2i::Domain, int>
Image2DITK;
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
145
bool
testITKio
()
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
192
int
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
// //
DGtal::HyperRectDomain< Space >::Size
Space::Size Size
Definition
HyperRectDomain.h:117
DGtal::HyperRectDomain::lowerBound
const Point & lowerBound() const
DGtal::HyperRectDomain::upperBound
const Point & upperBound() const
DGtal::ImageContainerByITKImage
Aim: implements a model of CImageContainer using a ITK Image.
Definition
ImageContainerByITKImage.h:94
DGtal::ImageContainerBySTLVector
Definition
ImageContainerBySTLVector.h:127
DGtal::ImageContainerBySTLVector< Domain, Value >::ConstIterator
std::vector< Value >::const_iterator ConstIterator
Definition
ImageContainerBySTLVector.h:265
DGtal::ImageContainerBySTLVector< Domain, Value >::Domain
Domain Domain
Definition
ImageContainerBySTLVector.h:137
DGtal::ImageContainerBySTLVector< Domain, Value >::Point
Domain::Point Point
Definition
ImageContainerBySTLVector.h:138
DGtal::ImageContainerBySTLVector< Domain, Value >::Dimension
Domain::Dimension Dimension
Definition
ImageContainerBySTLVector.h:142
DGtal::Image
Aim: implements association between points lying in a digital domain and values.
Definition
Image.h:70
DGtal::Image::domain
const Domain & domain() const
Definition
Image.h:192
DGtal::Image::range
Range range()
Definition
Image.h:214
DGtal::Image::constRange
ConstRange constRange() const
Definition
Image.h:203
DGtal::SimpleRandomAccessConstRangeFromPoint::begin
ConstIterator begin() const
Definition
SimpleRandomAccessConstRangeFromPoint.h:192
DGtal::SimpleRandomAccessConstRangeFromPoint::end
ConstIterator end() const
Definition
SimpleRandomAccessConstRangeFromPoint.h:212
DGtal::SimpleRandomAccessRangeFromPoint::outputIterator
OutputIterator outputIterator()
Definition
SimpleRandomAccessRangeFromPoint.h:262
DGtal::Point
DGtal::Trace::beginBlock
void beginBlock(const std::string &keyword="")
DGtal::Trace::warning
std::ostream & warning()
DGtal::Trace::emphase
std::ostream & emphase()
DGtal::Trace::error
std::ostream & error()
DGtal::Trace::info
std::ostream & info()
DGtal::Trace::endBlock
double endBlock()
DGtal::Domain
DGtal::Z3i::RealPoint
Space::RealPoint RealPoint
Definition
StdDefs.h:170
DGtal
DGtal is the top-level namespace which contains all DGtal functions and types.
Definition
ClosedIntegerHalfPlane.h:49
DGtal::trace
Trace trace
DGtal::ITKReader::importITK
static Image importITK(const std::string &filename, const TFunctor &aFunctor=TFunctor(), bool shiftDomainUsingOrigin=true)
DGtal::ITKWriter::exportITK
static bool exportITK(const std::string &filename, const Image &aImage, const Functor &aFunctor=Functor())
DGtal::concepts::CImage
Aim: Defines the concept describing a read/write image, having an output iterator.
Definition
CImage.h:103
test_image
bool test_image(const string &filename)
Definition
testITKio.cpp:49
testITKio
bool testITKio()
Definition
testITKio.cpp:145
testITKSpacingIO
bool testITKSpacingIO()
Definition
testITKio.cpp:103
main
int main(int, char **)
Definition
testIntegerComputer.cpp:331
domain
Domain domain
Definition
testProjection.cpp:88
image
Image image(domain)
tests
io
testITKio.cpp
Generated on
for DGtal by
1.18.0