00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _itkMahalanobisDistanceThresholdImageFunction_h
00018 #define _itkMahalanobisDistanceThresholdImageFunction_h
00019
00020 #include "itkImageFunction.h"
00021 #include "itkMahalanobisDistanceMembershipFunction.h"
00022
00023 namespace itk
00024 {
00025
00046 template <class TInputImage, class TCoordRep = float>
00047 class ITK_EXPORT MahalanobisDistanceThresholdImageFunction :
00048 public ImageFunction<TInputImage,bool,TCoordRep>
00049 {
00050 public:
00052 typedef MahalanobisDistanceThresholdImageFunction Self;
00053 typedef ImageFunction<TInputImage,bool,TCoordRep> Superclass;
00054 typedef SmartPointer<Self> Pointer;
00055 typedef SmartPointer<const Self> ConstPointer;
00056
00058 itkTypeMacro(MahalanobisDistanceThresholdImageFunction, ImageFunction);
00059
00061 itkNewMacro(Self);
00062
00064 typedef typename Superclass::InputImageType InputImageType;
00065
00067 typedef typename TInputImage::PixelType PixelType;
00068
00070 itkStaticConstMacro(ImageDimension, unsigned int,Superclass::ImageDimension);
00071
00073 typedef typename Superclass::PointType PointType;
00074
00076 typedef typename Superclass::IndexType IndexType;
00077
00079 typedef typename Superclass::ContinuousIndexType ContinuousIndexType;
00080
00082 typedef vnl_matrix<double> CovarianceMatrixType;
00083
00085 typedef vnl_vector<double> MeanVectorType;
00086
00096 virtual bool Evaluate( const PointType& point ) const
00097 {
00098 IndexType index;
00099 this->ConvertPointToNearestIndex( point, index );
00100 return ( this->EvaluateAtIndex( index ) );
00101 }
00102
00111 virtual bool EvaluateAtContinuousIndex(
00112 const ContinuousIndexType & index ) const
00113 {
00114 IndexType nindex;
00115
00116 this->ConvertContinuousIndexToNearestIndex (index, nindex);
00117 return this->EvaluateAtIndex(nindex);
00118 }
00119
00128 virtual bool EvaluateAtIndex( const IndexType & index ) const
00129 {
00130 double mahalanobisDistance =
00131 m_MahalanobisDistanceMembershipFunction->Evaluate(
00132 m_Image->GetPixel( index ) );
00133 return ( sqrt( mahalanobisDistance ) <= m_Threshold );
00134 }
00135
00137 itkGetConstMacro(Threshold,double);
00138 itkSetMacro(Threshold,double);
00139
00141 void SetMean(const MeanVectorType &mean);
00142 const MeanVectorType & GetMean() const;
00143
00148 void SetCovariance(const CovarianceMatrixType &cov);
00149 const CovarianceMatrixType & GetCovariance() const;
00150
00151
00152 protected:
00153 MahalanobisDistanceThresholdImageFunction();
00154 ~MahalanobisDistanceThresholdImageFunction(){};
00155 void PrintSelf(std::ostream& os, Indent indent) const;
00156
00157 private:
00158 MahalanobisDistanceThresholdImageFunction( const Self& );
00159 void operator=( const Self& );
00160
00161 double m_Threshold;
00162
00163
00164 typedef Statistics::MahalanobisDistanceMembershipFunction<
00165 PixelType
00166 > MahalanobisDistanceFunctionType;
00167
00168 typedef typename MahalanobisDistanceFunctionType::Pointer MahalanobisDistanceFunctionPointer;
00169 MahalanobisDistanceFunctionPointer m_MahalanobisDistanceMembershipFunction;
00170
00171 };
00172
00173 }
00174
00175 #ifndef ITK_MANUAL_INSTANTIATION
00176 #include "itkMahalanobisDistanceThresholdImageFunction.txx"
00177 #endif
00178
00179 #endif