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