Bonjour,
En essayant de faire un résumé de cette méthode (Snake), je suis tombé sur un gros problème concernant toujours l’énergie de courbure.
Dans le schéma suivant j’illustre les déplacements possibles du point P4 de coordonnées (5,1), en considérant seulement l’énergie de Courbure. L’origine est en bas à gauche.
En appliquant les différences finies pour la seconde dérivée ( au carré), l’énergie de courbure s’exprimera par :
( Xi-1 - 2*Xi + Xi+1 )² + ( Yi-1 - 2* Yi +Yi+1 | )²
J’ai calculé ces énergies pour tous les voisins de P4 (Ce dernier y compris) avec une fenêtre 3X3, afin de déterminer quel serait le déplacement optimal qui minimiserait l’énergie. Les résultats des calculs sont dans la sous-matrice (Zoom sur P4)
Hélas je ne comprends vraiment ces résultats :
Pour les 3 voisins au-dessus de P4, ne devons nous pas obtenir la même valeur d’énergie ?!! car chacun des 3 voisin formera une ligne droite (180°) avec le successeur et prédécesseur (P3 et P5) .
Par ailleurs je ne comprends pas aussi pourquoi la valeur d’énergie du voisin au-dessous de P4, cette valeur devrai être supérieure à l’énergie de P4 car l’angle va s’accentuer
La formule de différence finie que j’ai cité est elle correcte ?En ajoutant des valeurs absolues aux différence des x et de cette manière
(| Xi-1 - Xi | + |Xi+1 – Xi | )² + (| Yi-1 - Yi | + |Yi+1 – Yi | )²
Cela permettrait de rendre les résultats plus cohérents, mais je ne peux citer cette formule dans mon résumé à moins qu’elle existe.
Le calcul de la dérivée seconde prend en compte la variation en position (angle entre les vecteurs) mais aussi la variation en grandeur (norme des vecteurs). La norme de la dérivée seconde dépend donc de ces 2 facteurs.
C'est donc normal que le point au dessus de P4 soit le meilleur car a la fois:
- il diminue l'angle entre les vecteurs
- il maintient le ratio (grandeur a gauche)/(grandeur a droite)
Oui elle devrait.Par ailleurs je ne comprends pas aussi pourquoi la valeur d’énergie du voisin au-dessous de P4, cette valeur devrai être supérieure à l’énergie de P4 car l’angle va s’accentuer
Ce point a pour energie 16 et pas 4:
E.x = (0 - 2*5 + 10)² = 0
E.y = (2 - 2*0 + 2)² = 16
Bonjour,J'ai une petite question concernant la normalisation des énergies
Cette normalisation sert à rendre toutes les valeur des trois énergies dans l'intervalle [ 0 , 1 ],et cela afin de ne pas favoriser une énergie par rapport à une autre.Est ce bien cela?
Si oui,est ce que ça reviendrait au même de diviser chaque sous-matrice d'énergie par sa plus grande valeur? Bien entendu les valeur ne seront pas les mêmes mais les "proportions" entre énergies seront conservées.
oui, c'est cela.
Heu... en théorie oui, on peut utiliser n'importe quelle mesure.Si oui,est ce que ça reviendrait au même de diviser chaque sous-matrice d'énergie par sa plus grande valeur?
Dans ton cas, ca voudrait dire utiliser la distance Linfinie = max(abs(x)). Je n'ai jamais testé.
Dans mon code j'utilise la distance L1 = sum(abs(x))
Bonjour,j'ai encore une toute petite question
Je suis conscient d'en avoir trop poser ,c'est juste que j'essaie de décortiquer cette algorithme et je ne veux pas que quelque chose m'echappe.C'est important pour moi.
Ma question concerne le mécanisme d'auto-adaptation et plus précisément la suppressions des points lors d'un rapprochement entre deux point du snake.
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 private void removeOverlappingPoints(int minlen) { // for each point of the snake for(int i=0;i<snake.size();i++) { Point cur = snake.get(i); // check the other points (right half) for(int di=1+snake.size()/2;di>0;di--) { Point end = snake.get((i+di)%snake.size()); double dist = distance2D(cur,end); // if the two points are to close... if ( dist>minlen ) continue; // ... cut the "loop" part og the snake for(int k=0;k<di;k++) snake.remove( (i+1) %snake.size() ); break; } } }
Cette procédure consiste à vérifier pour chaque point du Snake P la distance entre celui ci et l'ensemble des points qui le succèdent...
Je ne comprends pas pourquoi ces distances ont été calculer seulement pour la moitié des successeurs ?
Pourquoi ne pas calculer tous les successeur jusqu'a atteindre le premier noeud du Snake.càd pour un point Pj calculer la distance entre Pj et :
Pj+1 , Pj+2,...,Pnbpoint,P1
Comme la mesure de distance est commutative, on aura L(Pi,Pj) = L(Pj,Pi), pout tout i,j. Donc inutile de mesurer 2 fois cette distance.
Pour cela, il suffit d'imposer de mesurer seulement la distance (Pi,Pj) avec i < j (ou l'inverse) => en terme de code, il suffit de faire commencer la 2nde boucle APRÈS le point courant.
Mon problème se situait au niveau du nombre n'itérations de la seconde boucle.Elle est répétée NbPoint/2 fois tel que NbPoint représente le nombre de point du Snake.
Je pensais que de cette manière quelques distances ne seront pas calculées,mais comme vous l'avez dit,la fonction de distance étant commutative,on peut etre sur qu'en se fixant qu'à la moitié des points successeurs toutes les distances possible seront calculées.
Merci PseudoCode.
Bonjour.
Je pensais que l'énergie d'uniformité gérai la tension (l'élasticité) du contour afin de provoquer une rétraction,Or ce n'est pas le cas; cette énergie gère seulement l'équidistance entre les points du Snake.En quoi cela peut influer sur la forme du Snake? En d'autres terme je dirais que contrairement aux autres énergie (Curvature et Externe) je ne vois pas l'influence de l'énergie d'uniformité sur la déformation du Snake.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 private double f_uniformity(Point prev, Point next, Point p) { // length of previous segment double un = distance2D(prev, p); // mesure of uniformity double avg = snakelength/snake.size(); double dun = Math.abs(un-avg); // elasticity energy return dun*dun; }
Bonjour,
Merci Merci et Merci PseudoCode Pour toute l'aide que vous m'avez apporté au sujet des contours actifs.
Comme je voulais déjà dis,c'est (les contours actifs) mon thème de fin d'étude et sans votre aide,je ne sais pas si j'aurai pu autant avancer...ou plutôt je ne pense pas.
En ce moment je suis entrain de me préparer pour ma soutenance,j'essaie d'imaginer toutes les questions que pourront me poser les membres du jury,et ça me fais stressé ,mais bon,grâce à vous je maitrise relativement bien ce que je vais exposer.
Il y a une question qui est susceptible de m'être poser,cela concerne la forme du contour initial,pourquoi un cercle?
La réponse qui me vient à la tête est la suivante:
Puisque le processus de déformation consiste à minimiser l'énergie,la forme de cercle pour le contours initiale a été choisi car un cercle dispose d'une énergie interne minimale (pas de point anguleux) ce qui réduira le nombre d'itération lors du processus de déformation.
J'ajouterai aussi qu'avec une autre forme (rectangle par ex) de contours initial le résultat peut être le même mais la convergence vers l'objet d'intérêt se fera avec un nombre plus élevé d'itération.
Que pensez vous de cette réponse?
Hum... Je ne suis pas bien sûr que le "nombre d'itérations" soit une réponse valable.
C'est plutôt que l'algo du snake résout l'équation énergétique itérativement avec un "schéma explicite" (google). Ce genre de résolution est très sensible aux brusques changements, ce qui implique:
1. de prendre un "pas" de résolution très petit (= le pixel, voir moins)
2. d'eviter les brusques changements de valeurs dans les énergies
C'est le point n°2 qui fait préferer le cercle car, comme tu l'as dit, les delta des energies internes autour d'un voisinage sont faibles (le cercle etant une solution de l'equation sans contraintes externes).
L'idéal etant aussi de limiter les changements de valeurs des energies externes, par exemple en prenant une forme de départ qui "ressemble" à la forme finale.
Bonjour,
Non pas forcement,le fond peut contenir une texture,il suffit de bien ajuster la valeur du seuil pour obtenir de bons résultats.
Voici un exemple de segmentation d'un triangle mis sur un fond avec une texture.
L'image en entrée a été lissée avec le filtre Median.
bien entendu si l'image contient plusieurs objets,le contour initial doit être le plus proche possible de l'objet à segmenter,afin de ne pas être attiré vers d'autres contours non significatifs,ce qui donne lieu à une mauvais déformation.
Grâce à l’énergie externe qu’a proposé PseudoCode pour cette contribution,il devient aussi possible d'initialiser le contour à l'intérieur de l’objet, dans ce cas, au lieu de se rétracter,le contour se gonflera pour prendre la forme de l’objet.
Bonjour,
J'ai testé ce code de contour actif en java.Il ya des erreurs est ce que vous pouvez me donner les importations?
Encore je trouve un problème d'appliquer ce code a mon image.
ou je peux entrer mon image dans ce code.
merci
Les import sont les paquets standard du JRE. Dans mon cas, ca fait:
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 import java.awt.Point; import java.util.ArrayList; import java.util.Arrays; import java.util.List;
Ce code ne contient que la partie qui concerne l'algorithme Snake. Tout ce qui concerne l'importation des images, le calcul du flux d'energie et l'interface graphique n'est pas fourni.Encore je trouve un problème d'appliquer ce code a mon image.
ou je peux entrer mon image dans ce code.
merci
Bonjour,
j'ai testé votre code il marche bien.Mais je veux detecter centre de gravité de ce contour(donc centre de l'image) comment j peux acceder au point ou comment fait la methode de calcul.
merci d'avance
Bonjour,
Pour ma part j'ai calculé le centre de gravité de cette manière :
Xg = 1/Nbpoints * Somme(Xi);
Yg = 1/Nbpoint * Somme(Yi);
ça revient donc à calculer la moyenne des X et la moyenne des Y.
En java ça doit être quelque chose comme ça :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int Xg,Yg; Xg=0;Yg=0; for(int i=0;i<snake.size();i++) { Point cur = snake.get(i); Xg=Xg+cur.x; Yg=Yg+cur.y; } Xg=Xg/snake.size(); //Je crois qu'il faut faire une conversion en int ici. Yg=Yg/snake.size();
bonjour,
merci pour votre repense pour centre de gravité il marche bien.
j'ai un petit probleme concernant contour,si j'ai plus qu'un objet dans l'image le contour detecte tous les objets.
comment je peux faire pour l'adapter a un seul objet de l'image.
merci d'avance
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager