# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Algorithme de dtection de contours

## winux32

Bonjours  tous. Quel est l'algo le plus simple permettant d'identifier toutes les formes sur une image monochrome ? Disons que le noir (0) soit utilis pour le fond, le blanc (1) pour les dessins et qu'il n'y a que des formes pleines (pas de "trous" dans les dessins) . En rsum, dtecter tous les contours et savoir combien de contours y a t-il en tout. C'est pour un programme de dtection de contours que je dois crire en C. Merci.

----------


## pseudocode

on peut avoir une image d'exemple pour comprendre plus exactement ta situation.

----------


## ArgusAzure

Un pixel contour tant un pixel d'une forme ayant au moins un voisin comme font; il doit suffir de balader une fentre 3x3 pixels, et d'incrmenter ton compteur de nombre de pixels contour lorsque  le pixel centrale de la fentre est de type forme et au moins un des 8 pixels voisins, de type fond.
 ::king::

----------


## winux32

ArgusAzure, a permet seulement de dessiner tous les contours. Ca ne permet pas de compter combien de formes il y avait en tout. T'as une ide ?

pseudocode, il n'y a pas de logiciel de dessin install sur la machine sur laquelle je suis en ce moment. Je vais peut-tre pouvoir revenir avec un exemple cet aprem. Pourtant ArgusAzure il a vite compris  ::P:  !  ::lol::

----------


## ArgusAzure

> En rsum, dtecter tous les contours et savoir combien de contours y a t-il en tout.


C'est que je croyais que tu voulais compter les contours....
Si tu veux compter les formes, il n'est pas ncessaire de dtecter les contours.




> Pourtant ArgusAzure il a vite compris  !


Nuance : je croyais avoir compris
Tu veux peut tre compter les contours pour chaque forme?

----------


## pseudocode

> ArgusAzure, a permet seulement de dessiner tous les contours. Ca ne permet pas de compter combien de formes il y avait en tout. T'as une ide ?


Ah... ca s'eclaircit un peu. Tu veux compter le nombre de formes (qui sont pleines) sur un image.

Il faut donc compter le nombre de composantes connexes: un exemple ici

 :;):

----------


## winux32

> Ah... ca s'eclaircit un peu. Tu veux compter le nombre de formes (qui sont pleines) sur une image.


Oui ! C'est bien a. Si c'est toujours pas clair pour certains, voici l'*image d'exemple* :



Le problme c'est de compter combien y a t-il d'objets dessins. Je pense actuellement  ceci :

- Je recherche un point qui n'a pas la couleur du fond. J'ai donc actuellement affaire  un objet, plus prcisment  un point de son contour.

- Je suis (du verbe suivre) le contour de l'objet jusqu' ce que je revienne  ma position initiale, l o j'ai trouv l'objet. J'incrmente le compteur de dessins (initialement 0). Suivre le contour ne devrait pas tre difficile si on sait reconnatre un point d'un contour (un point dont au moins un pixel avoisinant a la couleur du fond).

- Je continue ma recherche ...

Il faut avoir un tableau qui contiendra la liste des points appartenant  un contour qui ont dj t visits pour viter de les reconsidrer.

Mon algorithme est-il bon ?




> Si tu veux compter les formes, il n'est pas ncessaire de dtecter les contours.


Comment on fait dans ce cas ?




> Il faut donc compter le nombre de composantes connexes: un exemple ici


Je vais analyser ce code. J'espre que j'y trouverai mon bonheur.

----------


## pseudocode

> Mon algorithme est-il bon ?


oui, en thorie il fonctionne.  ::king:: 

En pratique, cela pose des problmes si le contour n'est pas "propre" (par exemple des blocs de pixels agglutins). Dans ce cas on risque soit d'oublier des pixels, ou soit de se perdre dans le parcours.

----------


## Frifron

Salut, j'avais post un algo pouvant t'interesser mais mon message a t effac je ne sais pas pourquoi. Un problme les modos ?

En gros tu parcours les pixels de ton image apres avoir crer un buffer de la mme dimension. C'est un algo itratif simple : si un pixel est noir tu met zero dans le buffer, s'il est blanc tu regarde s'il est connect (en regardant les voisins dans le buffer deja traits). Si oui tu met la mme valeur a la position courante. Si non tu incrment un compteur et tu met cette valeur. Si le pixel est connect a diffrentes valeurs, soit tu conserve tu conserve l'information du couple dans un conteneur (si elle n'y ai pas dj) pour refaire une passe a la fin , soit tu refait une passe immdiatement (uniquement sur les pixels deja trait) en remplacant une des 2 valeurs connectes par l'autre.

A la fin de l'algo tu as tes formes dans ton buffer. Tu connais galement le nombre de forme facilement (compteur - nb de couples).

J'ai du mal m'exprimer... en fait c'est le genre d'algo qui s'explique beaucoup mieux avec un schma...

----------


## ToTo13

Bonjour,




> Salut, j'avais post un algo pouvant t'interesser mais mon message a t effac je ne sais pas pourquoi. Un problme les modos ?


non, mais algo pas trs clair et c'est le mme que celui de PseudoCode qui propose en plus de l'explication une implmentation (le lien).





> J'ai du mal m'exprimer... en fait c'est le genre d'algo qui s'explique beaucoup mieux avec un schma...


Ben voil ce que je disais...  ::aie:: 


Sinon pour winux32 :
 - il existe une version rcursive facile  programmer. Tu parcours ton image et ds que tu rencontres une composantes non numrote, tu la contamines avec un germe qui la numrote. L'avantage c'est que c'est trs facile  programmer, l'inconvnient c'est que selon la taille de l'image, tu risques un petit stack over flow  ::aie:: 
 - l'algo de PseudoCode convient parfaitement  ton problme, en plus il numrote directement les composantes sur l'image. De plus il a l'avantage d'tre itratif.  ::king::

----------

