X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcpExtensions%2FAlgorithms%2FIterativeGaussianModelEstimator.h;h=b38e06ede2d6732e86f4793a97964de10b0859b1;hb=510ac31d52c1ac725baf278243c958e6c564b5b3;hp=8a30510be5b937606498dfbd43b2bfbdb84958b4;hpb=506b27e2ea07cb34ba230b02eb6857b20cbf78b1;p=cpPlugins.git diff --git a/lib/cpExtensions/Algorithms/IterativeGaussianModelEstimator.h b/lib/cpExtensions/Algorithms/IterativeGaussianModelEstimator.h index 8a30510..b38e06e 100644 --- a/lib/cpExtensions/Algorithms/IterativeGaussianModelEstimator.h +++ b/lib/cpExtensions/Algorithms/IterativeGaussianModelEstimator.h @@ -8,15 +8,22 @@ #include #include #include -#include +#include + +#include +#include +#include +#include namespace cpExtensions { namespace Algorithms { /** + * Recursive formulation taken from: + * http://lmb.informatik.uni-freiburg.de/lectures/mustererkennung/Englische_Folien/07_c_ME_en.pdf */ - template< class S, unsigned int D > + template< class _TScalar, unsigned int _VDimension > class IterativeGaussianModelEstimator : public itk::Object { @@ -26,61 +33,117 @@ namespace cpExtensions typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; - typedef S TScalar; - itkStaticConstMacro( Dimension, unsigned int, D ); + typedef _TScalar TScalar; + itkStaticConstMacro( Dimension, unsigned int, _VDimension ); // Begin concept checking #ifdef ITK_USE_CONCEPT_CHECKING itkConceptMacro( ScalarTypeHasFloatResolution, - ( itk::Concept::IsFloatingPoint< S > ) + ( itk::Concept::IsFloatingPoint< _TScalar > ) ); #endif // End concept checking - typedef vnl_matrix< S > TMatrix; - typedef std::vector< TMatrix > TMatrices; + typedef itk::Matrix< TScalar, Dimension, Dimension > TMatrix; + typedef itk::Vector< TScalar, Dimension > TVector; public: itkNewMacro( Self ); itkTypeMacro( IterativeGaussianModelEstimator, itkObject ); + itkGetConstMacro( Mean, TVector ); + itkGetConstMacro( Covariance, TMatrix ); + itkGetConstMacro( UnbiasedCovariance, TMatrix ); + itkGetConstMacro( NumberOfSamples, unsigned long ); + + itkSetMacro( Mean, TVector ); + itkSetMacro( Covariance, TMatrix ); + itkSetMacro( NumberOfSamples, unsigned long ); + public: - unsigned long GetNumberOfSamples( ) const - { return( ( unsigned long )( this->m_N ) ); } - const TMatrix& GetMu( ) const - { return( this->m_M ); } - const TMatrix& GetOmega( ) const - { return( this->m_O ); } + void Clear( ); - void SetNumberOfSamples( unsigned long n ); - void SetMu( const TMatrix& m ); - void SetOmega( const TMatrix& O ); + template< class _TOtherScalar > + void AddSample( const _TOtherScalar& x1, ... ); - bool SaveModelToFile( const std::string& filename ) const; - bool LoadModelFromFile( const std::string& filename ); + template< class _TOtherScalar > + void AddSample( const _TOtherScalar* array ); - template< class V > - S Probability( const V& sample ) const; + template< class _TOtherScalar > + void AddSample( const vnl_vector< _TOtherScalar >& v ); - S Probability( const S& s_x, const S& s_y, ... ) const; + template< class _TOtherScalar > + void AddSample( + const itk::CovariantVector< _TOtherScalar, _VDimension >& v + ); - template< class V, class M > - void GetModel( V& m, M& E ) const; + template< class _TOtherScalar > + void AddSample( const itk::Point< _TOtherScalar, _VDimension >& p ); - void Clear( ); + template< class _TOtherScalar > + void AddSample( const itk::Vector< _TOtherScalar, _VDimension >& v ); + + template< class _TOtherScalar > + _TScalar SquaredMahalanobis( const _TOtherScalar& x1, ... ) const; + + template< class _TOtherScalar > + _TScalar SquaredMahalanobis( const _TOtherScalar* array ) const; + + template< class _TOtherScalar > + _TScalar SquaredMahalanobis( + const vnl_vector< _TOtherScalar >& v + ) const; + + template< class _TOtherScalar > + _TScalar SquaredMahalanobis( + const itk::CovariantVector< _TOtherScalar, _VDimension >& v + ) const; + + template< class _TOtherScalar > + _TScalar SquaredMahalanobis( + const itk::Point< _TOtherScalar, _VDimension >& p + ) const; + + template< class _TOtherScalar > + _TScalar SquaredMahalanobis( + const itk::Vector< _TOtherScalar, _VDimension >& v + ) const; + + template< class _TOtherScalar > + _TScalar Density( const _TOtherScalar& x1, ... ) const; + + template< class _TOtherScalar > + _TScalar Density( const _TOtherScalar* array ) const; + + template< class _TOtherScalar > + _TScalar Density( + const vnl_vector< _TOtherScalar >& v + ) const; + + template< class _TOtherScalar > + _TScalar Density( + const itk::CovariantVector< _TOtherScalar, _VDimension >& v + ) const; - template< class V > - void AddSample( const V& sample ); + template< class _TOtherScalar > + _TScalar Density( + const itk::Point< _TOtherScalar, _VDimension >& p + ) const; - void AddSample( const S& s_x, const S& s_y, ... ); + template< class _TOtherScalar > + _TScalar Density( + const itk::Vector< _TOtherScalar, _VDimension >& v + ) const; protected: IterativeGaussianModelEstimator( ); virtual ~IterativeGaussianModelEstimator( ); protected: - void _UpdateModel( ) const; + void _AddSample( const TVector& v ) const; + _TScalar _SquaredMahalanobis( const TVector& v ) const; + _TScalar _Density( const TVector& v ) const; private: // Purposely not implemented @@ -88,14 +151,13 @@ namespace cpExtensions void operator=( const Self& other ); protected: - S m_N; - TMatrix m_M; - TMatrix m_O; - - mutable bool m_Updated; - mutable TMatrix m_Cov; - mutable TMatrix m_Inv; - mutable S m_Norm; + // Recursive avg/cov values + mutable unsigned long m_NumberOfSamples; + mutable TVector m_Mean; + mutable TMatrix m_Covariance; + mutable TMatrix m_UnbiasedCovariance; + mutable bool m_InverseUpdated; + mutable TMatrix m_InverseUnbiasedCovariance; }; } // ecapseman