00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkMahalanobisDistanceMembershipFunction_h
00018
#define __itkMahalanobisDistanceMembershipFunction_h
00019
00020
#include <vnl/vnl_vector.h>
00021
#include <vnl/vnl_transpose.h>
00022
#include <vnl/vnl_matrix.h>
00023
#include <vnl/algo/vnl_matrix_inverse.h>
00024
#include <vnl/algo/vnl_determinant.h>
00025
00026
00027
#include "itkMembershipFunctionBase.h"
00028
00029
00030
namespace itk{
00031
namespace Statistics{
00032
00042
template<
class TVector >
00043 class ITK_EXPORT MahalanobisDistanceMembershipFunction :
00044
public MembershipFunctionBase< TVector >
00045 {
00046
public:
00048 typedef MahalanobisDistanceMembershipFunction
Self;
00049 typedef MembershipFunctionBase< TVector > Superclass ;
00050 typedef SmartPointer<Self> Pointer;
00051
00053
itkTypeMacro(MahalanobisDistanceMembershipFunction,
MembershipFunctionBase);
00054
itkNewMacro(
Self);
00055
00057
typedef TVector
MeasurementVectorType ;
00058
00060
typedef vnl_vector<double> MeanVectorType;
00061
00063
typedef vnl_matrix<double> CovarianceMatrixType;
00064
00066
void SetMean(
const MeanVectorType &mean) ;
00067
00069
const MeanVectorType & GetMean() const;
00070
00075
void SetCovariance(const
CovarianceMatrixType &cov);
00076
00078 const
CovarianceMatrixType & GetCovariance() const;
00079
00084
void SetInverseCovariance(const
CovarianceMatrixType &invcov);
00085
00087 const
CovarianceMatrixType & GetInverseCovariance() const;
00088
00090 itkSetMacro( NumberOfSamples,
double );
00091
00093 itkGetMacro( NumberOfSamples,
double );
00094
00098
double Evaluate(const
MeasurementVectorType &measurement) const;
00099
00100 protected:
00101 MahalanobisDistanceMembershipFunction(
void) ;
00102 virtual ~MahalanobisDistanceMembershipFunction(
void) {}
00103 void PrintSelf(std::ostream& os,
Indent indent)
const;
00104
00105
private:
00106
MeanVectorType m_Mean;
00107
CovarianceMatrixType m_Covariance;
00108
00109
00110
00111
CovarianceMatrixType m_InverseCovariance;
00112
00113
00114
double m_NumberOfSamples;
00115
00116
00117
double m_PreFactor;
00118
double m_Epsilon;
00119
double m_DoubleMax;
00120
00121
bool m_ValidInverseCovarianceFlag;
00122
00123
itkStaticConstMacro(VectorDimension,
unsigned int, TVector::Dimension);
00124
typedef vnl_matrix_fixed<double,1,itkGetStaticConstMacro(VectorDimension)> ColumnVectorType;
00125
00126
mutable ColumnVectorType m_TempVec;
00127
mutable ColumnVectorType m_TempMat;
00128
00129
void CalculateInverseCovariance();
00130 };
00131
00132 }
00133 }
00134
00135
#ifndef ITK_MANUAL_INSTANTIATION
00136
#include "itkMahalanobisDistanceMembershipFunction.txx"
00137
#endif
00138
00139
#endif