Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1.  
  2. /* Labelise en parall�le */
  3. void LabelRosenfeld::labeliseParallele4C(Region32& region32) {
  4.    
  5.     int i=0, j;
  6.     int nbThreads = region32.np;
  7.     int i0=region32.i0, i1=region32.i1, j0=region32.j0, j1=region32.j1;
  8.     int h = i1-i0;
  9.     int l = j1 - j0;
  10.     /* Calcul de la hauteur de chaque bande */
  11.     int hp = h / nbThreads;
  12.  
  13.     unsigned char x1,x2,x;
  14.     uint32_t e1, e2, e3, e4, root, r2, r4, epsillon;
  15.  
  16.     /* Netoyage */
  17.     region32.cleanRegions32();
  18.  
  19.     //traiter indépendamment chacune des régions 1 fois
  20. #pragma omp parallel for
  21.     for (i=0 ; i < region32.Regions.size() ; i++){
  22.         /* Premier etiquetage */
  23.         region32.Regions[i].ne = i*NEMAX/region32.Regions.size();
  24.         for (j=region32.Regions[i].i0+1; j<region32.Regions[i].i1; j++) {
  25.             region32.Regions[i].ne = lineLabeling4C(region32.X, j, region32.E, region32.T, l, region32.Regions[i].ne);
  26.         }
  27.     }
  28.    
  29.  
  30.     /**
  31.      * ESSATONS D UNIFIER LES ETIQUETTES A LA FRONTIERE
  32.      */
  33. #pragma omp parallel for
  34.     for(i=hp ; i<h-1 ; i+=hp){
  35.         //i est la ligne concernée
  36.         lineLabeling4C(region32.X, i, region32.E, region32.T, l, region32.ne);
  37.     }
  38.     //on doit alors mettre a jour l'image en fonction de cette nouvelle equivalence
  39. /*#pragma omp parallel for
  40.     for (i=0 ; i < region32.Regions.size() ; i++){
  41.         updateLabel(region32.E, region32.Regions[i].i0, region32.Regions[i].i1, region32.Regions[i].j0, region32.Regions[i].j1, region32.T);
  42.     }*/
  43.     updateLabel(region32.E, i0, i1, j0, j1, region32.T);
  44.    
  45.  
  46.    
  47.     for(i=hp+1 ; i<h-1 ; i+=hp){
  48.         // pour chacun des pixels de large, le comparer a son pixel superieur
  49. //#pragma omp parallel for
  50.         for (j=1; j<l; j++) {
  51.             /*
  52.             x1=region32.X[i][j];     //pixel
  53.             x2=region32.X[i-1][j];   //pixel superieur
  54.             e1=region32.E[i][j];     //etiquette pixel
  55.             e2=region32.E[i-1][j];   //etiquette pixel superieur
  56.  
  57.             if (x1==x2){
  58.                 if (region32.T[e1] != e2 || e1!=e2){
  59.                     printf("ligne %d : %d=>%d \n", i, e1, e2);
  60.                     //SetRoot(region32.T, e4, epsillon); ????
  61.                     updateTable(region32.T, e1, e2);
  62.                 }
  63.             }*/
  64.  
  65.             x = region32.X[i][j];
  66.             if (x)  {
  67.                 e2 = region32.E[i-1][j  ];
  68.                 e4 = region32.E[i  ][j-1];
  69.  
  70.                 if ( (e2 == 0) && (e4 == 0) ) {
  71.                     //E[i][j] = ++ne;
  72.                 } else {
  73.                     if (e2 == e4) {
  74.                         //E[i][j] = e2;
  75.                         SetRoot(region32.T, region32.E[i][j], e2);
  76.                     } else {
  77.                         r2 = FindRoot(region32.T, e2);
  78.                         r4 = FindRoot(region32.T, e4);
  79.                         epsillon = ui32MinNonNul2(r2, r4);
  80.  
  81.                         if ((e2) && (e2 != epsillon)){
  82.                             SetRoot(region32.T, e2, epsillon);
  83.                         }
  84.                         if ((e4) && (e4 != epsillon)) {
  85.                             SetRoot(region32.T, e4, epsillon);
  86.                         }
  87.                     }
  88.                 }
  89.             }
  90.         }
  91.     }
  92.  
  93.     updateLabel(region32.E, i0, i1, j0, j1, region32.T);
  94.  
  95.    
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement