From b0c79e2519cb21016c95c30f6187cef57bfc0e4c Mon Sep 17 00:00:00 2001 From: Antoine Pazat <antoine.pazat@gmail.com> Date: Thu, 30 Jun 2016 11:44:19 +0200 Subject: [PATCH] =?UTF-8?q?Modification=20Transform=C3=A9e=20de=20Hough1,?= =?UTF-8?q?=20pixels=20repr=C3=A9sentant=20les=20droites=20verticales=20af?= =?UTF-8?q?fich=C3=A9s,=20Algorithme=20de=20Croissance=20comment=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Algorithms/Croissance.cpp | 103 +++++++++++++++++++++------------- app/Algorithms/Croissance.h | 26 +++++---- app/Operations/Transforms.cpp | 2 +- 3 files changed, 78 insertions(+), 53 deletions(-) diff --git a/app/Algorithms/Croissance.cpp b/app/Algorithms/Croissance.cpp index ff32ac7..5c039f6 100644 --- a/app/Algorithms/Croissance.cpp +++ b/app/Algorithms/Croissance.cpp @@ -34,64 +34,76 @@ int Croissance::croissance1a( const Image *im, int threshhold, Image **luminance float somlum; seuil = threshhold; - nbc = im->getWidth(); - nbl = im->getHeight(); - size = nbc * nbl; + nbc = im->getWidth(); // nombre de colonnes de l'image d'entrée + nbl = im->getHeight(); // nombre de lignes de l'image d'entrée + size = nbc * nbl; // taille de l'image // BasicImageFun bif; tabin = im->begin(); - tabout = new Image::depth_t[size]; - tablabel = new int[size]; - MoyCell = new int[size]; + tabout = new Image::depth_t[size]; // tableau de valeurs pour l'image de sortie (luminance) [0 ; size[ + tablabel = new int[size]; // tableau des numéros de régions pour chaque pixel de l'image [0 ; size[ + MoyCell = new int[size]; // tableau des valeurs moyenne des pixels par régions [0 ; numregion[ - numregion=0 ; - nbpregion=0 ; - somlum=0; + // initialisation de tablabel a zero (nécessaire ?) + for (int i = 0; i < size; i++) { + tablabel[i] = 0; + } + + // initialisation des paramètres + numregion=0 ; // aucune région créée au début de l'algorithme + nbpregion=0 ; // aucun pixel dans la région courante au début de l'algorithme + somlum=0; // luminance cumulée des pixels dans la région couratne nulle au début de l'algorithme for(int i=0 ; i<nbl ; i++) for(int j=0 ; j<nbc ; j++) { - if(tablabel[i*nbc+j] == 0) + if(tablabel[i*nbc+j] == 0) // si le pixel courant n'appartient pas a une region { - numregion++; + // On cree une nouvelle region + //numregion++; MoyCell[numregion] = 0; - pushItem(i,j,seuil,numregion,somlum,nbpregion,lum); + pushItem(i,j,seuil,numregion,somlum,nbpregion,lum);//on ajoute le pixel dans la pile des candidats (ce sera la seed) while( !croi_stack.empty() ) { - parcours_parcelle1A(); - } - MoyCell[numregion] = MoyCell[numregion]/NbPointCell; - } - + parcours_parcelle1A(); //ajoute les pixels qui valident le critère dans la région, et les pixels voisins dans la pile des candidats + } // while : on sort de cette boucle quand la région est complète (pile de candidats vide) + MoyCell[numregion] = MoyCell[numregion]/NbPointCell; // calcul de la luminance moyenne des pixels dans la région + } // if : fin de la création de la région liée au pixel courant + numregion++; + // on réinitialise les paramètres pour la création de la prochaine région NbPointCell = 0; somlum=0; nbpregion=0; - } - - for(int i=0 ; i<size ; i++) - tabout[i] = MoyCell[tablabel[i]]; - + // on ne réinitialise pas lum ? (entier passé en paramètre pour la création d'un stackitem) + }// for : parcours de l'image d'entrée + + // remplissage de tabout + for (int i = 0; i < size; i++) + // chaque pixel de l'image de sortie prend la valeur de la valeur moyenne des pixels de la région à laquelle il appartient + tablabel[i] < size ? tabout[i] = MoyCell[tablabel[i]] : tabout[i] = 0; + // tabout[i] = MoyCell[tablabel[i]]; + // Construction de l'image de sortie en luminance (en utilisant les valeurs de tabout) *luminance = new GrayscaleImage(nbc, nbl, tabout); - RgbImage* ic = new RgbImage(nbc, nbl); - for(int j=0 ; j<nbl ; j++) { - for(int i=0 ; i<nbc ; i++) { - int n = tablabel[j*nbc + i] - 1; /* € [0, numregion[ */ - const int nhue = 360; - const int ngrad = ceil((double)numregion / (double)nhue); - const int hue = floor(n * nhue / numregion); /* € [0, nhue[ */ - const int grad = n - ceil((double)hue * (double)numregion / (double)nhue); /* € [0, ngrad[ */ - if(grad < 0 || grad >= ngrad) { - cout << "grad = " << grad << endl; - } - QColor color = QColor::fromHsl(hue, 255, (grad + 1) * 255 / (ngrad + 1)); - ic->setPixel(i, j, 0, color.red()); - ic->setPixel(i, j, 1, color.green()); - ic->setPixel(i, j, 2, color.blue()); - } - } + RgbImage* ic = new RgbImage(nbc, nbl); + for (int j = 0; j<nbl; j++) { + for (int i = 0; i<nbc; i++) { + int n = tablabel[j*nbc + i] - 1; /* € [0, numregion[ */ + const int nhue = 360; + const int ngrad = ceil((double)numregion / (double)nhue); + const int hue = floor(n * nhue / numregion); /* € [0, nhue[ */ + const int grad = n - ceil((double)hue * (double)numregion / (double)nhue); /* € [0, ngrad[ */ + if (grad < 0 || grad >= ngrad) { + cout << "grad = " << grad << endl; + } + QColor color = QColor::fromHsl(hue, 255, (grad + 1) * 255 / (ngrad + 1)); + ic->setPixel(i, j, 0, color.red()); + ic->setPixel(i, j, 1, color.green()); + ic->setPixel(i, j, 2, color.blue()); + } + } *colorRgn = ic; @@ -112,9 +124,12 @@ void Croissance::parcours_parcelle1A() if( croi_stack.empty() ) { throw("Error in Croissance::parcours_parcelle1B:\ncroi_stack.empty() = TRUE"); } + + // on dépile un élément croi_stackitem csi; csi = croi_stack.back(); croi_stack.pop_back(); + int i = csi.i; int j = csi.j; int seuil = csi.seuil; @@ -123,26 +138,34 @@ void Croissance::parcours_parcelle1A() int nbpregion = csi.nbpregion; int lum = csi.lum; + // si le pixel dépilé est le premier pixel de la region if(nbpregion == 0) { + // on ajoute le pixel a la region tablabel[i*nbc+j] = numregion; MoyCell[numregion] += tabin[i*nbc+j] ; NbPointCell ++ ; somlum += tabin[i*nbc+j]; - lum = tabin[i*nbc+j] ; + lum = tabin[i*nbc+j] ; // remplace la valeur de csi.lum (=0 au début de l'algorithme, puis a la valeur précédente de tabin[i*nbc+j] nbpregion++; + + // on empile les pixels voisins (s'ils existent) if(j<nbc-1) pushItem(i,j+1,seuil,numregion,somlum,nbpregion,lum); if(i<nbl-1) pushItem(i+1,j,seuil,numregion,somlum,nbpregion,lum); if(j>0) pushItem(i,j-1,seuil,numregion,somlum,nbpregion,lum); if(i>0) pushItem(i-1,j,seuil,numregion,somlum,nbpregion,lum); } + // si le pixel dépilé est candidat else if(fabs((double)(tabin[i*nbc+j]-somlum/nbpregion)) < (double)(seuil) && tablabel[i*nbc+j]==0) { + // on ajoute le pixel a la region (s'ils existent) tablabel[i*nbc+j] = numregion; MoyCell[numregion] += tabin[i*nbc+j] ; NbPointCell ++ ; somlum += tabin[i*nbc+j]; nbpregion++; + + // on empile les pixels voisins (si on est pas au bord de l'image) if(j<nbc-1) pushItem(i,j+1,seuil,numregion,somlum,nbpregion,lum); if(i<nbl-1) pushItem(i+1,j,seuil,numregion,somlum,nbpregion,lum); if(j>0) pushItem(i,j-1,seuil,numregion,somlum,nbpregion,lum); diff --git a/app/Algorithms/Croissance.h b/app/Algorithms/Croissance.h index f5a8c59..f04d4a3 100644 --- a/app/Algorithms/Croissance.h +++ b/app/Algorithms/Croissance.h @@ -7,13 +7,15 @@ class Croissance { public: + + // élément de la pile de candidats struct croi_stackitem { - int i, j; - int seuil; - int numregion; - float somlum; - int nbpregion; - int lum; + int i, j; // coordonnées du pixel candidat + int seuil; // seuil (donné par l'utilisateur au début de l'opération) -> pourquoi est il dans la structure et pas comme attribut de la classe croissance ? + int numregion; // numéro de la region + float somlum; // luminance cumulée des pixels contenus dans la région pour laquelle le pixel est candidat + int nbpregion; // nombre de pixels dans la région pour laquelle le pixel est candidat + int lum; // luminance du pixel candidat }; Croissance(); @@ -31,14 +33,14 @@ protected: void pushItem(int i, int j, int seuil, int numregion, float somlum, int nbpregion, int lum); void find_min(int *tabmin); - const imagein::Image::depth_t *tabin; - imagein::Image::depth_t *tabout; - int *tablabel ; - long nbc,nbl,size ; + const imagein::Image::depth_t *tabin; // tableau de valeurs de l'image d'entrée (luminance) [0 ; size[ + imagein::Image::depth_t *tabout; // tableau de valeurs pour l'image de sortie (luminance) [0 ; size[ + int *tablabel ; // tableau des numéros de régions pour chaque pixel de l'image [0 ; size[ + long nbc,nbl,size ; // nombre de lignes, colonnes, et taille de l'image d'entrée (et donc de sortie) int *tab_min_ij; float coefr,coefv,coefb; - std::vector<croi_stackitem> croi_stack; - int *MoyCell, NbPointCell; + std::vector<croi_stackitem> croi_stack; // pile contenant les pixels candidats a une région + int *MoyCell, NbPointCell; // tableau des valeurs moyenne des pixels par régions [0 ; numregion[, nombre de pixels dans une région (?) public: }; diff --git a/app/Operations/Transforms.cpp b/app/Operations/Transforms.cpp index 36bf142..053e25b 100644 --- a/app/Operations/Transforms.cpp +++ b/app/Operations/Transforms.cpp @@ -97,7 +97,7 @@ Image_t<double>* Transforms::hough(const GrayscaleImage *image ) { y2 = x1 != x0 ? atan((y1-y0) / (x1-x0)) : y1 > y0 ? pid2 : -pid2; // j2 = (y2 / pi + 0.5) * image->getHeight() + 0.5; // j2 = (y2 * 2. + pi)*100. + 0.5; - j2 = (y2 / pi) * 180. + 90. + 0.5; + y2 == pid2 ? j2 = 179 : j2 = (y2 / pi) * 180. + 90. + 0.5; // j2 = (x1 != x0) ? 125.5 + atan((y1-y0)/(x1-x0))*124./pid2 : 250; // itab[j2*width+i2]++; -- GitLab