00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkKdTree_h
00018
#define __itkKdTree_h
00019
00020
#include <queue>
00021
#include <vector>
00022
00023
#include "itkMacro.h"
00024
#include "itkPoint.h"
00025
#include "itkSize.h"
00026
#include "itkObject.h"
00027
#include "itkNumericTraits.h"
00028
#include "itkArray.h"
00029
00030
#include "itkSample.h"
00031
#include "itkSubsample.h"
00032
00033
#include "itkEuclideanDistance.h"
00034
00035
namespace itk{
00036
namespace Statistics{
00037
00056
template<
class TSample >
00057 struct KdTreeNode
00058 {
00060 typedef KdTreeNode< TSample> Self ;
00061
00063 typedef typename TSample::MeasurementType
MeasurementType ;
00064
00066
itkStaticConstMacro(MeasurementVectorSize,
unsigned int,
00067 TSample::MeasurementVectorSize) ;
00068
00070
typedef FixedArray<
double,
00071 itkGetStaticConstMacro(MeasurementVectorSize) >
CentroidType ;
00072
00075 typedef typename TSample::InstanceIdentifier
InstanceIdentifier ;
00076
00079
virtual bool IsTerminal() = 0 ;
00080
00086
virtual void GetParameters(
unsigned int &partitionDimension,
00087
MeasurementType &partitionValue) = 0 ;
00088
00090
virtual Self*
Left() = 0 ;
00091
00093
virtual Self*
Right() = 0 ;
00094
00097
virtual unsigned int Size() = 0 ;
00098
00100
virtual void GetWeightedCentroid(
CentroidType ¢roid) = 0 ;
00101
00103
virtual void GetCentroid(
CentroidType ¢roid) = 0 ;
00104
00106
virtual InstanceIdentifier GetInstanceIdentifier(size_t index) = 0 ;
00107
00109
virtual void AddInstanceIdentifier(
InstanceIdentifier id) = 0 ;
00110
00112 virtual ~KdTreeNode() {};
00113 } ;
00114
00126
template<
class TSample >
00127 struct KdTreeNonterminalNode:
public KdTreeNode< TSample >
00128 {
00129 typedef KdTreeNode< TSample > Superclass ;
00130 typedef typename Superclass::MeasurementType
MeasurementType ;
00131 typedef typename Superclass::CentroidType
CentroidType ;
00132 typedef typename Superclass::InstanceIdentifier
InstanceIdentifier ;
00133
00134
KdTreeNonterminalNode(
unsigned int partitionDimension,
00135
MeasurementType partitionValue,
00136
Superclass* left,
00137
Superclass* right) ;
00138
00139 virtual ~KdTreeNonterminalNode() {}
00140
00141 virtual bool IsTerminal()
00142 {
return false ; }
00143
00144
void GetParameters(
unsigned int &partitionDimension,
00145 MeasurementType &partitionValue) ;
00146
00147 Superclass*
Left()
00148 {
return m_Left ; }
00149
00150 Superclass*
Right()
00151 {
return m_Right ; }
00152
00153 unsigned int Size()
00154 {
return 0 ; }
00155
00156 void GetWeightedCentroid(
CentroidType &)
00157 { }
00158
00159 void GetCentroid(
CentroidType &)
00160 { }
00161
00162 InstanceIdentifier GetInstanceIdentifier(size_t)
00163 {
return 0 ; }
00164
00165 void AddInstanceIdentifier(
InstanceIdentifier) {}
00166
00167
private:
00168
unsigned int m_PartitionDimension ;
00169 MeasurementType m_PartitionValue ;
00170
Superclass* m_Left ;
00171
Superclass* m_Right ;
00172 } ;
00173
00188
template<
class TSample >
00189 struct KdTreeWeightedCentroidNonterminalNode:
public KdTreeNode< TSample >
00190 {
00191 typedef KdTreeNode< TSample > Superclass ;
00192 typedef typename Superclass::MeasurementType
MeasurementType ;
00193 typedef typename Superclass::CentroidType
CentroidType ;
00194 typedef typename Superclass::InstanceIdentifier
InstanceIdentifier ;
00195
00196
KdTreeWeightedCentroidNonterminalNode(
unsigned int partitionDimension,
00197
MeasurementType partitionValue,
00198
Superclass* left,
00199
Superclass* right,
00200
CentroidType ¢roid,
00201
unsigned int size) ;
00202 virtual ~KdTreeWeightedCentroidNonterminalNode() {}
00203
00204 virtual bool IsTerminal()
00205 {
return false ; }
00206
00207
void GetParameters(
unsigned int &partitionDimension,
00208 MeasurementType &partitionValue) ;
00209
00210 Superclass*
Left()
00211 {
return m_Left ; }
00212
00213 Superclass*
Right()
00214 {
return m_Right ; }
00215
00216 unsigned int Size()
00217 {
return m_Size ; }
00218
00219 void GetWeightedCentroid(
CentroidType ¢roid)
00220 { centroid = m_WeightedCentroid ; }
00221
00222 void GetCentroid(
CentroidType ¢roid)
00223 { centroid = m_Centroid ; }
00224
00225 InstanceIdentifier GetInstanceIdentifier(size_t)
00226 {
return 0 ; }
00227
00228 void AddInstanceIdentifier(
InstanceIdentifier) {}
00229
00230
private:
00231
unsigned int m_PartitionDimension ;
00232 MeasurementType m_PartitionValue ;
00233 CentroidType m_WeightedCentroid ;
00234 CentroidType m_Centroid ;
00235
unsigned int m_Size ;
00236
Superclass* m_Left ;
00237
Superclass* m_Right ;
00238 } ;
00239
00240
00252
template<
class TSample >
00253 struct KdTreeTerminalNode:
public KdTreeNode< TSample >
00254 {
00255 typedef KdTreeNode< TSample > Superclass ;
00256 typedef typename Superclass::MeasurementType
MeasurementType ;
00257 typedef typename Superclass::CentroidType
CentroidType ;
00258 typedef typename Superclass::InstanceIdentifier
InstanceIdentifier ;
00259
00260 KdTreeTerminalNode() {}
00261
00262 virtual ~KdTreeTerminalNode() {}
00263
00264 bool IsTerminal()
00265 {
return true ; }
00266
00267 void GetParameters(
unsigned int &,
00268
MeasurementType &) {}
00269
00270 Superclass*
Left()
00271 {
return 0 ; }
00272
00273 Superclass*
Right()
00274 {
return 0 ; }
00275
00276 unsigned int Size()
00277 {
return static_cast<unsigned int>( m_InstanceIdentifiers.size() ); }
00278
00279 void GetWeightedCentroid(
CentroidType &)
00280 { }
00281
00282 void GetCentroid(
CentroidType &)
00283 { }
00284
00285 InstanceIdentifier GetInstanceIdentifier(size_t index)
00286 {
return m_InstanceIdentifiers[index] ; }
00287
00288 void AddInstanceIdentifier(
InstanceIdentifier id)
00289 { m_InstanceIdentifiers.push_back(
id) ;}
00290
00291
private:
00292 std::vector< InstanceIdentifier > m_InstanceIdentifiers ;
00293 } ;
00294
00321
template <
class TSample >
00322 class ITK_EXPORT KdTree :
public Object
00323 {
00324
public:
00326 typedef KdTree
Self ;
00327 typedef Object Superclass ;
00328 typedef SmartPointer<Self> Pointer;
00329
00331
itkTypeMacro(KdTree,
Object);
00332
00334
itkNewMacro(
Self) ;
00335
00337 typedef TSample
SampleType ;
00338 typedef typename TSample::MeasurementVectorType
MeasurementVectorType ;
00339 typedef typename TSample::MeasurementType
MeasurementType ;
00340 typedef typename TSample::InstanceIdentifier
InstanceIdentifier ;
00341 typedef typename TSample::FrequencyType
FrequencyType ;
00342
00344
itkStaticConstMacro(MeasurementVectorSize,
unsigned int,
00345 TSample::MeasurementVectorSize) ;
00346
00348 typedef EuclideanDistance< MeasurementVectorType > DistanceMetricType ;
00349
00351 typedef KdTreeNode< TSample > KdTreeNodeType ;
00352
00356 typedef std::pair< InstanceIdentifier, double >
NeighborType ;
00357
00358 typedef std::vector< InstanceIdentifier >
InstanceIdentifierVectorType ;
00359
00369 class NearestNeighbors
00370 {
00371
public:
00373 NearestNeighbors() {}
00374
00376 ~
NearestNeighbors() {}
00377
00380 void resize(
unsigned int k)
00381 {
00382 m_Identifiers.clear() ;
00383 m_Identifiers.resize(k,
NumericTraits< unsigned long >::max()) ;
00384 m_Distances.clear() ;
00385 m_Distances.resize(k,
NumericTraits< double >::max()) ;
00386 m_FarthestNeighborIndex = 0 ;
00387 }
00388
00390
double GetLargestDistance()
00391 {
return m_Distances[m_FarthestNeighborIndex] ; }
00392
00395
void ReplaceFarthestNeighbor(
InstanceIdentifier id,
double distance)
00396 {
00397 m_Identifiers[m_FarthestNeighborIndex] =
id ;
00398 m_Distances[m_FarthestNeighborIndex] = distance ;
00399
double farthestDistance =
NumericTraits< double >::min() ;
00400
const unsigned int size = static_cast<unsigned int>( m_Distances.size() );
00401
for (
unsigned int i = 0 ; i < size; i++ )
00402 {
00403
if ( m_Distances[i] > farthestDistance )
00404 {
00405 farthestDistance = m_Distances[i] ;
00406 m_FarthestNeighborIndex = i ;
00407 }
00408 }
00409 }
00410
00412
InstanceIdentifierVectorType GetNeighbors()
00413 {
return m_Identifiers ; }
00414
00417
InstanceIdentifier GetNeighbor(
unsigned int index)
00418 {
return m_Identifiers[index] ; }
00419
00421 std::vector< double >& GetDistances()
00422 {
return m_Distances ; }
00423
00424
private:
00426
unsigned int m_FarthestNeighborIndex ;
00427
00429
InstanceIdentifierVectorType m_Identifiers ;
00430
00433 std::vector< double > m_Distances ;
00434 } ;
00435
00438
void SetBucketSize(
unsigned int size) ;
00439
00442
void SetSample(TSample* sample) ;
00443
00445 TSample* GetSample()
00446 {
return m_Sample ; }
00447
00448
unsigned long Size()
00449 {
return m_Sample->Size() ; }
00450
00455
KdTreeNodeType* GetEmptyTerminalNode()
00456 {
return m_EmptyTerminalNode ; }
00457
00460
void SetRoot(
KdTreeNodeType* root)
00461 { m_Root = root ; }
00462
00464
KdTreeNodeType* GetRoot()
00465 {
return m_Root ; }
00466
00469
MeasurementVectorType GetMeasurementVector(
InstanceIdentifier id)
00470 {
return m_Sample->GetMeasurementVector(
id) ; }
00471
00474
FrequencyType GetFrequency(
InstanceIdentifier id)
00475 {
return m_Sample->GetFrequency(
id ) ; }
00476
00478
DistanceMetricType* GetDistanceMetric()
00479 {
return m_DistanceMetric.GetPointer() ; }
00480
00482
void Search(
MeasurementVectorType &query,
00483
unsigned int k,
00484
InstanceIdentifierVectorType& result) ;
00485
00487
void Search(
MeasurementVectorType &query,
00488
double radius,
00489
InstanceIdentifierVectorType& result) ;
00490
00493
int GetNumberOfVisits()
00494 {
return m_NumberOfVisits ; }
00495
00501
bool BallWithinBounds(
MeasurementVectorType &query,
00502
MeasurementVectorType &lowerBound,
00503
MeasurementVectorType &upperBound,
00504
double radius) ;
00505
00509
bool BoundsOverlapBall(
MeasurementVectorType &query,
00510
MeasurementVectorType &lowerBound,
00511
MeasurementVectorType &upperBound,
00512
double radius) ;
00513
00515
void DeleteNode(
KdTreeNodeType *node) ;
00516
00518
void PrintTree(
KdTreeNodeType *node,
int level,
00519
unsigned int activeDimension) ;
00520
00521
typedef typename TSample::Iterator
Iterator ;
00522
00523 Iterator Begin()
00524 {
00525 typename TSample::Iterator iter = m_Sample->Begin() ;
00526
return iter;
00527 }
00528
00529 Iterator End()
00530 {
00531 Iterator iter = m_Sample->End() ;
00532
return iter;
00533 }
00534
00535
protected:
00537 KdTree() ;
00538
00540
virtual ~KdTree() ;
00541
00542
void PrintSelf(std::ostream& os,
Indent indent)
const ;
00543
00545
int NearestNeighborSearchLoop(KdTreeNodeType* node,
00546 MeasurementVectorType &query,
00547 MeasurementVectorType &lowerBound,
00548 MeasurementVectorType &upperBound) ;
00549
00551
int SearchLoop(KdTreeNodeType* node, MeasurementVectorType &query,
00552 MeasurementVectorType &lowerBound,
00553 MeasurementVectorType &upperBound) ;
00554
private:
00555 KdTree(
const Self&) ;
00556
void operator=(
const Self&) ;
00557
00559 TSample* m_Sample ;
00560
00562
int m_BucketSize ;
00563
00565 KdTreeNodeType* m_Root ;
00566
00568 KdTreeNodeType* m_EmptyTerminalNode ;
00569
00571
typename DistanceMetricType::Pointer m_DistanceMetric ;
00572
00573
bool m_IsNearestNeighborSearch ;
00574
00575
double m_SearchRadius ;
00576
00577 InstanceIdentifierVectorType m_Neighbors ;
00578
00580 NearestNeighbors m_NearestNeighbors ;
00581
00583 MeasurementVectorType m_LowerBound ;
00584
00586 MeasurementVectorType m_UpperBound ;
00587
00589
int m_NumberOfVisits ;
00590
00592
bool m_StopSearch ;
00593
00595 NeighborType m_TempNeighbor ;
00596 } ;
00597
00598 }
00599 }
00600
00601
#ifndef ITK_MANUAL_INSTANTIATION
00602
#include "itkKdTree.txx"
00603
#endif
00604
00605
#endif
00606
00607
00608