forked from InsightSoftwareConsortium/ITK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
itkEuclideanDistancePointMetric.h
135 lines (113 loc) · 4.96 KB
/
itkEuclideanDistancePointMetric.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*=========================================================================
*
* Copyright NumFOCUS
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/
#ifndef itkEuclideanDistancePointMetric_h
#define itkEuclideanDistancePointMetric_h
#include "itkPointSetToPointSetMetric.h"
#include "itkCovariantVector.h"
#include "itkPointSet.h"
#include "itkImage.h"
namespace itk
{
/** \class EuclideanDistancePointMetric
* \brief Computes the minimum distance between a moving point-set
* and a fixed point-set. A vector of minimum closest point distance is
* created for each point in the moving point-set.
* No correspondence is needed.
* For speed consideration, the point-set with the minimum number of points
* should be used as the moving point-set.
* If the number of points is high, the possibility of setting a distance map
* should improve the speed of the closest point computation.
*
* Reference: "A Method for Registration of 3-D Shapes",
* IEEE PAMI, Vol 14, No. 2, February 1992
*
* \ingroup RegistrationMetrics
* \ingroup ITKRegistrationCommon
*/
template <typename TFixedPointSet,
typename TMovingPointSet,
typename TDistanceMap = itk::Image<unsigned short, TMovingPointSet::PointDimension>>
class ITK_TEMPLATE_EXPORT EuclideanDistancePointMetric
: public PointSetToPointSetMetric<TFixedPointSet, TMovingPointSet>
{
public:
ITK_DISALLOW_COPY_AND_MOVE(EuclideanDistancePointMetric);
/** Standard class type aliases. */
using Self = EuclideanDistancePointMetric;
using Superclass = PointSetToPointSetMetric<TFixedPointSet, TMovingPointSet>;
using Pointer = SmartPointer<Self>;
using ConstPointer = SmartPointer<const Self>;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Run-time type information (and related methods). */
itkTypeMacro(EuclideanDistancePointMetric, Object);
/** Types transferred from the base class. */
using typename Superclass::TransformType;
using typename Superclass::TransformPointer;
using typename Superclass::TransformParametersType;
using typename Superclass::TransformJacobianType;
using typename Superclass::MeasureType;
using typename Superclass::DerivativeType;
using typename Superclass::FixedPointSetType;
using typename Superclass::MovingPointSetType;
using typename Superclass::FixedPointSetConstPointer;
using typename Superclass::MovingPointSetConstPointer;
using typename Superclass::FixedPointIterator;
using typename Superclass::FixedPointDataIterator;
using typename Superclass::MovingPointIterator;
using typename Superclass::MovingPointDataIterator;
using DistanceMapType = TDistanceMap;
using DistanceMapPointer = typename DistanceMapType::ConstPointer;
/** Get the number of values, i.e. the number of points in the moving set. */
unsigned int
GetNumberOfValues() const override;
/** Get the derivatives of the match measure. */
void
GetDerivative(const TransformParametersType & parameters, DerivativeType & Derivative) const override;
/** Get the match measure, i.e. the value for single valued optimizers. */
MeasureType
GetValue(const TransformParametersType & parameters) const override;
/** Get value and derivatives for multiple valued optimizers. */
void
GetValueAndDerivative(const TransformParametersType & parameters,
MeasureType & value,
DerivativeType & derivative) const;
/** Set/Get the distance map. */
itkSetConstObjectMacro(DistanceMap, DistanceMapType);
itkGetConstObjectMacro(DistanceMap, DistanceMapType);
/** Set/Get if the distance should be squared.
* When set to true, the filter's computational speed is substantially improved
* (by avoiding numerous sqrt() calls), but it will result in minimizing the sum
* of distances^4 instead of the sum of distances^2. Default is false. */
itkSetMacro(ComputeSquaredDistance, bool);
itkGetConstMacro(ComputeSquaredDistance, bool);
itkBooleanMacro(ComputeSquaredDistance);
protected:
EuclideanDistancePointMetric();
~EuclideanDistancePointMetric() override = default;
void
PrintSelf(std::ostream & os, Indent indent) const override;
private:
DistanceMapPointer m_DistanceMap;
bool m_ComputeSquaredDistance{ false };
};
} // end namespace itk
#ifndef ITK_MANUAL_INSTANTIATION
# include "itkEuclideanDistancePointMetric.hxx"
#endif
#endif