# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  [Traitement d'image , morpho maths] Squelette Algo.

## parp1

Bonjour a toutes et tous.

Voila je souhaite avoir si possible un algorithme de squelette.

Je sais qu'un squelette est l'ensemble des points qui sont constitus par tous les cercles inscrit touchant au moins deux cot dans notre objet.

Primo:si je fait fausse route ou si vous avez une meilleur explication faite le moi savoir.

Deuxio: J'aimerai avoir un algo car j'ai un peu de mal a voir comment programmer ca.

Je travaille sur des matrice que j'envoi dans un tuple qui est lui meme envoy dans une image.

Voila merci.

----------


## Matthieu Brucher

C'est l'ensemble des centres de ces cercles, oui. En fait, a c'est ce que c'est, ensuite, on utilise des algos de morpho math. Sur le coup, je n'ai pas de lien, mais regarde skeletonize ou skeletonization sur ton moteur de recherche favori  :;):

----------


## parp1

Merci bien. 
J'espere que je vais trouver une ptit bout de code. 

Aplus

----------


## mathieu_t

Sinon il me semble que sous Matlab il y a des fonctions toutes faites du style erode ou dilate ( vrifier)... Dans ce cas tu as aussi le source de ces fonctions, donc tu peux voir comment a marche !

A+

----------


## ToTo13

Bonjour,

la thorie est belle, mais elle est inaplicable directement dans le cas discret.

Donc pour obtenir le squelette d'une image, il faut utiliser des masques de la formes :


```

```

ainsi que les sept autres rotations et symtries.

Comment les interprter : pour un pixel de ton image, tu centre ton masque dessus, puis il faut que son voisinage corresponde : 0 le voisin ne doit pas etre plein, 1 le voisin doit tre de la matire.

Ceci te permettra de calculer le squellete de toutes les formes, c'est ce que l'on appelle un squelette par amincissement.

Bonne continuation.

----------


## ToTo13

oups j'ai oubli :

une * siginifie que l'on se moque si c'est de la matire ou du vide.
 :;):

----------


## parp1

Ok merci a tous.

Donc enfait j'ai juste a convoluer mon image avec le masque que TOTO ma filer en le faisait roter sur les huit ou quatre connexit.? c'est si simple que ca?

Et par exemple pour le skiz, est ce que l'on pourrait appeler ca un squelette par epaississement.?
Je pense car dans le logiciel ... (que je n'aime pas a cause de la politique de l'entreprise et a cause du bug incessant.) car pour trouver le skiz il faut aller dans l'operateur thinken et selectionn skiz dans les options.

En tout cas merci pour vos intervention.

salutation

----------


## ToTo13

euh...

c'est quoi que tu appelles un skiz ???

----------


## parp1

Skeleton by influance zone 

Squelette par zone d'influance.
C'est tres similaire a la LPE sous contrainte niveau resultat.

Mais j'ai des souci avec ma LPE sous contrainte. Donc si je peut passer par le skiz

Voila.
A oui une chose.


> Comment les interprter : pour un pixel de ton image, tu centre ton masque dessus, puis il faut que son voisinage corresponde : 0 le voisin ne doit pas etre plein, 1 le voisin doit tre de la matire.


Matiere et plein ce n'est pas la meme chose.Tu voulait peut etre dire Vide et matiere.

----------


## ToTo13

oui

pour moi matire et plein c'tait pareil dans ce cas.

----------


## parp1

Ca y est j'ai relu mes cours de morpho maths.

Il existe plusiseur type de squelette par aminssisement.

Selon l'alphabet de Golay

Squelette homotopique L



```

```

Squelette homotopique M



```

```

Ebarbage



```

```

En appliquant ces noyaux, nous obtenons un aminssissement

En appliquant d'autre noyaux sur nos squelette : 



```

```

Nous obtiendrons les points extremes du squelette



```

```

Nous obtiendrons les points multiples du squelette

Tous ca en maille Carre

----------


## parp1

Bon assez de theorie!!!! 
J'ai essayer l'aminssissement. 
Avec le noyaux :



```

```

  ::?: :  Est ce que les x peuvent etre remplaces par des 1 ou 0 arbitrairement? parcque j'obtiens un epaississement.

Je vais essayer de replac les x par ds 1 cette fois.

Si quelqu'un a une reponse.Merci

----------


## ToTo13

Les x c'est ce que tu veux, une sorte de jocker qui fait que si c'est du vide ou du plein, a n'a pas d'importance. En fait, c'est des voisins que l'on ne regarde pas.

Par contre, il faut utiliser les huits masque et non deux pour avoir un squelette complet.
Il faut rpter ton opration tant que tu continu  enlever de la matire.

----------


## parp1

Oui j'ai fait les huit masques.
Mais j'obtiens un epaississement donc la deja pour eviter de m'ennuyer a faire huit fois la rotation du masque je vais utilise une fonction qui me fait roter la matrice de x degrees. 

Sauf que pour 45 degres il me fait une matrice 4*4 a partir d'une matrice 3*3

Donc je vais me renseigner sur le forum approprier.

Tiens comment savoir si j'arrive bien au squelette. Parcqu'il faut repeter l'operation jusqu'a que l'objet fasse 1 pixel d'epaisseur . ??? tu crois que c'est un bon critere? 


Merci

----------


## ToTo13

mmmmmmmm

si tu as un epaississement c'est que tu as fait l'opration inverse.
Mais tant donn qu'il n'y a que huit masque, j'ai fait une petite fonction qui me cr le huit masque, soit en dur, soit un peu plus intelligement.

----------


## parp1

Je te file le bout de code ou ya la convolution. 


```

```

a coup sur l'erreur me creve les yeux.... mais comme d'habitude... faut le voir.    ::cry::

----------


## Flo.

Salut,

tu dois respecter les "x" du masque.

Les "x" veulent dire : "ne te proccupe pas de la valeur de ce pixel-l". Lors de la convolution de l'image par le masque, tu ne les considres pas, tu ne les inspectes pas.

Lors de la convolution de l'image par le masque, si un pixel et son voisinage correspondent  la configuration du masque alors une certaine action est faite sinon une autre action est faite (en gros pour ce type d'opration).

Donc si tu remplaces les "x" par des 1, tu modifies la configuration du masque, et donc tu modifies la condition pour le choix de l'action  appliquer en fonction du rsultat de la convolution.

D'o le rsultat non escompt.

En conclusion, il faut respecter les "x".

A+

Flo.

PS : j'ai un code en c++ si tu veux pour le squelette et l'barbulage

----------


## parp1

Merci Flo.
Mais le probleme c'est que je ne sais pas quoi mettre en guise de X sinon je savait bien que les X reprsentaient les pixel non regards. 

Si tu peut mettre ton code ca m'interesse.

Merci

----------


## Flo.

Salut

Voici la fonction qui fait la convolution d'une image par un filtre de type "amincissement" :



```

```

Dfinition du filtre pour le calcul du squelette (configuration L) :



```

```

Et pour calculer le squelette :

- src : image binaire source dont tu veux calculer le squelette
- tmp : image temporaire



```

```

Le rsultat final est dans src (l'image source).

Voil. 

C'est un code que j'avais fait pour tester diffrentes configurations de filtres. C'est pas optimis. Si tu veux l'optimiser il faut faire une fonction de convolution de l'image par le filtre pour chaque filtre pour s'viter les conditions de verification du "x" (du "nomatter" dans le code)  pour chaque  pixel voisin de chaque pixel de l'image. (je sais pas si je suis bien clair l   ::D:   ::?:   )

Par contre c'est pas un truc sur lequel j'ai travaill longtemps, donc garre au bug de programmation.

En cas de problme, de bug, de questions sur le code ou de son ventuelle amlioration (dans un cadre d'utilisation gnrique), n'hsite pas.

A+

Flo.

----------


## parp1

Donc ici Tu dit que un X est un gris. Oui c'est vrai ni blanc ni noir.... ou pas plus blanc que noir.J'y est pas penser
Sincerement merci pour ta source....

Je me suis essayer au C++,avec le mega cour de casteyde.

Je me suis arreter au chapitre "couche objet".

Le truc qui me soule c'est que tout le monde me dit "le C++ c'est chiant et dur" ....Il faut comprendre l'orientation OBjet.... J'ai compris l'hritage puisqu'il y en a en python.Les classes etc etc.
Je pense que mon probleme c'est que je n'ai pas le niveau pour faire un projet concret.
Donc je m'y remettrai parcque la rigoureusit de ce language me plait ... et elle me coutera surment des cheveux aussi .... 

Voila merci encor je vais essayer . 

Merci

----------


## parp1

Et encore une soire a passer sur ce bout de prog.

Bon je sature ton je vais essayer de remmettre tout a plat sur la table.



-Tout d'aord j'ai une image en niveau de gris code de 0 a 255

-Je la seuil pour extraire mes obtjets et elle est cod de 0 a 1.

-J'applique mon noyaux de convolution sur les 8 connexit differentes.


 ::?: :  Je me pose une question. Est ce que je doit appliqu mon noyaux une fois,puis recolt les data, et faire l'union de lensemble des data sous les 8 masque?Ou est ce que je convolu mon masque avec l'image convolu par masque-1

Perso je pense a l'union car sinon ca pourait faire le squelette d'une squelette de squelette??? non ?


 ::?: : Et en appliquant mon masque sur une image binaire est ce que je ne risque pas d'avoir dautre valeur que 0 ou 1?Parcque j'ai des valeur qui valent 4 ou 5

Bon j'ai corrig quelque erreur dans ma routine donc deja mon masque ne tourn pas maintenant c'est fait.

J'attend vos reponse MErci d'avance.

Bonne nuit

----------


## parp1

Re Salut Je reveil ce post !!!!! 


Bon nivo convolution ca roule.

Le truc J'ia un peu de mal a organis mon code.

Je vais essayer d'etre Clair:

algo:

Convolution de mon image par mon noyau 111 
j'obtien ainsi un nouvelle image.............. *1*
........................................................000 

Je fais tourn mon noyaux , et je convolu l'image resultat *noyaux et jobtiens une nouvelle image resultat etc etc etc .... 

Deja est e que ma facon de penser est bonne . MERCI

----------


## ToTo13

Bonjour,

a ressemble  ce qu'il faut faire.
Attention, on est bien d'accord qu'il n'y a qu'une seule image rsultat, somme de tous les masques.

Si c'est bon, marque rsolu.

----------


## parp1

Je ne comprend pas trop... En gros je convolut mon image sur les huit position ensuite je forme une image resultat et je recommence cela jusqu'a idem potence.?

Parcque ce j' ai pu faire jusqua present c'est convuluer mon image avec le masque en position 1 et stoquer le resultat dans une nouvelle matrice que je convolu avec le masque ne pos 2, que je stock que je convolu en pos 3 jusq'en pos 8, j'obtien ici alor l'image de mon premier amincissement.

un fois cela fait j'essai de recommencer ceci  n fois jusqu'a idempotence.

Merci. Sinon t'inquiete pas ce n'est pas resolut je connait le tag...

----------


## Flo.

oui c'est exactement a.

Flo.

----------


## parp1

OK merci a vous tous. je vais essayer de resoudre cela au plus vite. je suis un peu Short en temps pour la programmation en ce moment.Mais je trouverai un moment.

A plus tard

----------


## parp1

Bon salut a tous! 

Voila j'ai fait mes huit convolutions


avec limage 

```

```

par le noyau de convolution 

```

```

J'obtiens l'image : 

```

```

Voila deja est ce que ma convolution vous parrait bonne.??? 

Non parcque deja si ca c'est faux ... MERCI

J'ai une idee pour limit ma convolution au voisinage de mon image. La multiplier par un masque de mon image initiale. Voila ce que ca donne:


```

```

 Bon on peut isoler facilement les premiers points du squelette.Mais si c'est un amincissement je ne devrai pas avoir des valeurs plus petites sur les bord (Hors coin)?
Merci j'ai hate de resoudre ce pb.

----------


## Matthieu Brucher

La convolution a l'air correcte. Les valeurs des bords sont bien plus faibles, non ?

----------


## parp1

Ba enfait je ne comprend pas comment en amincissent les zeros deviennent des valeurs non nuls Si je repete cela N fois il auront une valeur bien plus importante. Voila pourquoi je parlais d'epaississement!

Donc si j'ai bien compris je doit faire un traitement pour extraire les points rels du Squelette

Je pensait que la simple convolution avec le noyau que j'utilise suffisait a me retourner le Squelette. Est ce que c'est normal de passer par la multiplication avec un masque?

Merci

----------


## Matthieu Brucher

???
Tu fais un filtre passe-bas, c'est normal que a "bave" vers l'extrieur. N'oublie pas que, normalement, l'image est considre comme priodique, donc avec un filtrage passe-bas, on va tendre vers une image moyenne constante.
Maintenant, c'est peut-tre pas ce que tu veux, donc il faut peut-tre changer le filtre.

----------


## parp1

Non mon filtre est bon.

Le squelette d'un carr est ses diagonales tu es d'accord? Je devrait obtenir quelque chose comme ca.

Image originale


```

```

Image apres premier amincissement


```

```

C'est de la theorie. Mais je devrais avoir quelque chose de ce genre.

----------


## Matthieu Brucher

Si le filtre est bon, c'est que ton code n'est pas bon.

----------


## parp1

Ba je prog en python. Et j'utilise un module de convolution qui fonctionne puisque j'ai deja programm le moyennage et la detection de contour. Il y a peu etre un traitement a apporter a ma matrice.? j'ai presque reussi la programmer pour le rectangle ou carr. mais si je met un cercle ca ne fonction pas. Donc je vais encore potasser. J'ai essay de passer par la FFT mais j'aimerai passer par la convolution simple d'abord. Voila



bon voila apres un Apres midi de TP traitement d'image, je peux vous dire que le logiciel qu'on l'on utilise me retourne le meme resultat que j'obtiens sous python. Donc je pense qu'il y a un traitement a apporter. Voila!

----------


## jijikkk

j'ai le meme probleme , j'ai bien utilis les huit masque mais comment savoir si j'arrive bien au squelette. Parcqu'il faut rpter l'opration jusqu' que les contours fasse 1 pixel d'paisseur?

----------


## ToTo13

Bonsoir,
il faut rpter l'opration jusqu' ce que n'enlve plis de pixel.
Fais donc le test sur un simple cube pour valider ton programme.

----------

