Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkLevelWindowManagerCppUnitTest.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 "mitkTestingMacros.h"
14 #include <mitkTestFixture.h>
15 
16 #include "mitkLevelWindowManager.h"
18 #include <itkComposeImageFilter.h>
19 #include <itkEventObject.h>
20 #include <itkImageDuplicator.h>
21 #include <itkImageIterator.h>
22 #include <mitkImageCast.h>
23 
24 class mitkLevelWindowManagerCppUnitTestSuite : public mitk::TestFixture
25 {
26  CPPUNIT_TEST_SUITE(mitkLevelWindowManagerCppUnitTestSuite);
27  MITK_TEST(TestMultiComponentRescaling);
28  CPPUNIT_TEST_SUITE_END();
29 
30 private:
31  mitk::Image::Pointer m_mitkMultiComponentImage;
32  mitk::Image::Pointer m_mitkImageComponent1;
33  mitk::Image::Pointer m_mitkImageComponent2;
34 
35 public:
36  void setUp() override
37  {
38  typedef itk::Image<double, 3> ImageType;
39  typedef itk::ImageRegionIterator<ImageType> ImageIteratorType;
40  typedef itk::ImageDuplicator<ImageType> DuplicatorType;
41  typedef itk::ComposeImageFilter<ImageType> CompositeFilterType;
42 
43  // generate two images with one component
44  ImageType::Pointer imageComponent1 = itk::Image<double, 3>::New();
45  ImageType::IndexType start;
46  start.Fill(0);
47  ImageType::SizeType size;
48  size.Fill(5);
49  ImageType::RegionType region;
50  region.SetSize(size);
51  region.SetIndex(start);
52  imageComponent1->SetRegions(region);
53  imageComponent1->Allocate();
54 
55  DuplicatorType::Pointer duplicator = DuplicatorType::New();
56  duplicator->SetInputImage(imageComponent1);
57  duplicator->Update();
58  ImageType::Pointer imageComponent2 = duplicator->GetOutput();
59 
60  // give them differing data
61  ImageIteratorType iterator1(imageComponent1, imageComponent1->GetLargestPossibleRegion());
62  iterator1.GoToBegin();
63  int i = 0;
64  while (!iterator1.IsAtEnd())
65  {
66  iterator1.Set((double)i);
67  ++iterator1;
68  ++i;
69  }
70 
71  ImageIteratorType iterator2(imageComponent2, imageComponent2->GetLargestPossibleRegion());
72  iterator2.GoToBegin();
73  i = 2000;
74  while (!iterator2.IsAtEnd())
75  {
76  iterator2.Set((double)i);
77  ++iterator2;
78  ++i;
79  }
80 
81  // copy into single VectorImage
82  CompositeFilterType::Pointer compositeFilter = CompositeFilterType::New();
83  compositeFilter->SetInput(0, imageComponent1);
84  compositeFilter->SetInput(1, imageComponent2);
85  compositeFilter->Update();
86  itk::VectorImage<double, 3>::Pointer multiComponentImage = compositeFilter->GetOutput();
87 
88  // cast images to mitk
89  mitk::CastToMitkImage(multiComponentImage, m_mitkMultiComponentImage);
90  mitk::CastToMitkImage(imageComponent1, m_mitkImageComponent1);
91  mitk::CastToMitkImage(imageComponent2, m_mitkImageComponent2);
92  }
93 
94  static mitk::LevelWindow getLevelWindowForImage(mitk::Image *image, unsigned component)
95  {
99 
100  try
101  {
102  manager->SetDataStorage(ds);
103  }
104  catch (std::exception &e)
105  {
106  MITK_ERROR << "Exception: " << e.what();
107  }
108 
110  node->SetData(image);
111  ds->Add(node);
112 
113  node->SetBoolProperty("selected", true);
114  node->SetIntProperty("Image.Displayed Component", component);
115 
116  mitk::LevelWindow levelWindow;
117  node->GetLevelWindow(levelWindow);
118  return levelWindow; // node is an image node because of predicates
119  }
120 
121  void TestMultiComponentRescaling()
122  {
123  // compute level windows for the three images
124  mitk::LevelWindow imageComponent1LevelWindow = getLevelWindowForImage(m_mitkImageComponent1, 0);
125  mitk::LevelWindow imageComponent2LevelWindow = getLevelWindowForImage(m_mitkImageComponent2, 0);
126  // calculate level window for second component in multi-component image
127  mitk::LevelWindow multiComponentImageLevelWindow = getLevelWindowForImage(m_mitkMultiComponentImage, 1);
128 
129  // compare level window boundaries. the multicomponent image level window
130  // should match the second image, since the second component was selected
131  CPPUNIT_ASSERT_EQUAL_MESSAGE("default lower bounds equal",
132  imageComponent2LevelWindow.GetDefaultLowerBound(),
133  multiComponentImageLevelWindow.GetDefaultLowerBound());
134 
135  CPPUNIT_ASSERT_EQUAL_MESSAGE("default upper bounds equal",
136  imageComponent2LevelWindow.GetDefaultUpperBound(),
137  multiComponentImageLevelWindow.GetDefaultUpperBound());
138 
139  CPPUNIT_ASSERT_EQUAL_MESSAGE(
140  "range equal", imageComponent2LevelWindow.GetRange(), multiComponentImageLevelWindow.GetRange());
141 
142  CPPUNIT_ASSERT(imageComponent1LevelWindow.GetDefaultLowerBound() !=
143  multiComponentImageLevelWindow.GetDefaultLowerBound());
144 
145  CPPUNIT_ASSERT(imageComponent1LevelWindow.GetDefaultUpperBound() !=
146  multiComponentImageLevelWindow.GetDefaultUpperBound());
147  }
148 };
149 
150 MITK_TEST_SUITE_REGISTRATION(mitkLevelWindowManagerCppUnit)
MITK_TEST_SUITE_REGISTRATION(mitkImageToItk)
itk::Image< unsigned char, 3 > ImageType
#define MITK_ERROR
Definition: mitkLogMacros.h:20
#define MITK_TEST(TESTMETHOD)
Adds a test to the current test suite.
ScalarType GetDefaultUpperBound() const
ScalarType GetDefaultLowerBound() const
The LevelWindow class Class to store level/window values.
static Pointer New()
ScalarType GetRange() const
returns the size of the grey value range
Image class for storing images.
Definition: mitkImage.h:72
Test fixture for parameterized tests.
mitk::Image::Pointer image
void CastToMitkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, itk::SmartPointer< mitk::Image > &mitkoutputimage)
Cast an itk::Image (with a specific type) to an mitk::Image.
Definition: mitkImageCast.h:74
static Pointer New()