|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
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 :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
10
|
|
|
#2 | ||||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Portage en C, suite à une discussion dans le forum:
Code C :
Exemple d'utilisation: Code C :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||||
|
10
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2009 Messages : 13 ![]() |
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, |
|
|
00
|
|
|
#4 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
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. |
|
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2009 Messages : 13 ![]() |
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 ? |
|
|
00
|
|
|
#6 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
"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) Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2009 Messages : 13 ![]() |
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, |
|
|
00
|
|
|
#8 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
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. |
|
|
00
|
|
|
#9 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2009 Messages : 13 ![]() |
Merci pour ces explications :-).
Comment se passe la 'relabelisation' (dernière boucle for)? |
|
|
00
|
|
|
#10 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
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. |
|
|
00
|
|
|
#11 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2009 Messages : 13 ![]() |
Nickel, j'ai réussi à faire ce que je voulais...
Merci beaucoup pour ton aide! |
|
|
00
|
|
|
#12 |
|
Membre régulier
![]() Inscription : mars 2007 Messages : 474 ![]() |
Bonsoir,
Puis je l'avoir en langage matlab? Car je n'ai pas réussi à le transcrire. |
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 1 ![]() |
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! |
|
|
00
|
|
|
#14 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2010 Messages : 15 ![]() |
Bns;
donnez moi un exemple comment utilisé cette class (java)? cordialment |
|
|
00
|
|
|
#15 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
00
|
|
|
#16 | |||
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2010 Messages : 15 ![]() |
Citation:
ok mais mon probleme est que mon image est sur un bufferedimage exemple Code :
|
|||
|
|
00
|
|
|
#17 | |||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
exemple: Code java :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|||
|
00
|
|
|
#18 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2010 Messages : 15 ![]() |
Bonsoir,
je vous demande de m'orienter pour que je puisse extraire les composante connexe apres avoir fais un etiquetage. |
|
|
00
|
|
|
#19 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
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. |
|
|
00
|
|
|
#20 | |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2010 Messages : 15 ![]() |
Citation:
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. |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com