00001 /// \file 00002 /// Définition des classes pour le Meanshift 00003 #ifndef GUARD_MEANSHIFT_H 00004 #define GUARD_MEANSHIFT_H 00005 00006 #include "Debug.hpp" 00007 #include "Pixel.hpp" 00008 #include "PNG.hpp" 00009 #include "PixelMap.hpp" 00010 #include "FVector.hpp" 00011 using namespace std; 00012 00013 static Channel channelMeanShift(&cout); 00014 /////////////////////////////////////////////////////////////////////////////// 00015 /// Etat des points visités par le filtre Meanshift 00016 /////////////////////////////////////////////////////////////////////////////// 00017 enum ELATTICE_STATE{ 00018 ELATTICE_NO_MODE, 00019 ELATTICE_HAS_MODE, 00020 ELATTICE_CANDIDATE_MODE 00021 }; 00022 /////////////////////////////////////////////////////////////////////////////// 00023 /// Représente une zone rectangulaire de vecteurs de Features 00024 /// 00025 /// Données du filtre Meanshift 00026 /////////////////////////////////////////////////////////////////////////////// 00027 class Lattice{ 00028 /// Image représentée 00029 PNG image; 00030 /// Largeur, hauteur et taille de l'imisate 00031 int width, height, size; 00032 /// Cache des points explorés 00033 vector<int> visited; 00034 /// Valeurs d'entrée 00035 vector<FVector> input; 00036 /// Valeurs de sortie 00037 vector<FVector> output; 00038 /// Etat des point explorés 00039 vector<ELATTICE_STATE> state; 00040 00041 public: 00042 /// Crée à partir d'une image 00043 Lattice(PNG); 00044 /// Retourne la largeur 00045 int getWidth()const; 00046 /// Retourne la hauteur 00047 int getHeight()const; 00048 /// Retourne le vecteur (i, j) 00049 FVector getFVector(const int, const int); 00050 /// Retourne le résultat du filtre (i, j) 00051 FVector getOutputFVector(const int, const int)const; 00052 /// Fixe le résultat du filtre (i, j) 00053 void setOutputFVector(const int, const int, const FVector); 00054 /// Retourne l'état du vecteur (i, j) 00055 ELATTICE_STATE getState(int, int)const; 00056 /// Fixe l'état du vecteur (i, j) 00057 void setState(const int, const int, const ELATTICE_STATE); 00058 }; 00059 /////////////////////////////////////////////////////////////////////////////// 00060 /// Représente la fenêtre du Meanshift 00061 /////////////////////////////////////////////////////////////////////////////// 00062 class MeanShiftWindow{ 00063 /// Centre de la fenêtre 00064 FVector center; 00065 /// Dimension spatial de la fenêtre 00066 int size; 00067 /// Dimension dans l'espace des couleurs 00068 float radius; 00069 /// Données de à explorer 00070 Lattice& lattice; 00071 /// Données de la fenêtre 00072 vector<FVector> data; 00073 public: 00074 /// Construit une fenêtre pour le filtre Meanshift 00075 /// \param int dimesion spatial 00076 /// \param float dimension dans l'espace des couleurs 00077 /// \param Lattice& données à explorer 00078 MeanShiftWindow(int, float, Lattice&); 00079 /// Retourne une chaîne de caractères détaillée 00080 string toString() const; 00081 /// Fixe le centre de la fenêtre 00082 /// \param int coordonnée spatial x 00083 /// \param int coordonnée spatial y 00084 void setCenter(const int, const int); 00085 /// Cherche les données correspondant au centre 00086 void findPixel(); 00087 /// Calcule la moyenne 00088 /// \return float norme entre le centre et la moyenne calculée 00089 float computeMean(); 00090 /// Retourne le centre de la fenêtre 00091 FVector getCenter() const; 00092 }; 00093 /////////////////////////////////////////////////////////////////////////////// 00094 /// Calcul du filtre Meanshift 00095 /////////////////////////////////////////////////////////////////////////////// 00096 class MeanShift{ 00097 /// Données à explorer 00098 Lattice lattice; 00099 /// Fenêtre d'exploration 00100 MeanShiftWindow window; 00101 /// Dimension spatial 00102 int size; 00103 /// Dimension dans l'espace des couleurs 00104 float radius; 00105 /// Limite pour le calcul d'un mode 00106 int maxIter; 00107 /// Limite pour le speedup 00108 float tol; 00109 public: 00110 /// Algorithme du filtre Meanshift 00111 /// \param int dimension spatial 00112 /// \param float dimension dans l'espace des couleurs 00113 /// \param PNG image à filtrer 00114 /// \param float tolérance pour le speedup 00115 /// \param int maximum pour le calcul d'un mode 00116 MeanShift(int, float, PNG, float = 0.1, int = 30); 00117 /// Affiche une chaîne de caractères détaillé 00118 string toString() const; 00119 /// Trouve un mode 00120 /// \param int coordonnée x du mode à chercher 00121 /// \param int coordonnée y du mode à chercher 00122 void findMode(const int, const int); 00123 /// Calcul le filtre Meanshift 00124 void doFilter(); 00125 /// Construit un graphe d'adjacence des modes calculés 00126 Node makeNode(); 00127 }; 00128 #endif