# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Reconnaissance d'un cercle sur une image

## claude nguingui

Salut  tous, 

S'il vous plat j'aimerai extraire un cercle et tout son contenue d'une image mais je ne sais pas comment procder dans matlab.
Quelles fonctions dois-je utiliser ? J 'ai essay de lire vos rponses par rapport aux reconnaissances de formes mais ce n'tait pas dit simplement.

Merci

----------


## ToTo13

Bonjour,

la transforme de Hough pour les cercles est faite pour a.

----------


## Flo.

Sur Matlab, je ne sais pas mais dans la thorie, si le contour de ton cercle est suffisamment marqu et que tu n'as pas trop de bruit, tu peux trouver le centre de cercle de la faon suivante.

Tu extrais les contours de ton image selon la mthode de Canny :
petit flou gaussien pour lisser l'imageextraction du gradient de l'image (Sobel)maxima locaux + seuillage par hysteresis pour obtenir les contours
(Matlab doit probablement avoir une instruction qui fait tout ceci d'un coup.)

En chaque point de contour, tu connais donc la direction du gradient. Ca te donne donc une droite pour chaque point du contour (point + vector). Ces droites, si les points appartiennent tous  un cercle, doivent toutes s'intersecter au mme point, le centre du cercle.

Concrtement, on utilise une image d'accumulation dont tous les pixels sont mis  0. On parcourt chacune des droites (voques plus haut) en ajoutant 1 point  la valeur de chaque pixel parcouru dans l'image d'accumulation. On se retrouve  la fin de l'opration avec un maximum d'accumulations (ou de votes) dans l'image : *c'est le centre du cercle*.

Si tu connais le rayon approximatif du cercle et si tu sais que l'intrieur du cercle est blanc et l'extrieur noir, tu peux limiter le parcourt de chaque droite  rendant l'image d'accumulation plus claire.

Ensuite il faut re-parcourir les droites en sens inverse, c-a-d du centre que tu viens d'identifier vers les pixels contours. Pour chaque droite tu vas trouver une distance moyenne du centre au pixel contour associ. Cette distance moyenne *c'est le rayon du cercle*.

Flo.

----------


## pseudocode

> En chaque point de contour, tu connais donc la direction du gradient. Ca te donne donc une droite pour chaque point du contour (point + vector). Ces droites, si les points appartiennent tous  un cercle, doivent toutes s'intersecter au mme point, le centre du cercle.


Je ne suis pas certain que ca soit trs robuste comme mthode. Sur image relle, les probabilits que les normales au contour passent toutes par le mme point doivent tre assez faible. Non ?

----------


## Flo.

A noter que ce principe n'est pas de mon propre cru mais du cru d'un gars qui l'exposait sur son site pour optimiser hough sur des cercles - je ne retrouve malheureusement plus son lien. 

Les centres de ces ellipses sur l'image plus bas (image de profondeur) ont t extraits par le principe que j'ai nonc. Ces ellipses reprsentent un cercle vu en perspective. Une calibration du systme permet de connatre le petit et grand diamtre de l'ellipse. 

Le principe que je cite plus haut est donc modifi pour tre appliqu sur une ellipse. Il s'agit de calculer  l'avance le rayon pour chaque valeur angulaire du gradient (sachant que les ellipses ont toujours leur grand diamtre horizontal).

Pour chaque point de contour dont le gradient a un angle thta, j'accumule le long d'un segment [R(theta)-precision; R(theta)+precision]  partir du point contour dans la direction du gradient. La constante prcision est l pour compenser le fait (comme le souligne pseudocode) que toutes les lignes ne s'intersectent pas au mme endroit. 

Cet "amas d'intersections" est en bleu dans l'image. Il ne s'agit effectivement pas d'un point. On peut rcuprer un centre approximatif avec le centre de gravit de cet amas. 

Ensuite en remontant le long des gradients en partant du centre vers l'extrieur je trouve le contour des ellipses (en rouge). A partir de l je fais un truc un peu plus sioux qu'une moyenne des distances [pixel rouge; cenre de gravit de l'amas bleu] mais une telle moyenne sur des contours moins bruits pourrait faire l'affaire. 



A noter que cette solution fonctionne en milieu industriel avec un robot sans problme. Je n'ai malheureusement pas la carte d'accumulation associe et n'ai pas non plus le temps d'en refaire une.

(ah au fait si toutes les ellipses ne sont pas dtectes c'est que je traite uniquement certains niveaux de gris).

Flo.

----------


## souviron34

outre le fait que la solution lgante et directe a t donne plus haut, 




> Sur Matlab, je ne sais pas mais dans la thorie, si le contour de ton cercle est suffisamment marqu et que tu n'as pas trop de bruit, tu peux trouver le centre de cercle de la faon suivante.


une solution par moindres carrs nettement plus simple et sre algorithmiquement parlant se trouve dans la rubrique Contribuez sous le titre "Ellipse-fitting"...

----------


## Flo.

> outre le fait que la solution lgante et directe a t donne plus haut,


Je loue les solutions lgantes (et encore quand elles sont  bas prix !). Mais bien souvent si la thorie donne une ide trs attrayante de la rsolution d'un problme, la pratique a tt fait d'y intgrer des astuces pour soumettre la solution thorique  des contraintes de temps, d'espace mmoire, et blabla.

Quand aux moindres carrs, c'est effectivement ce que j'utilise une fois ma remonte des rayons oprs pour extraire le rayon et centre dfinitifs.

Enfin bon bref, ma mthode fonctionne et est prouve  raison d'un traitement (300 ms) par seconde depuis 3 ans maintenant. Le traitement en question permet  robot 6 axes d'aller dcaisser les cylindres dont sont issus les ellipses et ceci en 3D (image de profondeur) le tout avec une prcision de 0.6mm. Au dessus du millimtre le robot explose le cylindre. Et croyez-moi le client y tient  ses cylindres.

Aprs si a vous amuse de ressortir les noms de quelques chapitres de quelques bouquins de traitements d'image ou de jeter a et l le nom des fonctions OpenCV qui vont bien, je ne suis pas sur que a aide franchement le posteur.

L'image que j'ai poste est suffisamment claire pour m'viter de telles remarques !

Flo. (lgrement nerv sur le coup j'avoue !!!)

----------


## pseudocode

> A noter que cette solution fonctionne en milieu industriel avec un robot sans problme. Je n'ai malheureusement pas la carte d'accumulation associe et n'ai pas non plus le temps d'en refaire une.
> 
> (ah au fait si toutes les ellipses ne sont pas dtectes c'est que je traite uniquement certains niveaux de gris).
> 
> Flo.


Ah, je comprend mieux pourquoi ca marche si bien dans ton cas. Tes images sont trs "propres", avec des contours biens rguliers et sans chevauchements.

Pour ma part, ca serait certainement moins probant.

----------


## souviron34

et dans mon cas encore pire, car encore plus bruites :

Images de galaxies elliptiques

----------

