Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkSurfaceToImageFilterTest.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 <mitkIOUtil.h>
15 #include <mitkImageWriteAccessor.h>
16 #include <mitkTestingMacros.h>
17 
19 
20 #include "mitkTestFixture.h"
21 #include <vtkPolyData.h>
22 
23 class mitkSurfaceToImageFilterTestSuite : public mitk::TestFixture
24 {
25  CPPUNIT_TEST_SUITE(mitkSurfaceToImageFilterTestSuite);
26  MITK_TEST(test3DSurfaceValidOutput);
27  MITK_TEST(test3DSurfaceCorrect);
28  MITK_TEST(test3DSurfaceIn4DImage);
29  CPPUNIT_TEST_SUITE_END();
30 
31 private:
33  mitk::Surface::Pointer m_Surface;
34 
35 public:
40  void setUp() override { m_Surface = mitk::IOUtil::Load<mitk::Surface>(GetTestDataFilePath("ball.stl")); }
41  void tearDown() override {}
42  void test3DSurfaceValidOutput()
43  {
45 
46  mitk::Image::Pointer additionalInputImage = mitk::Image::New();
47  additionalInputImage->Initialize(mitk::MakeScalarPixelType<unsigned int>(), *m_Surface->GetTimeGeometry());
48 
49  // Arrange the filter
50  surfaceToImageFilter->MakeOutputBinaryOn();
51  surfaceToImageFilter->SetInput(m_Surface);
52  surfaceToImageFilter->SetImage(additionalInputImage);
53  surfaceToImageFilter->Update();
54 
55  CPPUNIT_ASSERT_MESSAGE(
56  "SurfaceToImageFilter_AnyInputImageAndModeSetToBinary_ResultIsImageWithUCHARPixelType",
57  surfaceToImageFilter->GetOutput()->GetPixelType().GetComponentType() == itk::ImageIOBase::UCHAR);
58 
59  surfaceToImageFilter->SetUShortBinaryPixelType(true);
60  surfaceToImageFilter->Update();
61 
62  CPPUNIT_ASSERT_MESSAGE(
63  "SurfaceToImageFilter_AnyInputImageAndModeSetToBinary_ResultIsImageWithUCHARPixelType",
64  surfaceToImageFilter->GetOutput()->GetPixelType().GetComponentType() == itk::ImageIOBase::USHORT);
65  }
66 
67  void test3DSurfaceCorrect()
68  {
70 
71  // todo I don't know if this image is always needed. There is no documentation of the filter. Use git blame and ask
72  // the author.
73  mitk::Image::Pointer additionalInputImage = mitk::Image::New();
74  auto *dims = new unsigned int[3];
75  dims[0] = 32;
76  dims[1] = 32;
77  dims[2] = 32;
78  additionalInputImage->Initialize(mitk::MakeScalarPixelType<unsigned int>(), 3, dims);
79  additionalInputImage->SetOrigin(m_Surface->GetGeometry()->GetOrigin());
80  additionalInputImage->GetGeometry()->SetIndexToWorldTransform(m_Surface->GetGeometry()->GetIndexToWorldTransform());
81  // Arrange the filter
82  // The docu does not really tell if this is always needed. Could we skip SetImage in any case?
83  surfaceToImageFilter->MakeOutputBinaryOn();
84  surfaceToImageFilter->SetInput(m_Surface);
85  surfaceToImageFilter->SetImage(additionalInputImage);
86  surfaceToImageFilter->Update();
87 
88  mitk::ImagePixelReadAccessor<unsigned char, 3> outputReader(surfaceToImageFilter->GetOutput());
89  itk::Index<3> idx;
90  bool valuesCorrect = true;
91  // Values outside the ball should be 0
92  idx[0] = 0;
93  idx[1] = 0, idx[2] = 0;
94  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
95  idx[0] = 0;
96  idx[1] = 15, idx[2] = 15;
97  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
98  idx[0] = 15;
99  idx[1] = 15, idx[2] = 0;
100  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
101  idx[0] = 15;
102  idx[1] = 0, idx[2] = 15;
103  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
104  idx[0] = 5;
105  idx[1] = 9, idx[2] = 23;
106  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
107  // Values inside the ball should be 1
108  idx[0] = 15;
109  idx[1] = 15, idx[2] = 15;
110  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
111  idx[0] = 31;
112  idx[1] = 15, idx[2] = 15;
113  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
114  idx[0] = 2;
115  idx[1] = 15, idx[2] = 15;
116  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
117  idx[0] = 15;
118  idx[1] = 15, idx[2] = 2;
119  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
120  idx[0] = 15;
121  idx[1] = 2, idx[2] = 15;
122  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
123  idx[0] = 6;
124  idx[1] = 9, idx[2] = 23;
125  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
126 
127  CPPUNIT_ASSERT_MESSAGE("SurfaceToImageFilter_BallSurfaceAsInput_OutputCorrect", valuesCorrect == true);
128  }
129 
130  void test3DSurfaceIn4DImage()
131  {
133 
134  mitk::Image::Pointer additionalInputImage = mitk::Image::New();
135  auto *dims = new unsigned int[4];
136  dims[0] = 32;
137  dims[1] = 32;
138  dims[2] = 32;
139  dims[3] = 2;
140  additionalInputImage->Initialize(mitk::MakeScalarPixelType<unsigned int>(), 4, dims);
141  additionalInputImage->SetOrigin(m_Surface->GetGeometry()->GetOrigin());
142  additionalInputImage->GetGeometry()->SetIndexToWorldTransform(m_Surface->GetGeometry()->GetIndexToWorldTransform());
143  mitk::Image::Pointer secondStep = additionalInputImage->Clone();
144 
145  unsigned int size = sizeof(unsigned char);
146  for (unsigned int i = 0; i < secondStep->GetDimension(); ++i)
147  {
148  size *= secondStep->GetDimension(i);
149  }
150 
151  {
152  mitk::ImageWriteAccessor accessor(secondStep);
153  memset(accessor.GetData(), 1, size);
154  }
155 
156  additionalInputImage->GetTimeGeometry()->Expand(2);
157  additionalInputImage->GetGeometry(1)->SetSpacing(secondStep->GetGeometry()->GetSpacing());
158  additionalInputImage->GetGeometry(1)->SetOrigin(secondStep->GetGeometry()->GetOrigin());
159  additionalInputImage->GetGeometry(1)->SetIndexToWorldTransform(
160  secondStep->GetGeometry()->GetIndexToWorldTransform());
161 
162  {
163  mitk::ImageReadAccessor readAccess(secondStep);
164  additionalInputImage->SetImportVolume(readAccess.GetData(), 0);
165  additionalInputImage->SetImportVolume(readAccess.GetData(), 1);
166  }
167 
168  // Arrange the filter
169  surfaceToImageFilter->MakeOutputBinaryOn();
170  surfaceToImageFilter->SetInput(m_Surface);
171  surfaceToImageFilter->SetImage(additionalInputImage);
172 
173  surfaceToImageFilter->Update();
174 
175  mitk::ImagePixelReadAccessor<unsigned char, 4> outputReader(surfaceToImageFilter->GetOutput());
176  itk::Index<4> idx;
177  bool valuesCorrect = true;
178  // Values outside the ball should be 0
179  idx[0] = 0;
180  idx[1] = 0, idx[2] = 0;
181  idx[3] = 0;
182  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
183  idx[0] = 0;
184  idx[1] = 15, idx[2] = 15;
185  idx[3] = 0;
186  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
187  idx[0] = 15;
188  idx[1] = 15, idx[2] = 0;
189  idx[3] = 0;
190  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
191  idx[0] = 15;
192  idx[1] = 0, idx[2] = 15;
193  idx[3] = 0;
194  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
195  idx[0] = 5;
196  idx[1] = 9, idx[2] = 23;
197  idx[3] = 0;
198  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
199  // Values inside the ball should be 1 hould be 1
200  idx[0] = 15;
201  idx[1] = 15, idx[2] = 15;
202  idx[3] = 0;
203  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
204  idx[0] = 31;
205  idx[1] = 15, idx[2] = 15;
206  idx[3] = 0;
207  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
208  idx[0] = 2;
209  idx[1] = 15, idx[2] = 15;
210  idx[3] = 0;
211  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
212  idx[0] = 15;
213  idx[1] = 15, idx[2] = 2;
214  idx[3] = 0;
215  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
216  idx[0] = 15;
217  idx[1] = 2, idx[2] = 15;
218  idx[3] = 0;
219  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
220  idx[0] = 6;
221  idx[1] = 9, idx[2] = 23;
222  idx[3] = 0;
223  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 1);
224  // Values inside the ball but in the second timestep hould be 0
225  idx[0] = 15;
226  idx[1] = 15, idx[2] = 15;
227  idx[3] = 1;
228  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
229  idx[0] = 31;
230  idx[1] = 15, idx[2] = 15;
231  idx[3] = 1;
232  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
233  idx[0] = 2;
234  idx[1] = 15, idx[2] = 15;
235  idx[3] = 1;
236  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
237  idx[0] = 15;
238  idx[1] = 15, idx[2] = 2;
239  idx[3] = 1;
240  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
241  idx[0] = 15;
242  idx[1] = 2, idx[2] = 15;
243  idx[3] = 1;
244  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
245  idx[0] = 6;
246  idx[1] = 9, idx[2] = 23;
247  idx[3] = 1;
248  valuesCorrect = valuesCorrect && (outputReader.GetPixelByIndex(idx) == 0);
249 
250  CPPUNIT_ASSERT_MESSAGE("SurfaceToImageFilter_BallSurfaceAsInput_Output4DCorrect", valuesCorrect == true);
251  }
252 };
253 MITK_TEST_SUITE_REGISTRATION(mitkSurfaceToImageFilter)
Gives locked and index-based read access for a particular image part. The class provides several set-...
MITK_TEST_SUITE_REGISTRATION(mitkImageToItk)
#define MITK_TEST(TESTMETHOD)
Adds a test to the current test suite.
static std::string GetTestDataFilePath(const std::string &testData)
Get the absolute path for test data.
Test fixture for parameterized tests.
static Pointer New()
ImageWriteAccessor class to get locked write-access for a particular image part.
ImageReadAccessor class to get locked read access for a particular image part.