Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Labelise en parall�le */
- void LabelRosenfeld::labeliseParallele4C(Region32& region32) {
- int i=0, j;
- int nbThreads = region32.np;
- int i0=region32.i0, i1=region32.i1, j0=region32.j0, j1=region32.j1;
- int h = i1-i0;
- int l = j1 - j0;
- /* Calcul de la hauteur de chaque bande */
- int hp = h / nbThreads;
- unsigned char x1,x2,x;
- uint32_t e1, e2, e3, e4, root, r2, r4, epsillon;
- /* Netoyage */
- region32.cleanRegions32();
- //traiter indépendamment chacune des régions 1 fois
- #pragma omp parallel for
- for (i=0 ; i < region32.Regions.size() ; i++){
- /* Premier etiquetage */
- region32.Regions[i].ne = i*NEMAX/region32.Regions.size();
- for (j=region32.Regions[i].i0+1; j<region32.Regions[i].i1; j++) {
- region32.Regions[i].ne = lineLabeling4C(region32.X, j, region32.E, region32.T, l, region32.Regions[i].ne);
- }
- }
- /**
- * ESSATONS D UNIFIER LES ETIQUETTES A LA FRONTIERE
- */
- #pragma omp parallel for
- for(i=hp ; i<h-1 ; i+=hp){
- //i est la ligne concernée
- lineLabeling4C(region32.X, i, region32.E, region32.T, l, region32.ne);
- }
- //on doit alors mettre a jour l'image en fonction de cette nouvelle equivalence
- /*#pragma omp parallel for
- for (i=0 ; i < region32.Regions.size() ; i++){
- updateLabel(region32.E, region32.Regions[i].i0, region32.Regions[i].i1, region32.Regions[i].j0, region32.Regions[i].j1, region32.T);
- }*/
- updateLabel(region32.E, i0, i1, j0, j1, region32.T);
- for(i=hp+1 ; i<h-1 ; i+=hp){
- // pour chacun des pixels de large, le comparer a son pixel superieur
- //#pragma omp parallel for
- for (j=1; j<l; j++) {
- /*
- x1=region32.X[i][j]; //pixel
- x2=region32.X[i-1][j]; //pixel superieur
- e1=region32.E[i][j]; //etiquette pixel
- e2=region32.E[i-1][j]; //etiquette pixel superieur
- if (x1==x2){
- if (region32.T[e1] != e2 || e1!=e2){
- printf("ligne %d : %d=>%d \n", i, e1, e2);
- //SetRoot(region32.T, e4, epsillon); ????
- updateTable(region32.T, e1, e2);
- }
- }*/
- x = region32.X[i][j];
- if (x) {
- e2 = region32.E[i-1][j ];
- e4 = region32.E[i ][j-1];
- if ( (e2 == 0) && (e4 == 0) ) {
- //E[i][j] = ++ne;
- } else {
- if (e2 == e4) {
- //E[i][j] = e2;
- SetRoot(region32.T, region32.E[i][j], e2);
- } else {
- r2 = FindRoot(region32.T, e2);
- r4 = FindRoot(region32.T, e4);
- epsillon = ui32MinNonNul2(r2, r4);
- if ((e2) && (e2 != epsillon)){
- SetRoot(region32.T, e2, epsillon);
- }
- if ((e4) && (e4 != epsillon)) {
- SetRoot(region32.T, e4, epsillon);
- }
- }
- }
- }
- }
- }
- updateLabel(region32.E, i0, i1, j0, j1, region32.T);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement