Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkAnisotropicIterativeClosestPointRegistrationTest.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>
14 #include <mitkSurface.h>
15 #include <mitkTestFixture.h>
16 #include <mitkTestingMacros.h>
17 #include <vtkCleanPolyData.h>
18 
22 
27 class mitkAnisotropicIterativeClosestPointRegistrationTestSuite : public mitk::TestFixture
28 {
29  CPPUNIT_TEST_SUITE(mitkAnisotropicIterativeClosestPointRegistrationTestSuite);
30  MITK_TEST(testAicpRegistration);
31  MITK_TEST(testTrimmedAicpregistration);
32  CPPUNIT_TEST_SUITE_END();
33 
34 private:
35  typedef itk::Matrix<double, 3, 3> Matrix3x3;
36  typedef itk::Vector<double, 3> Vector3;
37  typedef std::vector<Matrix3x3> CovarianceMatrixList;
38 
39  mitk::Surface::Pointer m_MovingSurface;
40  mitk::Surface::Pointer m_FixedSurface;
41 
42  mitk::PointSet::Pointer m_TargetsMovingSurface;
43  mitk::PointSet::Pointer m_TargetsFixedSurface;
44 
45  CovarianceMatrixList m_SigmasMovingSurface;
46  CovarianceMatrixList m_SigmasFixedSurface;
47 
48  double m_FRENormalizationFactor;
49 
50 public:
56  void setUp() override
57  {
58  mitk::CovarianceMatrixCalculator::Pointer matrixCalculator = mitk::CovarianceMatrixCalculator::New();
59 
60  m_MovingSurface = mitk::IOUtil::Load<mitk::Surface>(GetTestDataFilePath("AICPRegistration/head_green.stl"));
61  m_FixedSurface = mitk::IOUtil::Load<mitk::Surface>(GetTestDataFilePath("AICPRegistration/head_red.stl"));
62 
63  m_TargetsMovingSurface = mitk::IOUtil::Load<mitk::PointSet>(GetTestDataFilePath("AICPRegistration/targets_head_green.mps"));
64  m_TargetsFixedSurface = mitk::IOUtil::Load<mitk::PointSet>(GetTestDataFilePath("AICPRegistration/targets_head_red.mps"));
65 
66  // compute covariance matrices
67  matrixCalculator->SetInputSurface(m_MovingSurface);
68  matrixCalculator->ComputeCovarianceMatrices();
69  m_SigmasMovingSurface = matrixCalculator->GetCovarianceMatrices();
70  const double meanVarX = matrixCalculator->GetMeanVariance();
71 
72  matrixCalculator->SetInputSurface(m_FixedSurface);
73  matrixCalculator->ComputeCovarianceMatrices();
74  m_SigmasFixedSurface = matrixCalculator->GetCovarianceMatrices();
75  const double meanVarY = matrixCalculator->GetMeanVariance();
76 
77  m_FRENormalizationFactor = sqrt(meanVarX + meanVarY);
78  }
79 
80  void tearDown() override
81  {
82  m_MovingSurface = nullptr;
83  m_FixedSurface = nullptr;
84 
85  m_TargetsMovingSurface = nullptr;
86  m_TargetsFixedSurface = nullptr;
87 
88  m_SigmasMovingSurface.clear();
89  m_SigmasFixedSurface.clear();
90  }
91 
92  void testAicpRegistration()
93  {
94  const double expFRE = 27.5799;
95  const double expTRE = 1.68835;
96  mitk::AnisotropicIterativeClosestPointRegistration::Pointer aICP =
98 
99  // set up parameters
100  aICP->SetMovingSurface(m_MovingSurface);
101  aICP->SetFixedSurface(m_FixedSurface);
102  aICP->SetCovarianceMatricesMovingSurface(m_SigmasMovingSurface);
103  aICP->SetCovarianceMatricesFixedSurface(m_SigmasFixedSurface);
104  aICP->SetFRENormalizationFactor(m_FRENormalizationFactor);
105  aICP->SetThreshold(0.000001);
106 
107  // run the algorithm
108  aICP->Update();
109 
110  MITK_INFO << "FRE: Expected: " << expFRE << ", computed: " << aICP->GetFRE();
111  CPPUNIT_ASSERT_MESSAGE("mitkAnisotropicIterativeClosestPointRegistrationTest:AicpRegistration Test FRE",
112  mitk::Equal(aICP->GetFRE(), expFRE, 0.0001));
113 
114  // compute the target registration Error
115  const double tre =
117  m_TargetsFixedSurface.GetPointer(),
118  aICP->GetRotation(),
119  aICP->GetTranslation());
120 
121  // MITK_INFO << "R:\n" << aICP->GetRotation() << "T: "<< aICP->GetTranslation();
122 
123  MITK_INFO << "TRE: Expected: " << expTRE << ", computed: " << tre;
124  CPPUNIT_ASSERT_MESSAGE("mitkAnisotropicIterativeClosestPointRegistrationTest:AicpRegistration Test TRE",
125  mitk::Equal(tre, expTRE, 0.00001));
126  }
127 
128  void testTrimmedAicpregistration()
129  {
130  const double expFRE = 4.8912;
131  const double expTRE = 0.0484215;
132 
133  mitk::AnisotropicIterativeClosestPointRegistration::Pointer aICP =
135 
136  // Swap X and Y for partial overlapping registration
137  aICP->SetMovingSurface(m_MovingSurface);
138  aICP->SetFixedSurface(m_FixedSurface);
139  aICP->SetCovarianceMatricesMovingSurface(m_SigmasMovingSurface);
140  aICP->SetCovarianceMatricesFixedSurface(m_SigmasFixedSurface);
141  aICP->SetFRENormalizationFactor(m_FRENormalizationFactor);
142  aICP->SetThreshold(0.000001);
143  aICP->SetTrimmFactor(0.50);
144 
145  // run the algorithm
146  aICP->Update();
147 
148  MITK_INFO << "FRE: Expected: " << expFRE << ", computed: " << aICP->GetFRE();
149 
150  CPPUNIT_ASSERT_MESSAGE("mitkAnisotropicIterativeClosestPointRegistrationTest:AicpRegistration Test FRE",
151  mitk::Equal(aICP->GetFRE(), expFRE, 0.01));
152 
153  // compute the target registration Error
154  const double tre =
156  m_TargetsFixedSurface.GetPointer(),
157  aICP->GetRotation(),
158  aICP->GetTranslation());
159 
160  MITK_INFO << "TRE: Expected: " << expTRE << ", computed: " << tre;
161  CPPUNIT_ASSERT_MESSAGE("mitkAnisotropicIterativeClosestPointRegistrationTest:AicpRegistration Test TRE",
162  mitk::Equal(tre, expTRE, 0.01));
163  }
164 };
165 
166 MITK_TEST_SUITE_REGISTRATION(mitkAnisotropicIterativeClosestPointRegistration)
MITK_TEST_SUITE_REGISTRATION(mitkImageToItk)
#define MITK_INFO
Definition: mitkLogMacros.h:18
#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.
static double ComputeTargetRegistrationError(const mitk::PointSet *movingTargets, const mitk::PointSet *fixedTargets, const Rotation &rotation, const Translation &translation)
Compute the target registration error between two point sets.
Test fixture for parameterized tests.
MITKNEWMODULE_EXPORT bool Equal(mitk::ExampleDataStructure *leftHandSide, mitk::ExampleDataStructure *rightHandSide, mitk::ScalarType eps, bool verbose)
Returns true if the example data structures are considered equal.
itk::Matrix< double, 3, 3 > Matrix3x3