lreggr3d.c

Go to the documentation of this file.
00001 /*
00002 *    Copyright (c) 2007. The BATI team. All right reserved.
00003 *
00004 *    This file is part of BATI library.
00005 *
00006 *    BATI library is free software: you can redistribute it and/or modify
00007 *    it under the terms of the GNU General Public License as published by
00008 *    the Free Software Foundation, either version 3 of the License, or
00009 *    (at your option) any later version.
00010 *
00011 *    BATI library  is distributed in the hope that it will be useful,
00012 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 *    GNU General Public License for more details.
00015 *
00016 *    You should have received a copy of the GNU General Public License
00017 *    along with BATI library.  If not, see <http://www.gnu.org/licenses/>.
00018 */
00019 
00031   /* doc suivantes en sous-partie */  
00032 
00033 
00034 
00035 #include "image.h"
00036 #include "reggr3d.h"
00037 #include <stdlib.h>
00038 
00039 /*
00040   ETMAX correspond au nombre d'étiquette qu'il est possible de gérer.
00041   Cette valeur implique une réservation de 4*ETMAX octets pour la liste de chainage (long int).
00042   Puis il y aura 4*ETMAX pour les sommes par étiquette (float) et 4*ETMAX pour le nombre de points
00043   par étiquette (unsigned long int)
00044   ex: si ETMAX = 50 000 000 
00045   il faut 3*4*50M = 600Moctets 
00046 */
00047 #define ETMAX 17000000 
00048 //#define ETMAX 9000 
00049 
00050 #define ABSOL(x,y)  (((x) > (y))? abs(x-y) : abs(y-x))
00051 #define MAX(x,y) (((x)>(y))? (x):(y))
00052 #define MIN(x,y) (((x)<(y))? (x):(y))
00053 #define MIN3(x,y,z) ( ( ((x)<(y))&&((x)<(z))   )?(x):( ( ((x)>(y))&&((y)<(z))  )?y:z  )  )
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 /* *************************  LECTURE  *******************************/
00071 param* reggr3d_lect(reggr3d_t* des, param* ptp, char* debq)
00072 {
00073   char question[500];
00074   
00075   sprintf(question, "%s nb d'iteration ", debq); 
00076   lec_param(question, ptp);
00077   des->nb_loop = atoi(ptp->rep);
00078   ptp = ptp->next; 
00079 
00080   sprintf(question, "%s seuil de depart aggreg de 2 regions ", debq); 
00081   lec_param(question, ptp);
00082   des->seuil0 = atoi(ptp->rep);
00083   ptp = ptp->next;
00084  
00085   sprintf(question, "%s incrementation du seuil ", debq); 
00086   lec_param(question, ptp);
00087   des->step = atoi(ptp->rep);
00088   ptp = ptp->next; 
00089 
00090 /*   sprintf(question, "%s nombre des labels ", debq);  */
00091 /*   lec_param(question, ptp); */
00092 /*   des->lab_nr = atoi(ptp->rep); */
00093 /*   ptp = ptp->next; */
00094 
00095   return(ptp);
00096 }
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 /* *************************  INITIALISATION  ***************************/
00117 int reggr3d_init(reggr3d_t* des, ima3Du1* im0, ima3Du4* imres)
00118 {
00119 
00120   /* Allocation de l'image résultat */ 
00121   imres->dimx=im0->dimx;
00122   imres->dimy=im0->dimy;
00123   imres->dimz=im0->dimz;
00124   imres->lgtete= im0->lgtete;
00125   imres->dept= im0->dept;
00126   allouer_ima3Du4 (imres);
00127 
00128 
00129 }
00130 
00131 
00132 
00133 /*
00134   Gestion de l'équivalence entre deux étiquettes (a et b) dans la liste de chainage.
00135   Principe:
00136   On recherche l'étiquette minimum entre a et b. C'est cette étiquette qui sera
00137   utilisé pour le pixel courant ainsi que pour matérialiser l'équivalence.
00138   Puis les deux étiquettes sont traitées de la meme facon: si l'équivalence pour 
00139   l'étiquette a est différente du minimum alors sauvegarder l'équivalence existante 
00140   et ecrire le minimum. Ce traitement est ensuite reappliqué sur l'étiquette de 
00141   l'équivalence sauvgardée jusqu'a retrouver l'étiquette minimum dans la liste 
00142   de chainage.
00143     @param pt_etiq  pointeur sur la liste de chainage
00144     @param a  premiere etiquette
00145     @param b  deuxième etiquette
00146 */
00147 unsigned long int equivalence_2_label( unsigned  long int *pt_etiq, 
00148                                        unsigned  long int  a, 
00149                                        unsigned  long int  b){
00150   
00151   unsigned long  int minimum;
00152   unsigned long  int beta;   /*étiquette en cours de traitement*/
00153   unsigned long  int tmp;    /*sauvegarde des équivalences existants*/
00154   
00155   minimum = MIN(a,b);
00156   //minimum = MIN( pt_etiq[a], pt_etiq[b]);
00157 
00158   beta = a;
00159   while( pt_etiq[beta]!= minimum){
00160     tmp = pt_etiq[beta];
00161     pt_etiq[beta] = minimum;
00162     beta = tmp;
00163   }
00164 
00165   beta = b;
00166   while( pt_etiq[beta]!= minimum){
00167     tmp = pt_etiq[beta];
00168     pt_etiq[beta] = minimum;
00169     beta = tmp;
00170   }
00171 
00172   return( minimum);
00173 
00174 }
00175 
00176 
00177 
00178 
00179 
00180 /*
00181   Meme traitement que pour l'équivalence de deux étiquettes,
00182   mais pour trois.
00183 */
00184 unsigned long  int equivalence_3_label( unsigned long  int *pt_etiq, 
00185                                         unsigned long  int a, 
00186                                         unsigned long  int b,
00187                                         unsigned long  int c){
00188   
00189   unsigned long  int minimum;
00190   unsigned long  int beta;
00191   unsigned long  int tmp;
00192   
00193   //minimum = MIN3( pt_etiq[a], pt_etiq[b], pt_etiq[c]);
00194   minimum = MIN3( a, b, c);
00195 
00196   beta = a;
00197   while( pt_etiq[beta]!= minimum){
00198     tmp = pt_etiq[beta];
00199     pt_etiq[beta] = minimum;
00200     beta = tmp;
00201   }
00202 
00203   beta = b;
00204   while( pt_etiq[beta]!= minimum){
00205     tmp = pt_etiq[beta];
00206     pt_etiq[beta] = minimum;
00207     beta = tmp;
00208   }
00209 
00210   beta = c;
00211   while( pt_etiq[beta]!= minimum){
00212     tmp = pt_etiq[beta];
00213     pt_etiq[beta] = minimum;
00214     beta = tmp;
00215   }
00216   return( minimum);
00217 
00218 }
00219 
00220 
00221 
00222 
00223 
00224 /*
00225 Rappel sur la composition de la variable cas:
00226  __________________________________________
00227 | 0 | 0 | g-h | a-g | a-h | g-c | h-c | a-c|
00228 --------------------------------------------
00229 
00230 Les bits 0 à 5 sont a 1 si la différence est inférieure au seuil
00231 
00232 
00233 Action a réaliser en fonction des différents cas possibles: 4 actions possibles
00234 - nouvelle etiquette                   c <-- new_etiq()
00235 - étiquette du voisin sans équivalence c <-- etiq[a]
00236 - equivalence entre deux étiquettes    c <-- equiv(a,g)
00237 - équivalence entre trois étiquettes   c <-- equiv(a,g,h)
00238 Les cas non marqué ci-dessous sont des équivalence entre trois étiquettes.
00239 
00240 -- 0--0000 0000---                  c <-- new_etiq()
00241 --------------------
00242 -- 1--0000 0001--a,c--              c <-- etiq[a]
00243 -- 2--0000 0010--h,c--              c <-- etiq[h]
00244 -- 3--0000 0011--h,c-a,c--          c <-- equiv(a,h)
00245 -- 4--0000 0100--g,c--              c <-- etiq[g]
00246 -- 5--0000 0101--g,c-a,c--          c <-- equiv(a,g)
00247 -- 6--0000 0110--g,c-h,c--          c <-- equiv(g,h)
00248 -- 7--0000 0111--g,c-h,c-a,c--
00249 -- 8--0000 1000--a,h--              c <-- new_etiq()
00250 -- 9--0000 1001--a,h-a,c--          c <-- equiv(a,h)
00251 --10--0000 1010--a,h-h,c--          c <-- equiv(a,h)
00252 --------------------
00253 --11--0000 1011--a,h-h,c-a,c--      c <-- equiv(a,h)
00254 --12--0000 1100--a,h-g,c--          c <-- etiq[g]
00255 --13--0000 1101--a,h-g,c-a,c--
00256 --14--0000 1110--a,h-g,c-h,c--
00257 --15--0000 1111--a,h-g,c-h,c-a,c--
00258 --16--0001 0000--a,g--              c <-- new_etiq()
00259 --17--0001 0001--a,g-a,c--          c <-- equiv(a,g)
00260 --18--0001 0010--a,g-h,c--          c <-- etiq[h]
00261 --19--0001 0011--a,g-h,c-a,c--
00262 --20--0001 0100--a,g-g,c--          c <-- equiv(a,g)
00263 --------------------
00264 --21--0001 0101--a,g-g,c-a,c--      c <-- equiv(a,g)
00265 --22--0001 0110--a,g-g,c-h,c--
00266 --23--0001 0111--a,g-g,c-h,c-a,c--
00267 --24--0001 1000--a,g-a,h--          c <-- new_etiq()
00268 --25--0001 1001--a,g-a,h-a,c--
00269 --26--0001 1010--a,g-a,h-h,c--
00270 --27--0001 1011--a,g-a,h-h,c-a,c--
00271 --28--0001 1100--a,g-a,h-g,c--
00272 --29--0001 1101--a,g-a,h-g,c-a,c--
00273 --30--0001 1110--a,g-a,h-g,c-h,c--
00274 --------------------
00275 --31--0001 1111--a,g-a,h-g,c-h,c-a,c--
00276 --32--0010 0000--g,h--              c <-- new_etiq()
00277 --33--0010 0001--g,h-a,c--          c <-- etiq[a]
00278 --34--0010 0010--g,h-h,c--          c <-- equiv(g,h)
00279 --35--0010 0011--g,h-h,c-a,c--
00280 --36--0010 0100--g,h-g,c--          c <-- equiv(g,h)
00281 --37--0010 0101--g,h-g,c-a,c--
00282 --38--0010 0110--g,h-g,c-h,c--      c <-- equiv(g,h)
00283 --39--0010 0111--g,h-g,c-h,c-a,c--
00284 --40--0010 1000--g,h-a,h--          c <-- new_etiq()
00285 --------------------
00286 --41--0010 1001--g,h-a,h-a,c--
00287 --42--0010 1010--g,h-a,h-h,c--
00288 --43--0010 1011--g,h-a,h-h,c-a,c--
00289 --44--0010 1100--g,h-a,h-g,c--
00290 --45--0010 1101--g,h-a,h-g,c-a,c--
00291 --46--0010 1110--g,h-a,h-g,c-h,c--
00292 --47--0010 1111--g,h-a,h-g,c-h,c-a,c--
00293 --48--0011 0000--g,h-a,g--                c <-- new_etiq()
00294 --49--0011 0001--g,h-a,g-a,c--
00295 --50--0011 0010--g,h-a,g-h,c--
00296 --------------------
00297 --51--0011 0011--g,h-a,g-h,c-a,c--
00298 --52--0011 0100--g,h-a,g-g,c--
00299 --53--0011 0101--g,h-a,g-g,c-a,c--
00300 --54--0011 0110--g,h-a,g-g,c-h,c--
00301 --55--0011 0111--g,h-a,g-g,c-h,c-a,c--
00302 --56--0011 1000--g,h-a,g-a,h--            c <-- new_etiq()
00303 --57--0011 1001--g,h-a,g-a,h-a,c--
00304 --58--0011 1010--g,h-a,g-a,h-h,c--
00305 --59--0011 1011--g,h-a,g-a,h-h,c-a,c--
00306 --60--0011 1100--g,h-a,g-a,h-g,c--
00307 --------------------
00308 --61--0011 1101--g,h-a,g-a,h-g,c-a,c--
00309 --62--0011 1110--g,h-a,g-a,h-g,c-h,c--
00310 --63--0011 1111--g,h-a,g-a,h-g,c-h,c-a,c--
00311 
00312 */
00313 
00314 void label_management( unsigned char cas,           /*le cas a traiter*/
00315                        unsigned long  int haut,     /*l'étiquette du haut si elle existe*/
00316                        unsigned long  int gauche,   /*l'étiquette de la gauche si elle existe*/
00317                        unsigned long  int avant,    /*l'étiquette de la section d'avant si elle existe*/
00318                        unsigned int *courant, /*pointeur sur la case contenant l'étaiquette 
00319                                                       courante a déterminer*/
00320                        unsigned long  int *pt_etiq, /*pointeur sur le tableau permettant le 
00321                                                       chainage des étiquettes*/
00322                        unsigned long  int *nb_etiq  /*nombre d'étiquettes deja utilisées*/
00323             ) 
00324 {
00325   
00326   
00327   if(cas>=64) printf("PROBLEME\n");
00328 
00329   switch (cas) {
00330 
00331   case 0: 
00332   case 8:
00333   case 16:
00334   case 24:
00335   case 32:
00336   case 40:
00337   case 48:
00338   case 56:
00339     /* on attribue une nouvelle etiquette*/
00340     {
00341       *nb_etiq +=1;
00342       if(*nb_etiq>ETMAX-1) *nb_etiq=ETMAX-1;
00343       *courant = *nb_etiq;
00344       return;
00345     }
00346 
00347   case 1:
00348   case 33:
00349     /*  propagation de l'etiquette avant*/
00350     {
00351       *courant = pt_etiq[avant];
00352       return;
00353     }
00354 
00355   case 2: 
00356   case 18:
00357     /* propagation de l'etiquette du haut*/
00358     {
00359       *courant = pt_etiq[haut];
00360       return;
00361     }
00362 
00363   case 4 : 
00364   case 12:
00365     /* propagation de l'etiquette de gauche*/
00366     {
00367       *courant = pt_etiq[gauche];
00368       return;
00369     }
00370     
00371   case 3:
00372   case 9:
00373   case 10:
00374   case 11:
00375     /*equivalence entre avant et haut*/
00376     {
00377       *courant = equivalence_2_label( pt_etiq, avant, haut);
00378       return;
00379     }
00380 
00381 
00382   case 5:
00383   case 17:
00384   case 20:
00385   case 21:
00386     /*equivalence entre avant et gauche*/
00387     {
00388       *courant = equivalence_2_label(pt_etiq, avant, gauche);
00389       return;
00390     }
00391 
00392   case 6:
00393   case 34:
00394   case 36:
00395   case 38:
00396     /*equivalence entre gauche et haut*/
00397     {
00398       *courant = equivalence_2_label(pt_etiq, haut, gauche);
00399       return;
00400     }
00401 
00402   default:
00403     /*équivalence entre gauche, haut et avant */
00404     {
00405       *courant = equivalence_3_label(pt_etiq, haut, gauche, avant);  
00406 
00407       return;
00408     }    
00409   }/*fin du switch*/
00410 
00411 }
00412 
00413 
00414 
00415 /*
00416   Fonction pour la mise à jour des labels à l'aide du tableau de chainage
00417 */
00418 
00419 void 
00420 reetiquetage( ima3Du1* ima_ori,
00421               ima3Du4* ima_etiq,   /* adresse de l'image destination (etiquettes) */
00422               unsigned long  int *pt_etiq,
00423               unsigned long  int *pt_nb_etiq,        /* pointeur sur le nombre de label utilisé moins un*/
00424               unsigned long  int *pt_nb_real_etiq)   /* Nombre réal de label apres mise a jour  */
00425 {
00426   register unsigned int x,y,z;
00427   unsigned long int i;
00428   unsigned long  int label_effectif_max =0;
00429   unsigned long  int nb_label_effectif  =1;
00430   unsigned long  int nb_label_effectif2 =0;
00431   unsigned long  int tmp;
00432   unsigned long int *pt_nbel; 
00433   float *pt_moy;
00434 
00435   /*mise a jour du tableau de chainage*/
00436   for (i = 0; i <= (*pt_nb_etiq); i++) {
00437     tmp = i;
00438     while (pt_etiq[tmp]!=tmp){
00439       tmp = pt_etiq[tmp];
00440     }
00441     pt_etiq[i] = tmp;
00442   }
00443   
00444 
00445   /*Allocation du tableau pour compter le nombre de points pour chaque label*/
00446   pt_nbel = (unsigned long int *)calloc( (*pt_nb_etiq)+1, sizeof(*pt_nbel));  
00447   /*Allocation du tableau pour cumuler les niveau de gris*/
00448   pt_moy = (float *)calloc( (*pt_nb_etiq)+1, sizeof(*pt_moy)); 
00449   if( pt_nbel == NULL || pt_moy == NULL){
00450     printf("Probleme d'allocation memoire\n");
00451     exit(1);
00452   }
00453 
00454   /*mise a zero des tableaux*/
00455   for(i=0; i<=(*pt_nb_etiq); i++){
00456     pt_nbel[i] = 0;
00457     pt_moy[i]  = 0.0;
00458   }
00459 
00460 
00461   /*Mise à jour des labels et comptage du nombre de points par région*/ 
00462   for( z=0; z<ima_etiq->dimz; z++){
00463     for( x=0; x<ima_etiq->dimx; x++){
00464       for( y=0; y<ima_etiq->dimy; y++){
00465         ima_etiq->data[z][y][x] = pt_etiq[ ima_etiq->data[z][y][x] ];
00466         pt_nbel[ima_etiq->data[z][y][x]] = pt_nbel[ima_etiq->data[z][y][x]] + 1.0;
00467       }
00468     }
00469   }
00470   
00471   /*Calcul de l'intensité moyenne pour chaque regions*/ 
00472   /*possibilité de faire du filtrage*/
00473   for( z=0; z<ima_etiq->dimz; z++)
00474     for( x=0; x<ima_etiq->dimx; x++)
00475       for( y=0; y<ima_etiq->dimy; y++)
00476         pt_moy[ima_etiq->data[z][y][x]] +=  
00477           (float)(ima_ori->data[z][y][x]) / (float)(pt_nbel[ima_etiq->data[z][y][x]]);
00478  
00479 
00480   /*filtrage sur les regions en fonction de leur volume*/
00481   /*
00482   for( i=0; i<= (*pt_nb_etiq); i++){
00483     if( pt_nbel[i] < 1000) pt_moy[i]=255.0;
00484   }
00485   */
00486 
00487   /*comptage du nombre de label effectif*/
00488   for( i=0; i<= (*pt_nb_etiq); i++){
00489     if( pt_nbel[i]!= 0.0){
00490       ++nb_label_effectif2;
00491     }
00492   }
00493   //printf("Autre facon de compter les elements effectifs!!! %d\n", nb_label_effectif2);
00494 
00495   /*dernier passage pour mettre la moyenne dans chaque region*/  
00496   for( z=0; z<ima_etiq->dimz; z++)
00497     for( x=0; x<ima_etiq->dimx; x++)
00498       for( y=0; y<ima_etiq->dimy; y++)
00499         ima_ori->data[z][y][x] = (unsigned char)(pt_moy[ ima_etiq->data[z][y][x] ]); 
00500   
00501   *pt_nb_real_etiq = nb_label_effectif2;
00502   printf("nb_label_effectif: %d\n", nb_label_effectif2);
00503 
00504 
00505   /*desallocation*/
00506   free(pt_nbel);
00507   free(pt_moy);
00508 }
00509 
00510 
00511 
00512 
00513 
00514 
00515 
00516 
00517 
00518 
00519 
00520 
00521 
00522 /*
00523   Fonction pour la recherche des étiquettes et la gestion du chainage
00524 
00525 */
00526 void 
00527 etiquetage(ima3Du1* ima_in,     /* adr de l'image origine (initiale ou segmentee) */
00528            ima3Du4* ima_etiq,   /* adresse de l'image destination (etiquettes) */
00529            unsigned char seuil,      /* seuil pour la comparaison des pixels */
00530            unsigned long int *pt_nb_etiq,     /* nombre de label utilisé*/
00531            unsigned long int *nb_real_etiq)   /* nombre de label apres simplification */
00532 {
00533   int cas;  
00534   register  int x,y,z;
00535   unsigned long int i;
00536   unsigned long  int *pt_etiq;          /* pointeur tableau d'etiquettes */  
00537   unsigned long  int nb_etiq;          /* compteur des etiquettes */ 
00538  
00539 
00540   //printf("size au float %d\n", sizeof(double));
00541   /*Allocation du tableau de chainage*/
00542   pt_etiq = (unsigned long  int *)calloc(ETMAX, sizeof(unsigned long  int)); 
00543   if(pt_etiq == NULL){
00544     printf("Probleme d'allocation mémoire (pt_etiq)\n");
00545     exit(1);
00546   }
00547 
00548 
00549   /*initialisation du tableau*/
00550   for( i=0; i<ETMAX ; i++)
00551     pt_etiq[i] = i;  
00552   nb_etiq = 0;
00553   
00554 
00555   /*mise a zero de la premiere étiquette*/
00556   ima_etiq->data[0][0][0] = 0;
00557 
00558 
00559   /*traitement de la premiere ligne du bloc*/
00560   x = 0;
00561   z = 0;
00562   for( y=1; y<ima_in->dimy; y++){
00563     cas = 0;
00564     //printf("diff=%d\n", ABSOL( ima_in->data[z][y][x], ima_in->data[z][y-1][x]) );
00565     if( ABSOL( ima_in->data[z][y][x], ima_in->data[z][y-1][x]) <= seuil) 
00566       cas += 4; /*g et c similaire*/
00567     label_management( cas,
00568                       0, /*haut*/
00569                       ima_etiq->data[z][y-1][x],/*gauche*/ 
00570                       0,/*avant*/
00571                       &ima_etiq->data[z][y][x], /*courant*/
00572                       pt_etiq,
00573                       &nb_etiq
00574           );
00575   }
00576   //printf("\nFin Traitement premiere ligne\n");
00577   //for( x=0; x<=nb_etiq; x++)
00578   //printf("%d --> %d\n", x, pt_etiq[x]);
00579 
00580 
00581   /*traitement des autres lignes de la premiere section*/ 
00582   z = 0;
00583   for( x=1; x<ima_in->dimx; x++){
00584     for( y=0; y<ima_in->dimy; y++){
00585       cas = 0;
00586 
00587       /*on peut toujours comparer avec le haut*/
00588       if( ABSOL( ima_in->data[z][y][x], ima_in->data[z][y][x-1]) <= seuil) 
00589         cas += 2; /*h et c similaire*/
00590 
00591       /* En plus, si on n'est pas sur la premiere colonne
00592          on peut faire les comparaisons avec la gauche*/
00593       if( y!=0){ 
00594         /*comparaison avec celui de gauche*/
00595         if( ABSOL( ima_in->data[z][y][x], ima_in->data[z][y-1][x]) <= seuil) 
00596           cas += 4; /*g et c similaire*/
00597         if( ABSOL( ima_in->data[z][y-1][x], ima_in->data[z][y][x-1]) <= seuil) 
00598           cas += 32; /*g et h similaire*/               
00599         label_management( cas,
00600                           ima_etiq->data[z][y][x-1] /*haut*/,
00601                           ima_etiq->data[z][y-1][x]/*gauche*/, 
00602                           0, /*avant*/
00603                           &ima_etiq->data[z][y][x], /*courant*/
00604                           pt_etiq,
00605                           &nb_etiq
00606                           );
00607       }
00608       else{
00609         label_management( cas,
00610                           ima_etiq->data[z][y][x-1] /*haut*/,
00611                           0, /*gauche*/ 
00612                           0, /*avant*/
00613                           &ima_etiq->data[z][y][x], /*courant*/
00614                           pt_etiq,
00615                           &nb_etiq
00616                           );
00617       }
00618     }
00619   }
00620 
00621   
00622   /*traitement des autres sections du bloc*/
00623   for( z=1; z<ima_in->dimz; z++){
00624     for( x=0; x<ima_in->dimx; x++){
00625       for( y=0; y<ima_in->dimy; y++){
00626         cas = 0;
00627         
00628         /*comparaison avec le plan d'avant toujours possible*/
00629         if( ABSOL( ima_in->data[z][y][x], ima_in->data[z-1][y][x]) <= seuil) 
00630           cas += 1; /*a et c similaire*/
00631         
00632         
00633         /*gestion de la premiere ligne*/
00634         if(x==0){ 
00635           if(y!=0){ /*on ne se trouve pas sur le premier point de la ligne*/
00636             if( ABSOL( ima_in->data[z][y][x], ima_in->data[z][y-1][x]) <= seuil) 
00637               cas += 4; /*g et c similaire*/        
00638             if( ABSOL( ima_in->data[z][y-1][x], ima_in->data[z-1][y][x]) <= seuil) 
00639               cas += 16; /*g et a similaire*/
00640             label_management( cas,
00641                               0 /*haut*/,
00642                               ima_etiq->data[z][y-1][x] /*gauche*/, 
00643                               ima_etiq->data[z-1][y][x] /*avant*/,
00644                               &ima_etiq->data[z][y][x], /*courant*/
00645                               pt_etiq,
00646                               &nb_etiq
00647                               );
00648             
00649           }
00650           else{
00651             label_management( cas,
00652                               0 /*haut*/,
00653                               0 /*gauche*/, 
00654                               ima_etiq->data[z-1][y][x] /*avant*/,
00655                               &ima_etiq->data[z][y][x], /*courant*/
00656                               pt_etiq,
00657                               &nb_etiq
00658                               );
00659             
00660           }
00661         }
00662         else{ /*gestion des lignes suivantes*/
00663 
00664           /*comparaison avec le haut toujours possible*/
00665           if( ABSOL( ima_in->data[z][y][x], ima_in->data[z][y][x-1]) <= seuil) 
00666             cas += 2; /*h et c similaire*/          
00667           if( ABSOL( ima_in->data[z][y][x-1], ima_in->data[z-1][y][x]) <= seuil) 
00668             cas += 8; /*h et a similaire*/      
00669             
00670           if(y!=0){ /*on ne se trouve pas sur le premier point de la ligne*/
00671             if( ABSOL( ima_in->data[z][y][x], ima_in->data[z][y-1][x]) <= seuil) 
00672               cas += 4; /*g et c similaire*/        
00673             if( ABSOL( ima_in->data[z][y-1][x], ima_in->data[z-1][y][x]) <= seuil) 
00674               cas += 16; /*g et a similaire*/       
00675             if( ABSOL( ima_in->data[z][y-1][x], ima_in->data[z][y][x-1]) <= seuil) 
00676               cas += 32; /*g et h similaire*/
00677             label_management( cas,
00678                               ima_etiq->data[z][y][x-1] /*haut*/,
00679                               ima_etiq->data[z][y-1][x] /*gauche*/, 
00680                               ima_etiq->data[z-1][y][x] /*avant*/,
00681                               &ima_etiq->data[z][y][x], /*courant*/
00682                               pt_etiq,
00683                               &nb_etiq
00684                               );
00685           }
00686           else{
00687             label_management( cas,
00688                               ima_etiq->data[z][y][x-1] /*haut*/,
00689                               0 /*gauche*/, 
00690                               ima_etiq->data[z-1][y][x] /*avant*/,
00691                               &ima_etiq->data[z][y][x], /*courant*/
00692                               pt_etiq,
00693                               &nb_etiq
00694                               );            
00695           }
00696         } /*fin test sur les lignes*/
00697         
00698         
00699       } /*fin sur y*/
00700     } /*fin sur x*/
00701   } /*fin sur z*/
00702   
00703   
00704   printf("nb_etiq = %d (max %d)\n", nb_etiq+1, ETMAX);
00705   if( nb_etiq+1 == ETMAX) {
00706     printf("-----DANGER Pas assez d'etiquettes !!!----\n");
00707   }
00708 
00709   *pt_nb_etiq = nb_etiq+1;
00710 
00711   
00712   reetiquetage( ima_in,
00713                 ima_etiq,   /* adresse de l'image destination (etiquettes) */
00714                 pt_etiq,
00715                 &nb_etiq,        /* nombre de label utilisé*/
00716                 nb_real_etiq);   /*Nombre réal de label apres mise a jour  */
00717 
00718   /*liberation de la liste de chainage*/
00719   free( pt_etiq);
00720 }
00721 
00722 
00723 
00724 
00725 
00726 
00727 /* *************************  CALCUL  ***************************/
00738 int reggr3d_calc(reggr3d_t *des, ima3Du1* im0, ima3Du4 *imres)
00739 {
00740   
00741   unsigned char i;
00742 
00743   for( i=0; i<des->nb_loop; i++){
00744     printf("-------Etiquettage %d --- seuil %d -----\n", i, des->seuil0 + (i*des->step));
00745     etiquetage( im0,   /* adr de l'image origine (initiale ou segmentee) */
00746                 imres, /* adresse de l'image destination (etiquettes) */
00747                 des->seuil0 + (i*des->step), /* seuil pour la comparaison des pixels */
00748                 &(des->nb_etiq),             /* nombre de label utilisé*/
00749                 &(des->nb_label)             /* nombre de label restant apres simplfication  */
00750                 );           
00751   }
00752     
00753   
00754 
00755 }

Generated on Tue Apr 22 13:31:06 2008 for volume by  doxygen 1.5.3