DGtal 1.3.0
Loading...
Searching...
No Matches
testRawReader.cpp
Go to the documentation of this file.
1
35#include "DGtalCatch.h"
36#include <DGtal/base/Common.h>
37#include <DGtal/kernel/SpaceND.h>
38#include <DGtal/kernel/domains/HyperRectDomain.h>
39#include <DGtal/images/ImageSelector.h>
40#include <DGtal/io/readers/RawReader.h>
41#include <DGtal/io/writers/RawWriter.h>
42#include <DGtal/kernel/domains/Linearizer.h>
43
44#include <ConfigTest.h>
45
46#include <string>
47
49
50using namespace std;
51using namespace DGtal;
52
54
59template <
60 typename Image
61>
62void testImageOnRef( Image const& anImage )
63{
64 typedef typename Image::Domain Domain;
65 typedef typename Domain::Point Point;
66
67 // Checking domain
68 INFO( "Checking domain" )
69 REQUIRE( anImage.domain().lowerBound() == Point::diagonal(0) );
70 REQUIRE( anImage.domain().upperBound() == Point::diagonal(4) );
71
72 // Checking values
73 INFO( "Checking values" )
74 const Domain domain = anImage.domain();
75 for ( typename Domain::ConstIterator it = domain.begin(), itEnd = domain.end(); it != itEnd; ++it )
76 {
77 const Point pt = *it;
78 const unsigned int refValue = anImage.dimension == 2 ?
79 1000000 * pt[0] * pt[1]
80 : 250000 * pt[0] * pt[1] * pt[2];
81
82 INFO( "At point " << pt );
83 REQUIRE( anImage( pt ) == refValue );
84 }
85}
86
90template <
92>
94{
95 REQUIRE( N >= 2 );
96 REQUIRE( N <= 3 );
97
98 typedef SpaceND<N> Space;
101 typedef typename Domain::Vector Vector;
102
103 // Generating file name
104 std::string fileName = testPath + "samples/";
105 if ( N == 2)
106 fileName += "raw32bits5x5.raw";
107 else
108 fileName += "raw32bits5x5x5.raw";
109
110 // Reading file
111 const Vector extent = Vector::diagonal(5);
112
113 INFO( "Reading file with importRaw32" << fileName );
114 Image imageRaw32 = RawReader<Image>::importRaw32( fileName, extent );
115 testImageOnRef( imageRaw32 );
116
117 INFO( "Reading file with importRaw" << fileName );
118 Image imageRaw = RawReader<Image>::template importRaw< unsigned int >( fileName, extent );
119 testImageOnRef( imageRaw );
120}
121
127template <
128 typename Image
129>
130void generateRefImage( Image & anImage, typename Image::Value aSeed )
131{
132 typedef typename Image::Domain Domain;
133 typedef typename Domain::Point Point;
134
135 const Domain domain = anImage.domain();
136
137 for ( typename Domain::ConstIterator it = domain.begin(), itEnd = domain.end(); it != itEnd; ++it )
138 {
139 const Point pt = *it;
140 const typename Image::Value refValue = aSeed * Linearizer<Domain, RowMajorStorage>::getIndex( pt, domain );
141 anImage.setValue( pt, refValue );
142 }
143}
144
151template <
153 typename T,
154 template<typename> class RawIO
155>
156void testWriteAndRead( T aSeed )
157{
158 typedef SpaceND<N> Space;
160 typedef typename ImageSelector<Domain, T>::Type Image;
161 typedef typename Domain::Point Point;
162
163 Point upperPt;
164 upperPt[ 0 ] = 8;
165 for ( Dimension i = 1; i < N; ++i )
166 upperPt[ i ] = upperPt[ i-1 ] * ( i == 1 ? 4 : 2 );
167
168 const Domain domain( Point::diagonal(0), upperPt );
170 generateRefImage( refImage, aSeed );
171
172 INFO( "Writing image" );
173 RawIO<Image>::write( "export-raw-writer.raw", refImage );
174
175 INFO( "Reading image" );
176 Image image = RawIO<Image>::read( "export-raw-writer.raw", upperPt + Point::diagonal(1) );
177
178 INFO( "Comparing image values" );
179 for ( typename Domain::ConstIterator it = domain.begin(), itEnd = domain.end(); it != itEnd; ++it )
180 {
181 const Point pt = *it;
182 INFO( "At point " << pt );
183 REQUIRE( image( pt ) == refImage( pt ) );
184 }
185}
186
187// Some RawIO classes
188template < typename Image >
189struct RawIO8
190{
191 static inline Image read( std::string const& filename, typename Image::Domain::Vector const& extent )
192 {
193 return DGtal::RawReader<Image>::importRaw8( filename, extent );
194 }
195
196 static inline bool write( std::string const& filename, Image const& anImage )
197 {
198 return DGtal::RawWriter<Image>::exportRaw8( filename, anImage );
199 }
200};
201
202template < typename Image >
203struct RawIO16
204{
205 static inline Image read( std::string const& filename, typename Image::Domain::Vector const& extent )
206 {
207 return DGtal::RawReader<Image>::importRaw16( filename, extent );
208 }
209
210 static inline bool write( std::string const& filename, Image const& anImage )
211 {
212 return DGtal::RawWriter<Image>::exportRaw16( filename, anImage );
213 }
214};
215
216template < typename Image >
217struct RawIO32
218{
219 static inline Image read( std::string const& filename, typename Image::Domain::Vector const& extent )
220 {
221 return DGtal::RawReader<Image>::importRaw32( filename, extent );
222 }
223
224 static inline bool write( std::string const& filename, Image const& anImage )
225 {
226 return DGtal::RawWriter<Image>::exportRaw32( filename, anImage );
227 }
228};
229
230template < typename Image >
231struct RawIO
232{
233 static inline Image read( std::string const& filename, typename Image::Domain::Vector const& extent )
234 {
235 return DGtal::RawReader<Image>::template importRaw< typename Image::Value>( filename, extent );
236 }
237
238 static inline bool write( std::string const& filename, Image const& anImage )
239 {
240 return DGtal::RawWriter<Image>::template exportRaw< typename Image::Value>( filename, anImage );
241 }
242};
243
245
246TEST_CASE( "Checking RawReader with reference files in 2D", "[reader][2D][raw][raw32][uint32]" )
247{
248 testRawReaderOnRef<2>();
249}
250
251TEST_CASE( "Checking RawReader with reference files in 3D", "[reader][3D][raw][raw32][uint32]" )
252{
253 testRawReaderOnRef<3>();
254}
255
256// Signed and unsigned char
257TEST_CASE( "Checking writing & reading uint8 in 2D with generic IO", "[reader][writer][2D][raw][uint8]" )
258{
259 testWriteAndRead<2, DGtal::uint8_t, RawIO>( 1 );
260}
261
262TEST_CASE( "Checking writing & reading uint8 in 2D with 8bits IO", "[reader][writer][2D][raw8][uint8]" )
263{
264 testWriteAndRead<2, DGtal::uint8_t, RawIO>( 1 );
265}
266
267TEST_CASE( "Checking writing & reading int8 in 2D with generic IO", "[reader][writer][2D][raw][int8]" )
268{
269 testWriteAndRead<2, DGtal::int8_t, RawIO>( 1 );
270}
271
272// Signed and unsigned short
273TEST_CASE( "Checking writing & reading uint16 in 2D with generic IO", "[reader][writer][2D][raw][uint16]" )
274{
275 testWriteAndRead<2, DGtal::uint16_t, RawIO>( 1 );
276}
277
278TEST_CASE( "Checking writing & reading uint16 in 2D with 16bits IO", "[reader][writer][2D][raw16][uint16]" )
279{
280 testWriteAndRead<2, DGtal::uint16_t, RawIO>( 1 );
281}
282
283TEST_CASE( "Checking writing & reading int16 in 2D with generic IO", "[reader][writer][2D][raw][int16]" )
284{
285 testWriteAndRead<2, DGtal::int16_t, RawIO>( 1 );
286}
287
288// Signed and unsigned int
289TEST_CASE( "Checking writing & reading uint32 in 2D with generic IO", "[reader][writer][2D][raw][uint32]" )
290{
291 testWriteAndRead<2, DGtal::uint32_t, RawIO>( 1 );
292}
293
294TEST_CASE( "Checking writing & reading uint32 in 2D with 32bits IO", "[reader][writer][2D][raw32][uint32]" )
295{
296 testWriteAndRead<2, DGtal::uint32_t, RawIO>( 1 );
297}
298
299TEST_CASE( "Checking writing & reading int32 in 2D with generic IO", "[reader][writer][2D][raw][int32]" )
300{
301 testWriteAndRead<2, DGtal::int32_t, RawIO>( 1 );
302}
303
304// Signed and unsigned long int
305TEST_CASE( "Checking writing & reading uint64 in 2D with generic IO", "[reader][writer][2D][raw][uint64]" )
306{
307 testWriteAndRead<2, DGtal::uint64_t, RawIO>( 1 );
308}
309
310TEST_CASE( "Checking writing & reading int64 in 2D with generic IO", "[reader][writer][2D][raw][int64]" )
311{
312 testWriteAndRead<2, DGtal::int64_t, RawIO>( 1 );
313}
314
315// Double
316TEST_CASE( "Checking writing & reading double in 1D with generic IO", "[reader][writer][1D][raw][double]" )
317{
318 testWriteAndRead<1, double, RawIO>( 1.23456789 );
319}
320
321TEST_CASE( "Checking writing & reading double in 2D with generic IO", "[reader][writer][2D][raw][double]" )
322{
323 testWriteAndRead<2, double, RawIO>( 1.23456789 );
324}
325
326TEST_CASE( "Checking writing & reading double in 3D with generic IO", "[reader][writer][3D][raw][double]" )
327{
328 testWriteAndRead<3, double, RawIO>( 1.23456789 );
329}
330
Iterator for HyperRectDomain.
const ConstIterator & begin() const
const ConstIterator & end() const
Aim: implements association bewteen points lying in a digital domain and values.
Definition: Image.h:70
const Domain & domain() const
Definition: Image.h:192
void setValue(const Point &aPoint, const Value &aValue)
Definition: Image.h:247
DGtal is the top-level namespace which contains all DGtal functions and types.
DGtal::uint32_t Dimension
Definition: Common.h:137
STL namespace.
Aim: Linearization and de-linearization interface for domains.
Definition: Linearizer.h:78
Aim: Raw binary import of an Image.
Definition: RawReader.h:94
static ImageContainer importRaw8(const std::string &filename, const Vector &extent, const Functor &aFunctor=Functor())
static ImageContainer importRaw16(const std::string &filename, const Vector &extent, const Functor &aFunctor=Functor())
static ImageContainer importRaw32(const std::string &filename, const Vector &extent, const Functor &aFunctor=Functor())
Aim: Raw binary export of an Image.
Definition: RawWriter.h:99
static bool exportRaw32(const std::string &filename, const Image &anImage, const Functor &aFunctor=Functor())
static bool exportRaw8(const std::string &filename, const Image &anImage, const Functor &aFunctor=Functor())
static bool exportRaw16(const std::string &filename, const Image &anImage, const Functor &aFunctor=Functor())
MyPointD Point
Definition: testClone2.cpp:383
FreemanChain< int >::Vector Vector
Domain domain
void testWriteAndRead(T aSeed)
void testRawReaderOnRef()
void testImageOnRef(Image const &anImage)
TEST_CASE("Checking RawReader with reference files in 2D", "[reader][2D][raw][raw32][uint32]")
void generateRefImage(Image &anImage, typename Image::Value aSeed)
HyperRectDomain< Space > Domain
REQUIRE(domain.isInside(aPoint))
Image refImage(domain)