OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimKMeansClustering.h
Go to the documentation of this file.
1 //**************************************************************************************************
2 //
3 // OSSIM Open Source Geospatial Data Processing Library
4 // See top level LICENSE.txt file for license information
5 //
6 //**************************************************************************************************
7 #ifndef ossimKmeansClassifier_HEADER
8 #define ossimKmeansClassifier_HEADER
9 
11 #include <ossim/base/ossimCommon.h>
13 #include <vector>
14 
15 /***************************************************************************************************
16  *
17  * This class provides a sample set clustering capability using the traditional K-means scheme for
18  * partitioning datasets into K distinct groups according to sample value.
19  *
20  * The samples can be provided as a simple array of samples, or as a histogram when the
21  * populations of the corresponding samples are provided as well. The latter scheme is used by the
22  * ossimKMeansFilter for clustering pixel values given the image histogram.
23  *
24  **************************************************************************************************/
26 {
27 public:
28  class Cluster
29  {
30  public:
31  Cluster() :
32  min(0), max(0), mean(0), sigma(0), new_mean(0), n(0) {}
33 
34  double min; // samples in group are => this, used for detecting convergence
35  double max; // samples in group are < this, used for detecting convergence
36  double mean;
37  double sigma;
38  double new_mean;
39  double n; // number of samples collected for running mean
40  };
41 
44 
45  void setNumClusters(ossim_uint32 K);
46  template<class T> void setSamples(T* samples, ossim_uint32 num_entries);
47  template<class T> void setPopulations(T* populations, ossim_uint32 num_entries);
48  bool computeKmeans();
49 
50  ossim_uint32 getNumClusters() const { return m_clusters.size(); }
51  double getMean(ossim_uint32 groupId) const;
52  double getSigma(ossim_uint32 groupId) const;
53  double getMinValue(ossim_uint32 groupId) const;
54  double getMaxValue(ossim_uint32 groupId) const;
55 
56  const ossimKMeansClustering::Cluster* getCluster(ossim_uint32 i) const;
57 
58  void setVerbose(bool v=true) const { m_verbose = v; }
59 
60 private:
62  double* m_samples;
63  double* m_populations; // use double to handle arbitrarily large datasets
64  std::vector<Cluster> m_clusters;
66  mutable bool m_verbose;
67 };
68 
69 template<class T> void ossimKMeansClustering::setSamples(T* samples, ossim_uint32 num_entries)
70 {
71  if ((num_entries == 0) || (samples == 0))
72  return;
73 
74  m_clustersValid = false;
75  m_numEntries = num_entries;
76  m_samples = new double[num_entries];
77  for (ossim_uint32 i=0; i<num_entries; i++)
78  m_samples[i] = (double) samples[i];
79 }
80 
81 template<class T> void ossimKMeansClustering::setPopulations(T* populations,
82  ossim_uint32 num_entries)
83 {
84  if ((num_entries == 0) || (populations == 0))
85  return;
86 
87  m_clustersValid = false;
88  m_populations = new double[num_entries];
89  for (ossim_uint32 i=0; i<num_entries; i++)
90  m_populations[i] = (double) populations[i];
91 }
92 
93 
94 
95 #endif /* ossimKMeansClassifier_HEADER */
void setVerbose(bool v=true) const
ossimReferenced allows for shared object ref counting if the reference count ever gets to 0 or less i...
void setSamples(T *samples, ossim_uint32 num_entries)
os2<< "> n<< " > nendobj n
unsigned int ossim_uint32
std::vector< Cluster > m_clusters
ossim_uint32 getNumClusters() const
#define max(a, b)
Definition: auxiliary.h:76
#define OSSIM_DLL
void setPopulations(T *populations, ossim_uint32 num_entries)
#define min(a, b)
Definition: auxiliary.h:75