Bonsoir,
IL y a un code java pour faire la Segmentation en régions ????
Question : Comment réalise cette deux étape s.v.p
- Colorée l'intérieur du contour a la fin de la segmentation ?
- l'initialisation du contour en rectangle (largeur et l’hauteur de l’image) ?
Il y a du code Java dans ImageJ pour faire de la segmentation. Il y en a aussi dans JAI si je me souviens bien.
Il te faut un algo de remplissage de polygones. On en a déjà parlé sur le forum.Question : Comment réalise cette deux étape s.v.p
- Colorée l'intérieur du contour a la fin de la segmentation ?
public Snake(int width, int height, int[][] gradient, int[][] flow, Point... points)- l'initialisation du contour en rectangle (largeur et l’hauteur de l’image) ?
Le dernier paramètre du constructeur est la liste des points du snake. Tu peux les positionner comme tu veux.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 for (int i = 0; i < circle.length; i++) { double x = (W / 2 + 0) + (W / 2 - 2) * Math.cos((6.28 * i) / circle.length); double y = (H / 2 + 0) + (H / 2 - 2) * Math.sin((6.28 * i) / circle.length); circle[i] = new Point((int) x, (int) y); }
L’initialisation de ce code est un cercle, j'ai besoin que l'initialisation est un rectangle de largeur et l’hauteur égale à l'image
et merci ...
Un truc comme ca ?
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 int MARGIN=8, STEP=16; List<Point> points = new ArrayList<Point>(); for(int x=MARGIN;x<W-MARGIN;x+=STEP) points.add(new Point(x,MARGIN)); for(int y=MARGIN;y<H-MARGIN;y+=STEP) points.add(new Point(W-MARGIN,y)); for(int x=W-MARGIN;x>MARGIN;x-=STEP) points.add(new Point(x,H-MARGIN)); for(int y=H-MARGIN;y>MARGIN;y-=STEP) points.add(new Point(MARGIN,y)); Point[] rectangle = new Point[points.size()]; points.toArray(rectangle);
Je vous remercie, Monsieur pseudocode, pour cette illustration, J'ai lu tout ce débat sur les contours actifs, il est vraiment m'aidé beaucoup
J'ai quelques questions concernant la force interne.
Le code pour calculer la force continuité et la force courbure
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 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; } private double f_curvature(Point prev, Point p, Point next) { int ux = p.x-prev.x; int uy = p.y-prev.y; double un = Math.sqrt(ux*ux+uy*uy); int vx = p.x-next.x; int vy = p.y-next.y; double vn = Math.sqrt(vx*vx+vy*vy); if (un==0 || vn==0) return 0; double cx = (vx+ux)/(un*vn); double cy = (vy+uy)/(un*vn); // curvature energy double cn = cx*cx+cy*cy; return cn; }
Le code est écrit pour les contours actifs fermer,
Ma question est dans le cas des contours actifs ouvert,
Est-ce qu'on met la force continuité = 0 pour le 1er point
Et la force coubure =0 pour le 1er et le dernier point?
Puisque dans le cas d'un contour actif ouvert il n'y a pas de précédent pour le premier point; et il n'y a pas le point suivant pour le dernier point.
MERCI D'avance Mr PseudoCode
Je n'ai pas testé le cas des contours ouverts mais ca me semble une bonne idée de mettre ces deux énergies à 0 pour le premier et le dernier point.
Il faudra également modifier le mécanisme d'auto-adaptation si vous comptez l'utiliser car le calcul utilise le fait que la courbe est fermée.
Bonsoir
j'ai besoin de cet algorithme malheureusement je travaille sur matlab ;je ne sais pas si il y' a un moyen pour faire la liaison de matlab et java et je ne sais pas vraiment comment exécuter cet algorithme dans le netbeans???
si vous pouvez m'indiquez la procédure de l'exécuter j'en serais reconnaissante
merci
Je ne connais pas assez Matlab pour être sur, mais ca m'étonnerait qu'on puisse faire faciliement une interop Matlab/Java. D'un autre coté, je suis certain qu'on doit pouvoir trouver sur le net une implémentation des "Contours Actifs" en matlab.
Il y a un fichier "*.jar" dispo dans le post #2. Il suffit de le télécharger et de l'executer (double-clic si java est installé).et je ne sais pas vraiment comment exécuter cet algorithme dans le netbeans??? si vous pouvez m'indiquez la procédure de l'exécuter j'en serais reconnaissante
Si si => http://www.mathworks.com/support/sol...n=1-179EJ&BB=1
Par exemple => 2D/3D image segmentation toolbox
Non... c'est juste que le lien pointe vers une solution pour une vieille version de MATLAB.
Par exemple sous MATLAB R2008b (sortie en octobre 2008) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Java VM Version: Java 1.6.0_01
Bonjour,
Pour obtenir un snake ouvert j'ai changé la méthode Step() pour ne pas tenir compte des énergies internes dans le cas du premier et dernie 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
21
22
23
24
25
26
27
28
29 // find the point with the minimum sum of energies double emin = Double.MaxValue, e = 0; int x = 0, y = 0; for (int dy = -1; dy <= 1; dy++) { for (int dx = -1; dx <= 1; dx++) { if ((i == 0) || (i == snake.Count - 1)) { e = 0; // e += alpha * e_uniformity[1 + dx][1 + dy]; // internal energy //e += beta * e_curvature[1 + dx][1 + dy]; // internal energy e += gamma * e_flow[1 + dx,1 + dy]; // external energy e += delta * e_inertia[1 + dx,1 + dy]; // external energy } else { e = 0; e += alpha * e_uniformity[1 + dx,1 + dy]; // internal energy e += beta * e_curvature[1 + dx,1 + dy]; // internal energy e += gamma * e_flow[1 + dx,1 + dy]; // external energy e += delta * e_inertia[1 + dx,1 + dy]; // external energy } if (e < emin) { emin = e; x = cur.X + dx; y = cur.Y + dy; } } }
Ce calcul me donne un bon Résultat sauf que la Méthode rebuild(int space) Reconstruit le snake et redonne une snake fermé.
- Comment dois je procéder pour modifier cette méthode et garder un snake ouvert??
- Est ce que vous pouvez m'expliquer comment procède cette méthode. car franchement j'ai du mal à la comprendre?
Merci.
Cette méthode effectue un resampling uniforme du snake. C'est à dire qu'on calcule la position de N points "uniformément espacés" sur la courbe du snake. Pour cela, on procède en deux étapes:
1. Pour chaque point "i" du du snake actuel, on calcule la distance totale depuis le point de départ jusqu'au point "i".
(cf. la 1ere boucle for() )
2. On calcule la position "idéale" du point "i" dans le nouveau snake, c'est à dire le point qui est a la distance (i/snake.size())*taille_totale. Bien sur, cette position idéale tombe souvent "entre deux points" du snake actuel. Pour calculer au mieux cette position, on fait une interpolation (spline cubique)
(cf. la 2nde boucle for() )
Dans la 1ere boucle, on calcule la distance entre le point "cur" et le point "next". On considère la courbe comme fermée, donc le point "next" du dernier point est en fait le 1er point. Ce qui est codé en utilisant l'opérateur modulo :Ce calcul me donne un bon Résultat sauf que la Méthode rebuild(int space) Reconstruit le snake et redonne une snake fermé.
- Comment dois je procéder pour modifier cette méthode et garder un snake ouvert??
Code java : Sélectionner tout - Visualiser dans une fenêtre à part Point next = snake.get( (i+1)%snake.size() );
Pour simuler une courbe ouverte, il suffit de dire que le point "next" du dernier point n'existe pas... ou, plus simplement, qu'il est confondu avec le dernier point.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part Point next = snake.get( Math.min(i+1,snake.size()-1) );
De meme dans la deuxième boucle, on utilise 4 points consécutifs et à nouveau on utilise un modulo pour considèrer la boucle fermée:
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Point prev = snake.get((i+snake.size()-1)%snake.size()); Point cur = snake.get(i); Point next = snake.get((i+1)%snake.size()); Point next2 = snake.get((i+2)%snake.size());
On peut également utiliser la meme astuce que précédemment pour simuler une courbe ouverte:
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Point prev = snake.get( Math.max(i-1,0) ); Point cur = snake.get(i); Point next = snake.get( Math.min(i+1,snake.size()-1) ); Point next2 = snake.get( Math.min(i+2,snake.size()-1) );
désolé de ressortir ce topic, je ne sais pas si je dois en ouvrir un autre ou continuer sur celui-ci, vu que ma question a un rapport très étroit avec ce topic ^^
Tout d'abord un grand merci pour ce code qui m'a été énormément utile.
Je travail sur un volume d'image IRM, et mon but et de segmenter une tumeur cérébrale.
J'ai donc utilisé ce code pour effectuer un snake sur chaque coupes de la tumeur, et je voudrais à présent travailler directement "en 3D".
Avez vous des sources pour implémenter ce snake ? ou des idées pour généraliser ce code a la 3D ?
Merci d'avance, et longue vie a ce forum qui m'a sauvé la vie plus d'une foie :p
Le principe est le même, quel que soit le nombre de dimension:
Le mécanisme d'autoadaptation que j'ai rajouté dans mon implémentation peut aussi etre étendu à la 3D.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Créer un snake initial ( 2D:courbe/polygone, 3D:surface/maillage) Tantque nonconvergence Pour chaque point du snake Calcul des energies dans le voisinage du point ( 2D: voisins 3x3, 3D: voisins 3x3x3) en utilisant les formules d'énergie (2D/3D) Déplacer le point vers le minimum d'energie Fin Pour Fin Tantque
merci, je vais donc fouiller dans cette direction.
Bonjour pseudocode,
J'ai une petite question concernant cette fonction:
f_uniformity(Point prev, Point next, Point p)
il n'y a que deux points qui sont utilisés. Est ce qu'on peut utiliser les 3 points pour avoir plus de robustesse.
Merci
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