DGtal  1.5.beta
testITKReader.cpp
Go to the documentation of this file.
1 
31 #include <iostream>
32 #include "DGtal/base/Common.h"
33 #include "ConfigTest.h"
34 #include "DGtalCatch.h"
35 #include "DGtal/helpers/StdDefs.h"
36 #include "DGtal/images/ImageContainerBySTLVector.h"
37 #include "DGtal/io/readers/ITKReader.h"
39 
40 using namespace std;
41 using namespace DGtal;
42 
44 // Functions for testing class ITKReader.
46 
47 
53 template <typename PixelType>
54 void testSpatialInformation(const std::string &filename)
55 {
57 
58  DGtalImage img = DGtal::ITKReader<DGtalImage>::importITK(filename);
59 
60  typename DGtalImage::ITKImagePointer dgtal_itk = img.getITKImagePointer();
61 
62 
63  typedef itk::Image<PixelType, 3> ItkImage;
64  typedef itk::ImageFileReader<ItkImage> ReaderType;
65  typename ReaderType::Pointer reader = ReaderType::New();
66  reader->SetFileName(filename);
67 
68  reader->Update();
69 
70  typename ItkImage::Pointer itk = reader->GetOutput();
71 
72  INFO( "Checking spacing" )
73  REQUIRE( dgtal_itk->GetSpacing() == itk->GetSpacing() );
74  INFO( "Checking origin" )
75  REQUIRE( dgtal_itk->GetOrigin() == itk->GetOrigin() );
76  INFO( "Checking direction" )
77  REQUIRE( dgtal_itk->GetDirection() == itk->GetDirection() );
78 }
79 
80 
81 
82 TEST_CASE( "Testing ITKReader" )
83 {
84  // Default image selector = STLVector
88 
89  SECTION(
90  "Testing feature io/readers of ITKReader with 16 bits (uint16) images" )
91  {
92  Image3D16b im = ITKReader<Image3D16b>::importITK(
93  testPath + "samples/lobsterCroped16b.mhd" );
94  REQUIRE( ( im( Z3i::Point( 35, 29, 3 ) ) == 60400 ) );
95  }
96 
97  SECTION(
98  "Testing feature io/readers of ITKReader with rescaled 16 bits (uint16) "
99  "images" )
100  {
102  RescalFCT resc = RescalFCT( 0, 65535, 0, 255 );
103  Image3DUC im = ITKReader<Image3DUC>::importITK(
104  testPath + "samples/lobsterCroped16b.mhd", resc );
105  REQUIRE( ( im( Z3i::Point( 35, 29, 3 ) ) == resc( 60400 ) ) );
106  }
107  SECTION(
108  "Testing behavior of ITKReader on non existent image file" )
109  {
110  bool caughtException = false;
111  const std::string filename = testPath + "samples/null.mhd"; //non existent file
112  try
113  {
114  Image3DUC im = ITKReader<Image3DUC>::importITK(filename);
115  }
116  catch(exception &)
117  {
118  caughtException = true;
119  trace.info() <<"Exception was correctly caught" << std::endl;
120  }
121  REQUIRE( caughtException == true);
122  }
123 
124  SECTION(
125  "Checking spatial information when loading through DGtal" )
126  {
127  testSpatialInformation<int16_t>(testPath + "samples/lobsterCroped16b.mhd" );
128  testSpatialInformation<int16_t>(testPath + "samples/lobsterCropedB16b.mhd" );
129  }
130 
131  SECTION(
132  "Checking import with/without shifted domain")
133 
134  {
135  Image3Dd imShifted = ITKReader<Image3Dd>::importITK(testPath + "samples/lobsterCroped2.nii.gz",
137 
138  Image3Dd imNonShifted = ITKReader<Image3Dd>::importITK(testPath + "samples/lobsterCroped2.nii.gz", false );
139 
140  REQUIRE( ( imShifted( Z3i::Point( 144, 100, 21 ) ) == 113 ) );
141  REQUIRE( ( imNonShifted( Z3i::Point( 94, 50, 11 ) ) == 113 ) );
142  Z3i::Point pTarget (95,76,7);
143  auto i = 101*pTarget[1]+pTarget[0]+pTarget[2]*101*101;
144  trace.info() << "value:" << *(imNonShifted.range().begin()+i);
145  REQUIRE( ( *(imNonShifted.range().begin()+i) == *(imShifted.range().begin()+i ) ));
146  REQUIRE( ( *(imNonShifted.range().begin()+i) == 68 ));
147  }
148 
149 
150 }
151 
Aim: implements a model of CImageContainer using a ITK Image.
std::ostream & info()
DGtal is the top-level namespace which contains all DGtal functions and types.
Trace trace
Definition: Common.h:153
Aim: Import a 2D/3D Image using the ITK formats.
Definition: ITKReader.h:80
static Image importITK(const std::string &filename, const TFunctor &aFunctor=TFunctor(), bool shiftDomainUsingOrigin=true)
Aim: Define a simple functor using the static cast operator.
Aim: Functor allowing to rescale a value. Values of the initial scale [initMin,initMax] are rescaled ...
void testSpatialInformation(const std::string &filename)
TEST_CASE("Testing ITKReader")
SECTION("Testing constant forward iterators")
REQUIRE(domain.isInside(aPoint))