# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Mthode Level Set

## menakikou

bonjour  Tous,
Cela fait deux jours que je tourne en rond et je n'arrive pas  comprendre la mthode des level Set, j'ai lu pleins de Doc la dessus mais je comprend plus rien quand ca parle que l'on rajoute une nouvelle dimension.

EN fait , j'ai dja fait une tude sur les mthodes contour actif ( les snakes) que j'ai bien compris mais la la mthode level set je suis perdu.

Moi je voudrai savoir par exemple , j'ai une image 2D ou il y a deux cercles, comment ca se passe le level set , alors apparament il y a un niveau zro que reprsente - il ? ensuite il faut mettre des 0 et -1 je ne sais ou et ensuite distance euclidienne.
SVP si quelqu"un pouvait m'aider ca serai trs trs gentil , je mets beaucoup d'effort pour comprendre ce concept mais j'y n'arrive pas  ::cry:: .

Merci d'avance .

----------


## pseudocode

*DISCLAMER*: _Attention, ce que je vais dire est totalement faux d'un point de vue strictement, fondamentalement et purement mathmatique (topologie, godsie, tout ca...). Donc inutile de m'insulter . C'est juste pour "aider"  la comprhension._

Si on considre que l'image est un terrain en 3D (carte d'lvation), alors le snake est une courbe 3D ferme qui se dplace sur la surface 3D jusqu'a trouver un quilibre. Le terrain 3D ne bouge pas, ce sont les points du snake qui bougent dans les 3 dimensions (x,y,z).

Pour le level-set c'est un peu le contraire. Les points du snake restent  l'altitude z=0 et ce sont les points du terrain dont on modifie l'altitude. Par effet de consquence, les points du snake bougent aussi mais seulement sur (x,y) car leur z reste  0.

Par la magie des level-set, TOUS les points qui sont  l'altitude z=0 font partie du snake ! Cela peut donc crer des courbes complexes (fermes, ouvertes, multiples, croises, ...).

Est-ce plus clair ?

----------


## menakikou

Oui c plus ou moins clair, j'ai vu pour segmenter une image 3D il faut ajouter une dimension donc ca serai 4 !!!! 
Donc notre cas , c'est une image 2D , donc on rajoute une coordonns z pour notre modele deformable donc ,Le snake ne bouge pas au niveau du Z il reste  zero, seulement son (x,y) change, et comment peux se faire la segmentation d'un objet dans cette image 2D alors ? je vois pas trop comment on peut faire de la segmentation avec les level set, on me parle de distance euclidienne , oui mais une distance entre koi et koi ?
parce que au final, on fait bouger le snake dans une scene en 3D mais l'objet a segmenter se trouve dans une image 2D ? 
Bizarre , franchement je dois nerver certains ::aie::  mais je vois pas de segmentation !

----------


## pseudocode

> Donc notre cas , c'est une image 2D , donc on rajoute une coordonns z pour notre modele deformable donc ,Le snake ne bouge pas au niveau du Z il reste  zero, seulement son (x,y) change, et comment peux se faire la segmentation d'un objet dans cette image 2D alors ? je vois pas trop comment on peut faire de la segmentation avec les level set, on me parle de distance euclidienne , oui mais une distance entre koi et koi ?
> parce que au final, on fait bouger le snake dans une scene en 3D mais l'objet a segmenter se trouve dans une image 2D ? 
> Bizarre , franchement je dois nerver certains mais je vois pas de segmentation !


Les snake, comme les level-set, sparent (segmentent) une image en 2 parties:

- Pour les snakes, il y a les points  l'intrieur de la courbe ferme, et les points  l'extrieur. La frontire est constitue des points qui sont sur la courbe.

- Pour les level-set, il y a les points avec une altitude ngative, et les points avec une altitude positive. La frontire est constitue des points qui sont  l'altitude 0.

----------


## hk0006

bonjour,

un peut d'explication sur cet mthode svp

Mthode Level Set

merci

----------


## cjuliard

Basiquement, la mthode des level sets permet de faire voluer une courbe ou une surface ferme de manire quelconque (avec une vitesse "locale" quelconque). Mais au lieu de modliser explicitement cette courbe/surface par un ensemble de points connects (courbe) ou par un maillage 3d (surface), la mthode level set travaille sur une reprsentation "implicite" de ces objets.Cette reprsentation implicite consiste gnralement en une fonction "distance"  la courbe/surface considre.
Par exemple, pour faire voluer une courbe ferme par level sets, on va faire voluer la fonction distance d(x,y)  cette courbe, dfinie comme une image 2D, plutt que les points de la courbe elle-mme. Pour chaque pixel (x,y), la valeur de l'image d(x,y) correspond tout btement  la distance euclidienne du point (x,y)  la courbe considre.

Pour rcuprer explicitement les points de la courbe  un instant t de l'volution, il suffit d'extraire les points (x,y) vrifiant d(x,y) = 0 (isophote 0 de la fonction distance). Cette conversion "implicite->explicite" se fait en gnral par une mthode de type 'marching squares' (pour une courbe) ou 'marching cubes' (pour une surface).

Pourquoi s'embter la vie avec ces fonctions implicites ? Parce que il est en ralit beaucoup plus facile de faire voluer une fonction implicite, que de faire voluer explicitement les points d'une courbe ou d'une surface, avec tous les problmes que cela pose : changement de topologie, ncssit de remaillage, etc..

A noter que l'utilisation de la fonction distance comme fonction implicite de reprsentation de la courbe/surface n'est pas obligatoire. N'importe quelle reprsentation telle que la courbe soit l'isophote de valeur 0 peut-tre utilise. Nanmoins, la fonction distance a de bonne proprits gomtriques et son utilisation permet de convertir facilement la vitesse d'volution de la courbe/surface d'une forme explicite  une forme implicite, et permet aussi de calculer aisment la courbure locale K de la courbe/surface, qui est une caractristique qui apparait trs souvent dans les termes de vitesse d'volutions de courbes/surfaces (en segmentation notamment).

D'un point de vue logiciel, beaucoup de bibliothques implmentent la mthode des level sets. Pour ma part, je conseille fortement d'aller fouiller du ct de CImg, notamment avec les sources suivantes :

http://cimg.cvs.sourceforge.net/view..._levelsets.cpp

(volution d'une courbe)

et 

http://cimg.cvs.sourceforge.net/view...evelsets3d.cpp

(volution d'une surface)

qui permet de bien comprendre comment a marche (code court, visualisation de l'volution possible).

-- Ccile.--

----------


## level_set

Salut

Cela fait des jours que je tourne en rond et je n'arrive pas  modifier ce source :      http://cimg.cvs.sourceforge.net/view..._levelsets.cpp  pour appliquer le level set sur une image.

je voudrai savoir comment segmenter une image (je travail sur des images satellitaire) en utilisant ce source.

Merci.

----------


## bibouh123

voila l'implementation de level set dans c++ et qt
modeles de mumford 
le fichier "levelset.h"


```

```

le fichier "level set.cpp"



```

```

les fonction F1,F2,F3 sont les fonction de vitesse
pour F3 y'a une erreur.

ce programme est test et il est correct......................

----------


## NightQuest

> voila l'implementation de level set dans c++ et qt
> modeles de mumford 
> le fichier "levelset.h"
> 
> 
> ```
> 
> ```
> 
> ...



Bonjour bibouh123,

J'espre que tu vas bien.

J'aimerai te poser quelques questions, notamment pour la mthode Level Set.

J'ai vu que t'as donn un code et que t'as mentionn qu'il tait test et approuv.

Je l'ai bien entendu pris et essayer, mais en lisant le code j'ai trouv des anomalies, comme:

-La matrice phi non initialise (phiold) ? 
-Les paramtres Ray, x, y de la fonction void levelset::level_zero(int x,int y,int ray,double **phi,int width,int height) reprsente quoi au juste? Il faut les donner en entres, et on connait rien d'eux.

-Si on dsire dtecter le contour d'un objet dans une image qui contient d'autres objets, comment procder?

Salutations.

----------


## pseudocode

> Je l'ai bien entendu pris et essayer, mais en lisant le code j'ai trouv des anomalies, comme:
> 
> -La matrice phi non initialise (phiold) ?


Initialis dans la fonction levelset::essai()




> -Les paramtres Ray, x, y de la fonction void levelset::level_zero(int x,int y,int ray,double **phi,int width,int height) reprsente quoi au juste? Il faut les donner en entres, et on connait rien d'eux.


Vu le code de la fonction, ca semble initialiser la fonction phi avec un cne.

x,y = le centre du cne
ray = le rayon du cne a l'altitude 0.




> -Si on dsire dtecter le contour d'un objet dans une image qui contient d'autres objets, comment procder?


Et bien, c'est le principe du LevelSet de converger vers la meilleure segmentation possible (suivant les energies choisies). Le mieux tant tout de meme d'initialiser le zero de la fonction phi (-> choisir x,y,ray) pour tre au plus proche de l'objet cherch.

----------


## bibouh123

```
-La matrice phi non initialisée (phiold) ?
```

ligne 193-194 dans le fichier .cpp (la fonction essai) 



```
-Les paramètres Ray, x, y de la fonction void levelset::level_zero(int x,int y,int ray,double **phi,int width,int height) représente quoi au juste? Il faut les donner en entrées, et on connait rien d'eux.
```

la courbe initiale(un cercle) avec comme centre "p(x,y)" et un rayon "ray"



```
-Si on désire détecter le contour d'un objet dans une image qui contient d'autres objets, comment procéder?
```

la mthode level sets permet de dtecter tous les objet dans l'image


et pour les appelles
1-"level_zero" la fonction initiale 
2-"essai " c'est la fonction principale


Salutations.

----------


## manitou38

> voila l'implementation de level set dans c++ et qt
> modeles de mumford 
> le fichier "levelset.h"
> 
> 
> ```
> 
> ```
> 
> ...


Est-ce que la procdure calculant la longueur ("lenght") ne serait pas incorrecte (je ne parle pas de la faute d'orthographe) ? Plus prcisment, 
ne serait-ce pas plutt 


```

```

et d'autre part ce choix de fonction "Dirac" est non-standard  ma connaissance.
A+

----------


## hey kong

> voila l'implementation de level set dans c++ et qt
> modeles de mumford 
> le fichier "levelset.h"
> 
> 
> ```
> 
> ```
> 
> ...





bonjour,
j'aimerai bien savoir pourquoi quand je le tape ce programme ,il m'affiche beaucoup d'erreur 


void levelset::tab_intensite(QImage *image ,int **intensite)  

for(int w=0;w<wid;w++) dclaration attendue 

wid*hei; identification wid et hei  non dfinis 
 out=fopen("rabah2.txt","w"); cette dclaration out n'a pas de classe de stockage 

merci d'avance

----------


## leo5th

bonjour,

Je ne comprends pas pourquoi tu mets la valeur de variable inter comme ca?
(Dans la fonction de calcul delta de phi)

inter=0,5*0,5*(part1*part1+part2*part2);

La valeur de inter est toujours  0. Ce n'est pas:

inter=0.5*0.5*(part1*part1+part2*part2);

J'ai essay avec 0.5. Mais le rsultat n'est pas bon.

----------

