forked from InsightSoftwareConsortium/ITK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
itkMeanSquaresImageToImageMetric.h
141 lines (117 loc) · 5.66 KB
/
itkMeanSquaresImageToImageMetric.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
136
137
138
139
140
141
/*=========================================================================
*
* Copyright Insight Software Consortium
*
* 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 itkMeanSquaresImageToImageMetric_h
#define itkMeanSquaresImageToImageMetric_h
#include "itkImageToImageMetric.h"
#include "itkPoint.h"
#include "itkIndex.h"
namespace itk
{
/**
* \class MeanSquaresImageToImageMetric
* \brief TODO
* \ingroup ITKRegistrationCommon
*
* \wiki
* \wikiexample{Metrics/MeanSquaresImageToImageMetric,Compute the mean squares metric between two images}
* \endwiki
*/
template< typename TFixedImage, typename TMovingImage >
class MeanSquaresImageToImageMetric:
public ImageToImageMetric< TFixedImage, TMovingImage >
{
public:
/** Standard class typedefs. */
typedef MeanSquaresImageToImageMetric Self;
typedef ImageToImageMetric< TFixedImage, TMovingImage > Superclass;
typedef SmartPointer< Self > Pointer;
typedef SmartPointer< const Self > ConstPointer;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Run-time type information (and related methods). */
itkTypeMacro(MeanSquaresImageToImageMetric, ImageToImageMetric);
/** Types inherited from Superclass. */
typedef typename Superclass::TransformType TransformType;
typedef typename Superclass::TransformPointer TransformPointer;
typedef typename Superclass::TransformJacobianType TransformJacobianType;
typedef typename Superclass::InterpolatorType InterpolatorType;
typedef typename Superclass::MeasureType MeasureType;
typedef typename Superclass::DerivativeType DerivativeType;
typedef typename Superclass::ParametersType ParametersType;
typedef typename Superclass::FixedImageType FixedImageType;
typedef typename Superclass::MovingImageType MovingImageType;
typedef typename Superclass::MovingImagePointType MovingImagePointType;
typedef typename Superclass::FixedImageConstPointer FixedImageConstPointer;
typedef typename Superclass::MovingImageConstPointer MovingImageConstPointer;
typedef typename Superclass::CoordinateRepresentationType CoordinateRepresentationType;
typedef typename Superclass::FixedImageSampleContainer FixedImageSampleContainer;
typedef typename Superclass::ImageDerivativesType ImageDerivativesType;
typedef typename Superclass::WeightsValueType WeightsValueType;
typedef typename Superclass::IndexValueType IndexValueType;
// Needed for evaluation of Jacobian.
typedef typename Superclass::FixedImagePointType FixedImagePointType;
/** The moving image dimension. */
itkStaticConstMacro(MovingImageDimension, unsigned int,
MovingImageType::ImageDimension);
/**
* Initialize the Metric by
* (1) making sure that all the components are present and plugged
* together correctly,
* (2) uniformly select NumberOfSpatialSamples within
* the FixedImageRegion, and
* (3) allocate memory for pdf data structures. */
virtual void Initialize(void) throw ( ExceptionObject ) ITK_OVERRIDE;
/** Get the value. */
MeasureType GetValue(const ParametersType & parameters) const ITK_OVERRIDE;
/** Get the derivatives of the match measure. */
void GetDerivative(const ParametersType & parameters,
DerivativeType & Derivative) const ITK_OVERRIDE;
/** Get the value and derivatives for single valued optimizers. */
void GetValueAndDerivative(const ParametersType & parameters,
MeasureType & Value,
DerivativeType & Derivative) const ITK_OVERRIDE;
protected:
MeanSquaresImageToImageMetric();
virtual ~MeanSquaresImageToImageMetric();
void PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE;
private:
ITK_DISALLOW_COPY_AND_ASSIGN(MeanSquaresImageToImageMetric);
bool GetValueThreadProcessSample(ThreadIdType threadId,
SizeValueType fixedImageSample,
const MovingImagePointType & mappedPoint,
double movingImageValue) const ITK_OVERRIDE;
bool GetValueAndDerivativeThreadProcessSample(ThreadIdType threadId,
SizeValueType fixedImageSample,
const MovingImagePointType & mappedPoint,
double movingImageValue,
const ImageDerivativesType &
movingImageGradientValue) const ITK_OVERRIDE;
struct PerThreadS
{
TransformJacobianType m_Jacobian;
MeasureType m_MSE;
DerivativeType m_MSEDerivative;
};
itkAlignedTypedef( 64, PerThreadS, AlignedPerThreadType );
AlignedPerThreadType *m_PerThread;
};
} // end namespace itk
#ifndef ITK_MANUAL_INSTANTIATION
#include "itkMeanSquaresImageToImageMetric.hxx"
#endif
#endif