Hum... La cas va être plus compliqué à expliquer car je me suis un peu "écarté" des méthodes habituelles :P. Mais ça donne de bons résultats alors ça mérite que je m'y attarde un peu (enfin selon moi :roll:).
L'énergie Externe c'est ce qui fait réellement "bouger" le snake, car l'énergie interne ne s'occupe que de le contraindre pour qu'il reste cohérent. On a donc besoin de définir une énergie qui "attire" le snake vers les endroits intéressants.
Dans mon cas (et généralement) on choisit d'attirer le snake vers les forts gradients = les bords des objets. Donc on commence par calculer le gradient:
ici c'est un noyau MDIF 3x3, sigma=1.0 (cf. tuto sur les filtres)Code:Channel gradient = new Gradient(3,1.0).filter(image);
Cette "image" du gradient vaut "255" sur les bords et "0" partout ailleurs (dans le cas idéal).
Maintenant il nous faut une énergie qui pousse les points du snake vers le plus proche "255". Pour cela j'ai calculé la carte des distances sur l'image du gradient (cf. contribution sur Chamfer).
Chaque pixel de la carte des distances nous donne la distance (:P) jusqu'au plus proche "255". Il faut donc que le snake se dirige vers les pixels qui ont une valeur faible => on diminue la distance et donc on se rapproche du gradient.Code:this.force = new Chamfer(true,Chamfer.chamfer5).filter(gradient);
Code:
1
2
3 private double extforce(Point p) { return this.force.getValue(p.x, p.y); }
On peut voir cela comme une carte en 3D. Le snake descend le long des pentes pour atteindre le minimum (altitude=0)
voila, j'espère que c'est plus clair.