IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

[java] Etiquettage de composantes connexes (union-find)


Sujet :

Contribuez

  1. #1
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut [java] Etiquettage de composantes connexes (union-find)
    Une implémentation de l'algorithme union-find en Java appliqué à l'etiquettage des composantes connexes.


    en haut: l'image d'origine en niveaux de gris
    en bas: l'image coloriée avec les 19 étiquettes trouvées

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    import java.util.ArrayList;
    import java.util.List;
     
    /**
     * Connected Component Labeling (union-find)
     * 
     * @author Xavier Philippeau
     *
     */
    public class CCLabeling {
     
    	// original component image/array
    	private int[][] image;
    	private int width,height;
     
    	// graph of nodes
    	private int[] roots = null;
    	private final int NOROOT=-1;
     
    	/**
             * @param image image filled with component's id
             * @param width width of the image
             * @param height height of the image
             */
    	public CCLabeling (int[][] image, int width, int height) {
    		this.image = image;
    		this.width = width;
    		this.height = height;
    		this.roots = new int[width*height];
    	}
     
    	// find the root of the node at position pos 
    	private int find(int pos) {
    		while(roots[pos]!=pos) pos=roots[pos];
    		return pos;
    	}
     
    	// union of the 2 path formed by the 2 roots
    	private int union(int root0, int root1) {
    		if (root0==root1) return root0;
    		if (root0==NOROOT) return root1;
    		if (root1==NOROOT) return root0;
    		if (root0<root1) {
    			roots[root1]=root0;
    			return root0;
    		} else {
    			roots[root0]=root1;
    			return root1;
    		}
    	}
     
    	// set the root of the node at position pos  
    	private void add(int pos, int root) {
    		if (root==NOROOT) 
    			roots[pos]=pos;
    		else 
    			roots[pos]=root;
    	}
     
    	// build the connected component labels array
    	private int[][] buildLabelArray() {
     
    		// remove indirections
    		for(int pos=0;pos<(width*height);pos++)
    			roots[pos] = find(pos);
     
    		// relabel the root
    		int label=1;
    		for(int pos=0;pos<(width*height);pos++)
    			if (roots[pos]==pos)
    				roots[pos] = label++;
    			else
    				roots[pos] = roots[roots[pos]];
     
    		System.out.println("labels: "+(label-1));
     
    		// copy label to new array
    		int[][] labels = new int[width][height];
    		for(int y=0,pos=0;y<height;y++)
    			for(int x=0;x<width;x++,pos++)
    				labels[x][y]=roots[pos];
     
    		return labels;
    	}
     
    	/**
             * @return the connected component labels array
             */
    	public int[][] compute() {
    		int root;
    		for(int y=0,pos=0;y<height;y++) {
    			for(int x=0;x<width;x++,pos++) {
    				root = NOROOT;
     
    				if ( (x>0) && (image[x-1][y]==image[x][y]) )
    					root = union( find(pos-1) , root);
     
    				if ( (x>0 && y>0) && (image[x-1][y-1]==image[x][y]) )
    					root = union( find(pos-1-width) , root);
     
    				if ( (y>0) && (image[x][y-1]==image[x][y]) )
    					root = union( find(pos-width) , root);
     
    				if ( (x<(width-1) && y>0) && (image[x+1][y-1]==image[x][y]) )
    					root = union( find(pos+1-width) , root);
     
    				add( pos, root );
    			}
    		}
     
    		return buildLabelArray();
    	}
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Portage en C, suite à une discussion dans le forum:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    long *CCroots = NULL;
    long CC_NOROOT = -1;
     
    void CCinit(int W, int H) {
    	CCroots = (long*) malloc(W*H*sizeof(long));
    	long i;
    }
     
    void CCclear() {
    	if (CCroots!=NULL) {
    		free(CCroots);
    		CCroots=NULL;
    	}
    }
     
    long CCfind(long pos) {
    	while(CCroots[pos]!=pos) pos=CCroots[pos];
    	return pos;
    }
     
    long CCunion(long root0, long root1) {
    	if (root0==root1) return root0;
    	if (root0==CC_NOROOT) return root1;
    	if (root1==CC_NOROOT) return root0;
    	if (root0<root1) {
    		CCroots[root1]=root0;
    		return root0;
    	} else {
    		CCroots[root0]=root1;
    		return root1;
    	}
    }
     
    long CCadd(long pos, long root) {
    	if (root==CC_NOROOT)
    		CCroots[pos]=pos;
    	else
    		CCroots[pos]=root;
    	return CCroots[pos];
    }
     
    void CClabel(int* image, int W, int H) {
    	long x,y,root,pos;
     
    	pos=0;
    	for(y=0;y<H;y++) {
    		for(x=0;x<W;x++,pos++) {
    			root=CC_NOROOT;
     
    			if ( (x>0) && (image[pos-1]==image[pos]) )
    				root = CCunion( CCfind(pos-1) , root);
     
    			if ( (x>0 && y>0) && (image[pos-1-W]==image[pos]) )
    				root = CCunion( CCfind(pos-1-W) , root);
     
    			if ( (y>0) && (image[pos-W]==image[pos]) )
    				root = CCunion( CCfind(pos-W) , root);
     
    			if ( (x<(W-1) && y>0) && (image[pos+1-W]==image[pos]) )
    				root = CCunion( CCfind(pos+1-W) , root);
     
    			root = CCadd( pos, root );
    		}
    	}
     
    	// remove indirection
    	for(pos=0;pos<(W*H);pos++)
    		CCroots[pos] = CCfind(pos);
     
    	// relabel
    	long label=0;
    	for(pos=0;pos<(W*H);pos++)
    		if (CCroots[pos]==pos)
    			CCroots[pos] = label++;
    		else
    			CCroots[pos] = CCroots[CCroots[pos]];
    }

    Exemple d'utilisation:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int W=123,H=456;
    int image[456][123] = /* ... */;
     
    CCinit(W,H);
    CClabel((int*)image,W,H);
    // ** ajouter ici votre traitement du tableau CCroots
    CCclear();
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    J'essaye de labeliser une image binaire, mais je ne comprends pas exactement comment faire pour utiliser les fonctions proposées.
    Quelqu'un pourrait m'aider ?

    Merci beaucoup,

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Xav00007 Voir le message
    Bonjour,

    J'essaye de labeliser une image binaire, mais je ne comprends pas exactement comment faire pour utiliser les fonctions proposées.
    Quelqu'un pourrait m'aider ?

    Merci beaucoup,
    Bah, dans l'implémentation Java il n'y a qu'une seule méthode publique et dans l'implémentation C il y a un exemple d'utilisation. Quel est ton problème exactement ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    On définit une matrice 2D pour l'image, mais la fonction prends en argument un int*qui est un vecteur 1D.

    Ensuite, comment utiliser le résultat de la fonction ?

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Xav00007 Voir le message
    On définit une matrice 2D pour l'image, mais la fonction prends en argument un int*qui est un vecteur 1D.
    Ah. Oui c'est un peu sale mais c'est un avantage du C : un tableau 2D est stocké linéairement en mémoire (donc sous forme de tableau 1D).

    "int t2d[456][123]" est équivalent en mémoire à "int t1d[456*123]" et donc l'élément "t2d[y][x]" est équivalent à "t1d[y*123+x]".

    (edit : je viens de changer l'ordre des dimensions W,H dans l'exemple pour être cohérent avec cette explication. En fait l'ordre n'a pas d'importance dans cet algo car ca revient a faire tourner l'image de 90°, ce qui ne change pas les composantes)

    Ensuite, comment utiliser le résultat de la fonction ?
    Le tableau "CCroots" est un tableau de meme taille que l'image. Chaque élément de ce tableau indique le numero de composante pour le pixel correspondant de l'image.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Merci pour ces indications, ça marche nickel : -)

    Est-ce que tu pourrais m'expliquer brièvement les différentes fonction, et l'idée générale de cette labélisation ?

    J'aimerai ajouter quelques fonctionnalités, mais pour cela, il faut que je comprenne mieux les différentes parties.

    Merci beaucoup,

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Xav00007 Voir le message
    Est-ce que tu pourrais m'expliquer brièvement les différentes fonction, et l'idée générale de cette labélisation ?
    Hum... C'est pas évident d'expliquer pourtant c'est simple . Regarde sur le net s'il n'y a pas un tuto. J'explique en gros le principe

    On parcourt chaque pixel (gauche->droite, haut->bas). Pour chaque pixel on regarde les 4 pixels du voisinage qu'on a deja parcouru (NordEst, Nord, NordOuest, Ouest) et on regarde si les pixels sont connectés (= ils ont la meme valeur).

    - Pour chaque voisin connecté, on cherche la composante a laquelle il appartient (FIND). A ce stade, on a donc entre 0 et 4 composantes autour du pixel courant, et potentiellement certaines composantes sont les mêmes.

    cas 1 : Le pixel courant est connecté a 0 composante => c'est le départ d'une nouvelle composante
    cas 2 : Le pixel courant est connecté a une seule composante => il appartient a cette composante
    cas 3 : Le pixel courant est connecté différentes composantes => il relie les composantes entre elles (UNION)

    L'important dans cette algo est la manière dont on represente la liaison entre un pixel et une composante. On utilise le tableau CCroots (= tableau d'indirection, un peu comme une liste chainée) : chaque case du tableau contient l'indice d'une autre case à laquelle le pixel est lié.

    exemple:
    - CCroots[256]=140 le pixel n°256 est relié au pixel 140 (ils ont la mm composante)
    - CCroots[140]=120 le pixel n°140 est relié au pixel 120
    - CCroots[120]=120 le pixel n°120 est relié a lui même. C'est le point de départ de la composante, qu'on appelle la racine

    Donc pour trouver la "racine" d'une composante il suffit de faire une boucle "tant que" l'indice change. (c'est le code de la fonction FIND)

    Pour la fonction UNION entre 2 composantes, on trouve les 2 racines et ont fait pointer l'une sur l'autre.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Merci pour ces explications :-).

    Comment se passe la 'relabelisation' (dernière boucle for)?

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Xav00007 Voir le message
    Merci pour ces explications :-).

    Comment se passe la 'relabelisation' (dernière boucle for)?
    ca se passe en 2 temps.

    Première étape : on retire les indirections, c'est a dire que chaque case du tableau CCroots pointe directement sur la racine (sans faire de "rebond" intermédiaire). A ce stade, le tableau CCroots contient un numero unique de composante pour chaque pixel. Mais ce numéro n'est pas un un numéro d'ordre (1, 2, 3, ...), c'est juste l'indice du pixel "racine".

    Deuxième étape : on parcours le tableau d'indice et on remplace le numéro des racines par un numero d'ordre. On doit également "propager" ce numéro d'ordre aux autres cases qui pointent sur la racine. On peut faire cela en une seule passe car on est sûr de toujours changer une racine avant de changer les cases qui pointent sur la racine.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Nickel, j'ai réussi à faire ce que je voulais...

    Merci beaucoup pour ton aide!

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut
    Bonsoir,

    Puis je l'avoir en langage matlab?

    Car je n'ai pas réussi à le transcrire.

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Il existe la fonction bwlabel sous matlab qui permet de faire exactement la meme chose. Je te laisse regarder la doc officielle pour plus de details.
    Je te conseille de regarder regionsprops aussi qui va de paire avec bwlabel et qui te permet de ressortir automatiquement pleins d'infos utiles sur les regions ettiquetées (nombre de pixel, centre de gravité, etc etc ...)

    et super le code de labellisation en C ;-) . je vais surement m'en servir !


    ++

    PS : special thanks to Xavier Philippeau ! ça fait déjà deux fois que tu m'aide! cf:le pdf sur les filtres et maintenant le code de labellisation en C!

  14. #14
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Bns;
    donnez moi un exemple comment utilisé cette class (java)?
    cordialment

  15. #15
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Anis99 Voir le message
    Bns;
    donnez moi un exemple comment utilisé cette class (java)?
    cordialment
    Comme je l'ai dit au post #4, il n'y a qu'une seule méthode publique pour cette classe (et un seul constructeur). Ca ne laisse pas trop de doute sur son utilisation.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  16. #16
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Comme je l'ai dit au post #4, il n'y a qu'une seule méthode publique pour cette classe (et un seul constructeur). Ca ne laisse pas trop de doute sur son utilisation.

    ok mais mon probleme est que mon image est sur un bufferedimage
    exemple

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Segmentation {
    	public static void main(String[] args) {
    		try{
    		BufferedImage img = ImageIO.read(new File("01.jpg")); 
     
    		BufferedImage image_en_eniveau_gris = niveau_de_gris(img);
    		BufferedImage image_binary = binary(img, auto_Threshold(img));
     
    		ImageIO.write(image_en_eniveau_gris, "bmp",new File("01_en_Niveau_de_gris.jpg"));
    		ImageIO.write(image_binary, "bmp",new File("01_binary.jpg"));
     
    			}catch (Exception e)
    			   {	
    			   System.out.println("ERREUR!==> "+e.getMessage()+" \n");
    			   }
    			}
    }

    dite moi comment je vais appliqué votre class CCLabeling a cette classe

  17. #17
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Anis99 Voir le message
    ok mais mon probleme est que mon image est sur un bufferedimage.

    dite moi comment je vais appliqué votre class CCLabeling a cette classe
    Il faut convertir le bufferedimage en un tableau int[][]. Chaque case du tableau doit contenir une valeur de pixel (intensité, niveau de gris, composante, ...).

    exemple:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static int[][] BufferedImageToArray(BufferedImage bi) {
    	int W = bi.getWidth(), H=bi.getHeight();
    	int[][] arr = new int[W][H];
    	for(int y=0;y<H;y++)
    		for(int x=0;x<W;x++) {
    			int rgb = bi.getRGB(x, y); // codage rgb du pixel
    			int value = (rgb>>8)&0xFF; // on prend la composante VERTE
    			arr[x][y] = value;
    		}
    	return arr;
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  18. #18
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut extraction des composantes connexes
    Bonsoir,
    je vous demande de m'orienter pour que je puisse extraire les composante connexe apres avoir fais un etiquetage.

  19. #19
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Anis99 Voir le message
    Bonsoir,
    je vous demande de m'orienter pour que je puisse extraire les composante connexe apres avoir fais un etiquetage.
    la méthode renvoie un tableau d'entier (int[][]). Chaque case du tableau correspond a un pixel de l'image. La valeur de la case indique le numero de la composante connexe a laquelle appartient le pixel.

    Si on veut tous les pixels de la première composante, on parcourt tous le tableau pour trouver les cases qui ont la valeur 1. Les coordonnées de la case sont les coordonnées du pixel.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  20. #20
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    la méthode renvoie un tableau d'entier (int[][]). Chaque case du tableau correspond a un pixel de l'image. La valeur de la case indique le numero de la composante connexe a laquelle appartient le pixel.

    Si on veut tous les pixels de la première composante, on parcourt tous le tableau pour trouver les cases qui ont la valeur 1. Les coordonnées de la case sont les coordonnées du pixel.
    Bonsoir,
    je ne sais pas si j'ai fais tout le necessaire pour implementer un code java pour l'extraction des composantes connexes! mais j'ai pas pu
    alors la je vous demande de m'aider d'avantage car je n'arrive pas a implementé le code pour extraire les composantes connexes.

Discussions similaires

  1. Réponses: 13
    Dernier message: 28/12/2012, 18h24
  2. Composante connexe Java
    Par sassion dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 25/05/2012, 11h35
  3. Composante connexe Java
    Par sassion dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 27/04/2012, 23h54
  4. structure de donnée Union-Find
    Par contremaitre dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 22/01/2008, 09h54
  5. Elimination de composantes connexes
    Par djsid dans le forum Traitement d'images
    Réponses: 24
    Dernier message: 17/07/2007, 08h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo