Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkAccessByItkTest.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #include <stdexcept>
14 
15 #include "mitkTestingMacros.h"
16 
17 #include <mitkITKImageImport.h>
18 #include <mitkImageAccessByItk.h>
19 
20 #define TestImageType(type, dim) \
21  MITK_TEST_CONDITION(typeid(type) == typeid(TPixel) && dim == VDimension, \
22  "Checking for correct type itk::Image<" #type "," #dim ">")
23 
24 #define TestVectorImageType(type, dim) \
25  MITK_TEST_CONDITION(typeid(type) == typeid(TPixel) && dim == VDimension && \
26  typeid(itk::VariableLengthVector<type>) == typeid(typename ImageType::PixelType), \
27  "Checking for correct type itk::VectorImage<" #type "," #dim ">")
28 
29 class AccessByItkTest
30 {
31 public:
32  typedef AccessByItkTest Self;
33 
34  typedef itk::Image<int, 2> IntImage2D;
35  typedef itk::Image<int, 3> IntImage3D;
36  typedef itk::Image<float, 2> FloatImage2D;
37  typedef itk::Image<float, 3> FloatImage3D;
38 
39  typedef itk::VectorImage<int, 3> IntVectorImage3D;
40 
41  enum EImageType
42  {
43  Unknown = 0,
44  Int2D,
45  Int3D,
46  Float2D,
47  Float3D
48  };
49 
50  void testAccessByItk()
51  {
52  mitk::Image::Pointer mitkIntImage2D = createMitkImage<IntImage2D>();
53  mitk::Image::ConstPointer mitkIntImage3D(createMitkImage<IntImage3D>());
54  mitk::Image::ConstPointer mitkFloatImage2D(createMitkImage<FloatImage2D>());
55  mitk::Image::Pointer mitkFloatImage3D = createMitkImage<FloatImage3D>();
56 
57  AccessByItk(mitkIntImage2D, AccessItkImage);
58  AccessByItk(mitkIntImage3D, AccessItkImage);
59  AccessByItk(mitkFloatImage2D, AccessItkImage);
60  AccessByItk(mitkFloatImage3D, AccessItkImage);
61 
62  AccessByItk_n(mitkIntImage2D, AccessItkImage, (Int2D, 2));
63  AccessByItk_n(mitkIntImage3D, AccessItkImage, (Int3D, 2));
64  AccessByItk_n(mitkFloatImage2D, AccessItkImage, (Float2D, 2));
65  AccessByItk_n(mitkFloatImage3D, AccessItkImage, (Float3D, 2));
66 
67  mitk::Image::Pointer mitkIntVectorImage3D = createMitkImage<IntVectorImage3D>(2);
68 
69  // Test for wrong pixel type (the AccessByItk macro multi-plexes integral
70  // types only by default)
72  AccessByItk(mitkIntVectorImage3D, AccessItkImage);
74 
75  // Test for correct handling of vector images
76  AccessVectorPixelTypeByItk(mitkIntVectorImage3D, AccessItkImage);
77  AccessVectorPixelTypeByItk_n(mitkIntVectorImage3D, AccessItkImage, (Int3D, 2));
78  }
79 
80  void testAccessFixedDimensionByItk()
81  {
82  mitk::Image::Pointer mitkIntImage2D = createMitkImage<IntImage2D>();
83  mitk::Image::ConstPointer mitkIntImage3D(createMitkImage<IntImage3D>());
84  mitk::Image::ConstPointer mitkFloatImage2D(createMitkImage<FloatImage2D>());
85  mitk::Image::Pointer mitkFloatImage3D = createMitkImage<FloatImage3D>();
86 
87  AccessFixedDimensionByItk(mitkIntImage2D, AccessItkImage, 2);
88  AccessFixedDimensionByItk(mitkIntImage3D, AccessItkImage, 3);
89  AccessFixedDimensionByItk(mitkFloatImage2D, AccessItkImage, 2);
90  AccessFixedDimensionByItk(mitkFloatImage3D, AccessItkImage, 3);
91 
92  AccessFixedDimensionByItk_n(mitkIntImage2D, AccessItkImage, 2, (Int2D, 2));
93  AccessFixedDimensionByItk_n(mitkIntImage3D, AccessItkImage, 3, (Int3D, 2));
94  AccessFixedDimensionByItk_n(mitkFloatImage2D, AccessItkImage, 2, (Float2D, 2));
95  AccessFixedDimensionByItk_n(mitkFloatImage3D, AccessItkImage, 3, (Float3D, 2));
96 
97  // Test for wrong dimension
99  AccessFixedDimensionByItk(mitkFloatImage3D, AccessItkImage, 2);
101 
103  AccessFixedDimensionByItk_n(mitkFloatImage3D, AccessItkImage, 2, (Float3D, 2));
105  }
106 
107  void testAccessFixedPixelTypeByItk()
108  {
109  mitk::Image::Pointer mitkIntImage2D = createMitkImage<IntImage2D>();
110  mitk::Image::ConstPointer mitkIntImage3D(createMitkImage<IntImage3D>());
111  mitk::Image::ConstPointer mitkFloatImage2D(createMitkImage<FloatImage2D>());
112  mitk::Image::Pointer mitkFloatImage3D = createMitkImage<FloatImage3D>();
113 
114  AccessFixedPixelTypeByItk(mitkIntImage2D, AccessItkImage, (int)(float));
115  AccessFixedPixelTypeByItk(mitkIntImage3D, AccessItkImage, (int)(float));
116  AccessFixedPixelTypeByItk(mitkFloatImage2D, AccessItkImage, (int)(float));
117  AccessFixedPixelTypeByItk(mitkFloatImage3D, AccessItkImage, (int)(float));
118 
119  AccessFixedPixelTypeByItk_n(mitkIntImage2D, AccessItkImage, (int)(float), (Int2D, 2));
120  AccessFixedPixelTypeByItk_n(mitkIntImage3D, AccessItkImage, (int)(float), (Int3D, 2));
121  AccessFixedPixelTypeByItk_n(mitkFloatImage2D, AccessItkImage, (int)(float), (Float2D, 2));
122  AccessFixedPixelTypeByItk_n(mitkFloatImage3D, AccessItkImage, (int)(float), (Float3D, 2));
123 
124  // Test for wrong pixel type
126  AccessFixedPixelTypeByItk(mitkFloatImage3D, AccessItkImage, (int));
128 
130  AccessFixedPixelTypeByItk_n(mitkFloatImage3D, AccessItkImage, (int), (Float3D, 2));
132  }
133 
134  void testAccessFixedTypeByItk()
135  {
136  mitk::Image::Pointer mitkIntImage2D = createMitkImage<IntImage2D>();
137  mitk::Image::ConstPointer mitkIntImage3D(createMitkImage<IntImage3D>());
138  mitk::Image::ConstPointer mitkFloatImage2D(createMitkImage<FloatImage2D>());
139  mitk::Image::Pointer mitkFloatImage3D = createMitkImage<FloatImage3D>();
140 
141  AccessFixedTypeByItk(mitkIntImage2D, AccessItkImage, (int)(float), (2)(3));
142  AccessFixedTypeByItk(mitkIntImage3D, AccessItkImage, (int)(float), (2)(3));
143  AccessFixedTypeByItk(mitkFloatImage2D, AccessItkImage, (int)(float), (2)(3));
144  AccessFixedTypeByItk(mitkFloatImage3D, AccessItkImage, (int)(float), (2)(3));
145 
146  AccessFixedTypeByItk_n(mitkIntImage2D, AccessItkImage, (int)(float), (2)(3), (Int2D, 2));
147  AccessFixedTypeByItk_n(mitkIntImage3D, AccessItkImage, (int)(float), (2)(3), (Int3D, 2));
148  AccessFixedTypeByItk_n(mitkFloatImage2D, AccessItkImage, (int)(float), (2)(3), (Float2D, 2));
149  AccessFixedTypeByItk_n(mitkFloatImage3D, AccessItkImage, (int)(float), (2)(3), (Float3D, 2));
150 
151  // Test for wrong dimension
153  AccessFixedTypeByItk(mitkFloatImage3D, AccessItkImage, (float), (2));
155 
157  AccessFixedTypeByItk_n(mitkFloatImage3D, AccessItkImage, (float), (2), (Float3D, 2));
159 
160  // Test for wrong pixel type
162  AccessFixedTypeByItk(mitkFloatImage3D, AccessItkImage, (int), (3));
164 
166  AccessFixedTypeByItk_n(mitkFloatImage3D, AccessItkImage, (int), (3), (Float3D, 2));
168  }
169 
170  void testAccessTwoImagesFixedDimensionByItk()
171  {
172  mitk::Image::Pointer mitkIntImage2D = createMitkImage<IntImage2D>();
173  mitk::Image::ConstPointer mitkFloatImage2D(createMitkImage<FloatImage2D>());
174 
175  AccessTwoImagesFixedDimensionByItk(mitkIntImage2D, mitkFloatImage2D, AccessTwoItkImages, 2);
176  }
177 
178  template <typename TPixel, unsigned int VDimension>
179  void AccessItkImage(const itk::Image<TPixel, VDimension> *,
180  EImageType param1 = Unknown,
181  int param2 = 0,
182  int param3 = 0)
183  {
184  switch (param1)
185  {
186  case Int2D:
187  TestImageType(int, 2) break;
188  case Int3D:
189  TestImageType(int, 3) break;
190  case Float2D:
191  TestImageType(float, 2) break;
192  case Float3D:
193  TestImageType(float, 3) break;
194  default:
195  break;
196  }
197 
198  if (param2)
199  {
200  MITK_TEST_CONDITION(param2 == 2, "Checking for correct second parameter")
201  }
202  if (param3)
203  {
204  MITK_TEST_CONDITION(param3 == 3, "Checking for correct third parameter")
205  }
206  }
207 
208  template <typename TPixel, unsigned int VDimension>
209  void AccessItkImage(itk::VectorImage<TPixel, VDimension> *,
210  EImageType param1 = Unknown,
211  int param2 = 0,
212  int param3 = 0)
213  {
214  typedef itk::VectorImage<TPixel, VDimension> ImageType;
215  switch (param1)
216  {
217  case Int2D:
218  TestVectorImageType(int, 2) break;
219  case Int3D:
220  TestVectorImageType(int, 3) break;
221  case Float2D:
222  TestVectorImageType(float, 2) break;
223  case Float3D:
224  TestVectorImageType(float, 3) break;
225  default:
226  break;
227  }
228 
229  if (param2)
230  {
231  MITK_TEST_CONDITION(param2 == 2, "Checking for correct second parameter")
232  }
233  if (param3)
234  {
235  MITK_TEST_CONDITION(param3 == 3, "Checking for correct third parameter")
236  }
237  }
238 
239 private:
240  template <typename TPixel1, unsigned int VDimension1, typename TPixel2, unsigned int VDimension2>
241  void AccessTwoItkImages(itk::Image<TPixel1, VDimension1> * /*itkImage1*/,
242  itk::Image<TPixel2, VDimension2> * /*itkImage2*/)
243  {
244  if (!(typeid(int) == typeid(TPixel1) && typeid(float) == typeid(TPixel2) && VDimension1 == 2 && VDimension2 == 2))
245  {
246  throw std::runtime_error("Image type mismatch");
247  }
248  }
249 
250  template <typename ImageType>
251  mitk::Image::Pointer createMitkImage()
252  {
253  typename ImageType::Pointer itkImage = ImageType::New();
254  typename ImageType::IndexType start;
255  start.Fill(0);
256  typename ImageType::SizeType size;
257  size.Fill(3);
258  typename ImageType::RegionType region;
259  region.SetSize(size);
260  region.SetIndex(start);
261  itkImage->SetRegions(region);
262  itkImage->Allocate();
263  return mitk::GrabItkImageMemory(itkImage);
264  }
265 
266  template <typename ImageType>
267  mitk::Image::Pointer createMitkImage(std::size_t vectorLength)
268  {
269  typename ImageType::Pointer itkImage = ImageType::New();
270  typename ImageType::IndexType start;
271  start.Fill(0);
272  typename ImageType::SizeType size;
273  size.Fill(3);
274  typename ImageType::RegionType region;
275  region.SetSize(size);
276  region.SetIndex(start);
277  itkImage->SetRegions(region);
278  itkImage->SetVectorLength(vectorLength);
279  itkImage->Allocate();
280  return mitk::GrabItkImageMemory(itkImage);
281  }
282 };
283 
284 int mitkAccessByItkTest(int /*argc*/, char * /*argv*/ [])
285 {
286  MITK_TEST_BEGIN("AccessByItk")
287 
288  AccessByItkTest accessTest;
289 
290  MITK_TEST_OUTPUT(<< "Testing AccessByItk macro")
291  accessTest.testAccessByItk();
292 
293  MITK_TEST_OUTPUT(<< "Testing AccessFixedDimensionByItk macro")
294  accessTest.testAccessFixedDimensionByItk();
295 
296  MITK_TEST_OUTPUT(<< "Testing AccessFixedTypeByItk macro")
297  accessTest.testAccessFixedTypeByItk();
298 
299  MITK_TEST_OUTPUT(<< "Testing AccessFixedPixelTypeByItk macro")
300  accessTest.testAccessFixedPixelTypeByItk();
301 
302  MITK_TEST_OUTPUT(<< "Testing AccessTwoImagesFixedDimensionByItk macro")
303  accessTest.testAccessTwoImagesFixedDimensionByItk();
304 
305  MITK_TEST_END()
306 }
#define AccessFixedTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, dimSeq, va_tuple)
Access a mitk-image with known type (pixel type and dimension) by an itk-image with one or more param...
#define MITK_TEST_FOR_EXCEPTION_END(EXCEPTIONCLASS)
#define AccessFixedDimensionByItk(mitkImage, itkImageTypeFunction, dimension)
Access a mitk-image with known dimension by an itk-image.
itk::Image< unsigned char, 3 > ImageType
#define AccessFixedDimensionByItk_n(mitkImage, itkImageTypeFunction, dimension, va_tuple)
Access a mitk-image with known dimension by an itk-image with one or more parameters.
#define AccessFixedPixelTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, va_tuple)
Access a mitk-image with known pixeltype (but unknown dimension) by an itk-image with one or more par...
section GeneralTestsDeprecatedOldTestingStyle Deprecated macros All tests with MITK_TEST_BEGIN()
#define AccessByItk_n(mitkImage, itkImageTypeFunction, va_tuple)
Access a MITK image by an ITK image with one or more parameters.
#define TestImageType(type, dim)
int mitkAccessByItkTest(int, char *[])
Image::Pointer GrabItkImageMemory(itk::SmartPointer< ItkOutputImageType > &itkimage, mitk::Image *mitkImage=nullptr, const BaseGeometry *geometry=nullptr, bool update=true)
Grabs the memory of an itk::Image (with a specific type) and puts it into an mitk::Image.The memory is managed by the mitk::Image after calling this function. The itk::Image remains valid until the mitk::Image decides to free the memory.
#define MITK_TEST_OUTPUT(x)
Output some text.
#define AccessFixedTypeByItk(mitkImage, itkImageTypeFunction, pixelTypeSeq, dimSeq)
Access a mitk-image with known type (pixel type and dimension) by an itk-image.
#define AccessVectorPixelTypeByItk_n(mitkImage, itkImageTypeFunction, va_tuple)
Access a vector mitk::Image by an ITK vector image with one or more parameters.
#define TestVectorImageType(type, dim)
#define MITK_TEST_CONDITION(COND, MSG)
#define MITK_TEST_FOR_EXCEPTION_BEGIN(EXCEPTIONCLASS)
Begin block which should be checked for exceptions.
#define AccessByItk(mitkImage, itkImageTypeFunction)
Access a MITK image by an ITK image.
#define AccessFixedPixelTypeByItk(mitkImage, itkImageTypeFunction, pixelTypeSeq)
Access a mitk-image with known pixeltype (but unknown dimension) by an itk-image. ...
Exception class thrown in AccessByItk macros.
#define AccessVectorPixelTypeByItk(mitkImage, itkImageTypeFunction)
#define AccessTwoImagesFixedDimensionByItk(mitkImage1, mitkImage2, itkImageTypeFunction, dimension)
Access two mitk-images with known dimension by itk-images.
and MITK_TEST_END()