00001 /// \file 00002 /// Définition des classes utiles pour le clustering de classes disjointes 00003 #ifndef GUARD_DISJOINTSET_H 00004 #define GUARD_DISJOINTSET_H 00005 00006 #include <vector> 00007 00008 #include "Debug.hpp" 00009 #include "Node.hpp" 00010 #include <map> 00011 00012 using namespace std; 00013 00014 static Channel channelCluster(&cout); 00015 /////////////////////////////////////////////////////////////////////////////// 00016 /// Classe de base pour les algorithmes utilisant des ensembles disjoints 00017 /// 00018 /// Cette classe implémente la compression de chemin 00019 /////////////////////////////////////////////////////////////////////////////// 00020 class DisjointSet_Base{ 00021 /// tableau d'index des parents d'un cluster 00022 vector<int> parent; 00023 /// tableau des tailles d'un cluster 00024 vector<int> size; 00025 /// map des parents vers les noeuds 00026 map<int, Node> table; 00027 /// Itérateur des parents vers les noeuds 00028 typedef map<int, Node>::iterator table_iter; 00029 protected: 00030 /// le graphe à clusteriser 00031 Node graph; 00032 /// les noeuds à étudier 00033 vector<Node> vNode; 00034 /// le nombre de cluster en cours 00035 int nbClass; 00036 /// les arretes du graphe clusterisés 00037 vector<Edge> edge; 00038 /// retourn le rang d'un parent 00039 int getParentRank(int); 00040 public: 00041 /// Constructeur de l'algorithme 00042 /// \param Node : le noeud à clusteriser 00043 DisjointSet_Base(const Node); 00044 /// Retourne une chaîne de caractères détaillée 00045 virtual string toString(); 00046 /// Fusionne 2 noeuds 00047 Node mergeDisjointSet(Node, Node); 00048 /// Accomplis effectivement un algorithme de clusteringe 00049 virtual Node makeDisjointSet() = 0; 00050 /// Teste l'appartenance au même cluster de 2 points 00051 bool sameDisjointSet(Node, Node); 00052 /// Retourne sous forme de graphe un le résultat du clustering 00053 Node makeNode(string); 00054 /// Retourne la taille du parent d'un noeud 00055 int getParentSize(Node); 00056 /// Retourne le cluster d'un noeud 00057 Node getParent(Node); 00058 }; 00059 /////////////////////////////////////////////////////////////////////////////// 00060 /// Kruskal : classe de test 00061 /// 00062 /// Implemente l'algorithme de Kruskal pour trouver le MST d'un graphe 00063 /////////////////////////////////////////////////////////////////////////////// 00064 class Kruskal : public DisjointSet_Base{ 00065 public: 00066 /// Prend comme argument le graphe dont on veut le MST 00067 Kruskal(Node); 00068 /// Implémentation de l'algorithme de Kruskal 00069 Node makeDisjointSet(); 00070 }; 00071 /////////////////////////////////////////////////////////////////////////////// 00072 /// MInt : classe de l'article 00073 /// 00074 /// Implemente l'algorithme de l'article pour segmenter une image 00075 /////////////////////////////////////////////////////////////////////////////// 00076 class MInt : public DisjointSet_Base{ 00077 /// Paramètre de l'algorithme 00078 float tau; 00079 public: 00080 /// Constructeur 00081 /// \param le graphe de l'image à segmenter 00082 /// \param le paramètre de l'algorithme 00083 /// \param mode bavard 00084 /// \param fichier de résultat 00085 MInt(Node, float); 00086 /// Implémente l'algorithme 00087 Node makeDisjointSet(); 00088 }; 00089 /////////////////////////////////////////////////////////////////////////////// 00090 /// Segment : résultat de plusieurs test 00091 /// 00092 /// Variation de l'algorithme de l'article pour segmenter une image 00093 /////////////////////////////////////////////////////////////////////////////// 00094 class Segment : public DisjointSet_Base{ 00095 /// Paramètre de l'algorithme 00096 float k; 00097 /// Arrête de poids minimal 00098 float edgeWeightMin; 00099 /// Arrête de poids maximal 00100 float edgeWeightMax; 00101 /// Différence maximal 00102 float edgeWeightDelta; 00103 public: 00104 /// Constructeur 00105 /// \param Node graphe de l'image à segmenter 00106 /// \param float paramètre de l'algorithme 00107 Segment(Node, float); 00108 /// Implémente l'algorithme 00109 Node makeDisjointSet(); 00110 }; 00111 /////////////////////////////////////////////////////////////////////////////// 00112 /// Meanshift 00113 /// 00114 /// Fusion des régions pour le MeanShift 00115 /////////////////////////////////////////////////////////////////////////////// 00116 class MeanShiftFusion : public DisjointSet_Base{ 00117 /// Compteur de fusion 00118 float radius; 00119 public: 00120 /// Constructeur 00121 /// \param le graphe de l'image à segmenter 00122 MeanShiftFusion(Node, float); 00123 /// Implémente l'algorithme 00124 Node makeDisjointSet(); 00125 }; 00126 /////////////////////////////////////////////////////////////////////////////// 00127 /// Elagage d'un graphe 00128 /// 00129 /// Fusion des régions plus petites qu'un nombre 00130 /////////////////////////////////////////////////////////////////////////////// 00131 class Prune : public DisjointSet_Base{ 00132 /// Compteur de fusion 00133 int area; 00134 public: 00135 /// Constructeur 00136 /// \param Node le graphe de l'image à segmenter 00137 /// \param int taille minimale 00138 Prune(Node, int); 00139 /// Implémente l'algorithme 00140 Node makeDisjointSet(); 00141 }; 00142 00143 #endif