From 5c3d356edbcb57c15d49b6c78b86f9487665774c Mon Sep 17 00:00:00 2001
From: ariotte <ariotte@PC-EII16.admr.insa>
Date: Tue, 26 Jun 2018 17:00:25 +0200
Subject: [PATCH] prevent region Growing from crashing result might be wrong

---
 app/Algorithms/Croissance.cpp   | 53 ++++++++++++++++++++++-----------
 app/Algorithms/Croissance.h     | 28 ++++++++---------
 app/Operations/CroissanceOp.cpp | 12 ++++++++
 3 files changed, 61 insertions(+), 32 deletions(-)

diff --git a/app/Algorithms/Croissance.cpp b/app/Algorithms/Croissance.cpp
index bc0dd93..d6c595f 100644
--- a/app/Algorithms/Croissance.cpp
+++ b/app/Algorithms/Croissance.cpp
@@ -22,7 +22,7 @@ Croissance::~Croissance()
 {
 }
 
-int Croissance::croissance1a( const Image *im, int threshhold, Image **luminance, Image **colorRgn ) {
+int Croissance::croissance1a( const Image *im, int threshold, Image **luminance, Image **colorRgn ) {
 
    // Random random;
     NbPointCell=0;
@@ -33,7 +33,7 @@ int Croissance::croissance1a( const Image *im, int threshhold, Image **luminance
     int lum = 0;
     float somlum;
   
-    seuil = threshhold;
+    seuil = threshold;
     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
@@ -80,7 +80,7 @@ int Croissance::croissance1a( const Image *im, int threshhold, Image **luminance
 	// 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;
+		 (tablabel[i] < size) && (tablabel[i] >= 0 ) ? 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)
@@ -172,7 +172,7 @@ void Croissance::parcours_parcelle1A()
   }
 }
 
-int Croissance::croissance1b( const Image *im, int threshhold, Image **luminance, Image **colorRgn  ) {
+int Croissance::croissance1b( const Image *im, int threshold, Image **luminance, Image **colorRgn  ) {
     Random random;
     NbPointCell=0;
 
@@ -182,7 +182,7 @@ int Croissance::croissance1b( const Image *im, int threshhold, Image **luminance
     int lum = 0;
     float somlum;
 
-    seuil = threshhold;
+    seuil = threshold;
     nbc = im->getWidth();
     nbl = im->getHeight();
     size = nbc * nbl;
@@ -193,11 +193,17 @@ int Croissance::croissance1b( const Image *im, int threshhold, Image **luminance
     tabout = new Image::depth_t[size];
     tablabel = new int[size];
     MoyCell = new int[size];
+    
+    for (int i = 0; i< size; i++){
+        tablabel[i] = 0;
+        MoyCell[i] = 0;
+    } 
 
     numregion=1 ;
     nbpregion=0 ;
     somlum=0;
 
+
     for(int i=0 ; i<nbl ; i++)
         for(int j=0 ; j<nbc ; j++)
         {
@@ -218,7 +224,7 @@ int Croissance::croissance1b( const Image *im, int threshhold, Image **luminance
         }
 
     for(int i=0 ; i<size ; i++)
-        tabout[i] = MoyCell[tablabel[i]];
+        (tablabel[i] < size )&& (tablabel[i] >= 0 ) ? tabout[i] = MoyCell[tablabel[i]] : tabout[i] = 0;
 
 
 
@@ -298,7 +304,7 @@ void Croissance::parcours_parcelle1B() {
   }
 }
 
-int Croissance::croissance2a( const Image *im, int threshhold, Image **luminance, Image **colorRgn  ) {
+int Croissance::croissance2a( const Image *im, int threshold, Image **luminance, Image **colorRgn  ) {
     Random random;
     NbPointCell=0;
 
@@ -308,7 +314,7 @@ int Croissance::croissance2a( const Image *im, int threshhold, Image **luminance
     int lum = 0;
     float somlum;
 
-    seuil = threshhold;
+    seuil = threshold;
     nbc = im->getWidth();
     nbl = im->getHeight();
     size = nbc * nbl;
@@ -320,20 +326,25 @@ int Croissance::croissance2a( const Image *im, int threshhold, Image **luminance
     tablabel = new int[size];
     MoyCell = new int[size];
 
-    numregion=1 ;
+    numregion=0 ;
     nbpregion=0 ;
     somlum=0;
     int min_i, min_j ,*tab_min_ij;
     tab_min_ij = new int[2*size];
     find_min(tab_min_ij) ;
 
+    for (int i = 0; i< size; i++){
+        tablabel[i] = 0;
+        MoyCell[i] = 0;
+    }
+
+
 
     int i = 0 ;
     do
     {
         min_i = tab_min_ij[i];
         min_j = tab_min_ij[i+1];
-
         if(tablabel[min_i*nbc+min_j] == 0)
         {
             numregion++;
@@ -350,11 +361,14 @@ int Croissance::croissance2a( const Image *im, int threshhold, Image **luminance
         i +=2 ;
     }while(i < 2*size);
 
-    for(int i=0 ; i<size ; i++)
-        tabout[i] = MoyCell[tablabel[i]];
-
+    //Ligne qui plante : 
+    for(int i=0 ; i<size ; i++){
+        (tablabel[i] < size ) && ( tablabel[i] >= 0 ) ? tabout[i] = MoyCell[tablabel[i]] : tabout[i] = 0;
+    }
     *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++) {
@@ -391,7 +405,7 @@ int Croissance::croissance2a( const Image *im, int threshhold, Image **luminance
 
 }
 
-int Croissance::croissance2b( const Image *im, int threshhold, Image **luminance, Image **colorRgn  ) {
+int Croissance::croissance2b( const Image *im, int threshold, Image **luminance, Image **colorRgn  ) {
     Random random;
     NbPointCell=0;
 
@@ -401,7 +415,7 @@ int Croissance::croissance2b( const Image *im, int threshhold, Image **luminance
     int lum = 0;
     float somlum;
 
-    seuil = threshhold;
+    seuil = threshold;
     nbc = im->getWidth();
     nbl = im->getHeight();
     size = nbc * nbl;
@@ -413,14 +427,17 @@ int Croissance::croissance2b( const Image *im, int threshhold, Image **luminance
     tablabel = new int[size];
     MoyCell = new int[size];
 
+    for (int i = 0; i< size; i++){
+         tablabel[i] = 0;
+         MoyCell[i] = 0;
+    }
+
     numregion=1 ;
     nbpregion=0 ;
     somlum=0;
     int min_i, min_j ,*tab_min_ij;
     tab_min_ij = new int[2*size];
     find_min(tab_min_ij) ;
-
-
     int i = 0 ;
     do
     {
@@ -444,7 +461,7 @@ int Croissance::croissance2b( const Image *im, int threshhold, Image **luminance
     }while(i < 2*size);
 
     for(int i=0 ; i<size ; i++)
-        tabout[i] = MoyCell[tablabel[i]];
+        (tablabel[i] < size ) && ( tablabel[i] >= 0 ) ? tabout[i] = MoyCell[tablabel[i]] : tabout[i] = 0;
 
     *luminance = new GrayscaleImage(nbc, nbl, tabout);
 
diff --git a/app/Algorithms/Croissance.h b/app/Algorithms/Croissance.h
index 6aa6010..e73b491 100644
--- a/app/Algorithms/Croissance.h
+++ b/app/Algorithms/Croissance.h
@@ -8,22 +8,22 @@ class Croissance
 {
   public:
 
-	  // élément de la pile de candidats
+	// element de la pile de candidats
 	struct croi_stackitem {
-        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 i, j; // coordonnees du pixel candidat
+		int seuil; // seuil (donne par l'utilisateur au debut de l'operation) -> pourquoi est il dans la structure et pas comme attribut de la classe croissance ?
+		int numregion; // numero de la region
+		float somlum; // luminance cumulee des pixels contenus dans la region pour laquelle le pixel est candidat
+        int nbpregion; // nombre de pixels dans la region pour laquelle le pixel est candidat
 		int lum; // luminance du pixel candidat
 	};
 
 	Croissance();
 	virtual ~Croissance();
     int croissance1a( const imagein::Image *im, int threshhold, imagein::Image **luminance, imagein::Image **colorRgn ); // At origin, | current - mean | < threshold
-    int croissance1b( const imagein::Image *im, int threshhold, imagein::Image **luminance, imagein::Image **colorRgn ); //
-    int croissance2a( const imagein::Image *im, int threshhold, imagein::Image **luminance, imagein::Image **colorRgn );
-    int croissance2b( const imagein::Image *im, int threshhold, imagein::Image **luminance, imagein::Image **colorRgn );
+    int croissance1b( const imagein::Image *im, int threshhold, imagein::Image **luminance, imagein::Image **colorRgn ); // At origin | current - initial | < threshold
+    int croissance2a( const imagein::Image *im, int threshhold, imagein::Image **luminance, imagein::Image **colorRgn ); // Point of lowest luminance | current - mean | < threshold
+    int croissance2b( const imagein::Image *im, int threshhold, imagein::Image **luminance, imagein::Image **colorRgn ); // Point of lowest luminance | current - initial | < threshold
 
 protected:
 	void parcours_parcelle1A();
@@ -33,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; // tableau de valeurs de l'image d'entrée (luminance) [0 ; size[
+    const imagein::Image::depth_t *tabin; // tableau de valeurs de l'image d'entree (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 *tablabel ; // tableau des numeros de regions pour chaque pixel de l'image [0 ; size[
+    long nbc,nbl,size ; // nombre de lignes, colonnes, et taille de l'image d'entree (et donc de sortie)
     int *tab_min_ij;
     float coefr,coefv,coefb;
-    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 (?)
+    std::vector<croi_stackitem> croi_stack; // pile contenant les pixels candidats a une region
+    int *MoyCell, NbPointCell; // tableau des valeurs moyenne des pixels par regions [0 ; numregion[, nombre de pixels dans une region (?)
 public:
 };
 
diff --git a/app/Operations/CroissanceOp.cpp b/app/Operations/CroissanceOp.cpp
index 559f2f8..c4831e1 100644
--- a/app/Operations/CroissanceOp.cpp
+++ b/app/Operations/CroissanceOp.cpp
@@ -82,26 +82,38 @@ void CroissanceOp::operator()(const imagein::Image* img, const std::map<const im
     Image *lum, *color;
     int nbRegion;
     int threshold = thresholdBox->value();
+    
+    //init at origin 
     if(initBox->currentIndex() == 0) {
         if(stopBox->currentIndex() == 0) {
+            //| current - mean | < threshold
             nbRegion = cr.croissance1a(image, threshold, &lum, &color);
         }
         else if(stopBox->currentIndex() == 1) {
+            //| current - initial | < threshold
             nbRegion = cr.croissance1b(image, threshold, &lum, &color);
         }
     }
+    //init at point of lowest luminance 
     else if (initBox->currentIndex() == 1) {
         if(stopBox->currentIndex() == 0) {
+            //| current - mean | < threshold
             nbRegion = cr.croissance2a(image, threshold, &lum, &color);
         }
         else if(stopBox->currentIndex() == 1) {
+            //| current - initial | < threshold
             nbRegion = cr.croissance2b(image, threshold, &lum, &color);
         }
     }
+
+
+    //Output
     outImage(lum, qApp->translate("CroissanceOp", "Luminance").toStdString());
     outImage(color, qApp->translate("CroissanceOp", "Color").toStdString());
     outText(qApp->translate("CroissanceOp", "Total number of area : %1").arg(nbRegion).toStdString());
     outText(qApp->translate("CroissanceOp", "Mean number of point per area : %1").arg((double)image->getWidth()*image->getHeight()/nbRegion).toStdString());
+    
+    
     delete image;
 }
 
-- 
GitLab