Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DÉTECTION DES CERCLES DANS UNE IMAGE: HOUGH


Information sur la source

Catégorie :Graphique Classé sous : Hough, image, cercle, détection, traitement image Niveau : Débutant Date de création : 12/02/2008 Date de mise à jour : 13/02/2008 00:00:38 Vu / téléchargé: 9 679 / 734

Note :
Aucune note

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Le principe de base de la détection des cercles est très simple:
On dessine les contours de l'image et pour tous les points appartenant aux contours, on dessine dans l’accumulateur un cercle de rayon R. Si l'on cherche à détecter un cercle de rayon R alors, le point de l'accumulateur ayant reçu le plus de suffrage sera le centre du cercle recherché.



Avantages de cette méthode : on peut détecter un cercle même s'il est partiellement caché ou même si l'image est très bruité.
Rapide et très robuste si l'on connais le rayon du cercle rechercher.

Inconvénients: ce traitement nécessite de connaître approximativement le rayon du cercle recherché.



Cette source propose 3 petits traitements mettant en relief les avantages de cette méthode.
Les trois traitements sont accessibles en cliquant sur les trois icônes correspondantes dans la barre d'outil.

-Traitement 1 : Découverte de la méthode: on sélectionne un intervalle de rayon possible et le programme trouve le cercle le plus adapté.

-Traitement 2 : Robustesse au bruit : on ajoute du bruit dans l'image et on observe si la détection du cercle est toujours bonne.(ici, on détecte un cercle partielle)

-Traitement 3 : Application simple: Détection de la pupille et de l'iris d'un œil.

 

Source

  • //****************************************************************************************
  • //MORARD Vincent
  • //vincent.morard@cpe.fr
  • //pistol.petesampras.free.fr
  • //****************************************************************************************
  • #include "CImage.h"
  • #include "DlgCallback.h"
  • void Message5(HWND hList,HWND hDlg,char *Mes,int Buf)
  • {
  • SendMessage(hList,LB_ADDSTRING, 0, (LONG)Mes);
  • SendMessage(hDlg,WM_UPDATE,Buf,0);
  • Sleep(0);
  • }
  • //************************************************************************************
  • //Thread Cercle3 : Détection de cercle sur l'image d'un oeil.
  • //Le but de ce traitement est de détecter le contour de la pupile ainsi que le contour de l'iris
  • //Le but final étant de trouver le centre de l'oeil et les rayon des cercles associés.
  • //************************************************************************************
  • DWORD WINAPI DetectionCercle3(LPVOID lpParam )
  • {
  • HWND hDlg,hOK,hwndList;
  • int R,X,Y;
  • hDlg=(HWND) lpParam;
  • hwndList=GetDlgItem(hDlg, IDC_LIST1);
  • hOK=GetDlgItem(hDlg, IDOK);
  • int t = GetTickCount(); //initialisation du temps
  • SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)"Début du traitement");
  • if(Img[0].LoadBmp("./Hough.bmp")==0)return 0;
  • Img[0].ConvertRGB2Gray();
  • Message5(hwndList,hDlg,"Ouverture de l'image : Fait",0);
  • if(Img[0].Sobel(GRAY,&Img[1])==0)return 0;
  • Message5(hwndList,hDlg,"Sobel : Fait",1);
  • if(Img[1].Threashold(254,&Img[2])==0)return 0;
  • Message5(hwndList,hDlg,"Seuillage : Fait",2);
  • if(Img[2].HoughCircleCompute(36,38,&Img[3],&X,&Y,&R)==0)return 0;
  • if(Img[3].HoughContrasteAuto()==0)return 0;
  • Message5(hwndList,hDlg,"Hough: détection de cercle : Fait",3);
  • if(Img[0].DrawCircle(R,X,Y,255,0,0)==0)return 0;
  • Message5(hwndList,hDlg,"Dessin du cercle trouvé : Fait",0);
  • //Fin de la détection de la pupile coord: R, X, Y
  • if(Img[0].Median(GRAY,9,40,&Img[4])==0)return 0;
  • Message5(hwndList,hDlg,"Filtre médian : Fait",4);
  • if(Img[4].Sobel(GRAY,&Img[5])==0)return 0;
  • Message5(hwndList,hDlg,"Sobel : Fait",5);
  • if(Img[5].Threashold(20,&Img[6])==0)return 0;
  • Message5(hwndList,hDlg,"Seuillage: Fait",6);
  • if(Img[6].HoughCircleCompute(100,100,&Img[7],&X,&Y,&R)==0)return 0;
  • if(Img[7].HoughContrasteAuto()==0)return 0;
  • Message5(hwndList,hDlg,"Hough: detection de cerlce : Fait",6);
  • if(Img[0].DrawCircle(R,X+1,Y+1,0,255,0)==0)return 0;
  • Message5(hwndList,hDlg,"Dessin du cercle trouvé : Fait",0);
  • //Fin du traitement, le second cercle est de coordonnée R,X,Y
  • SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)"Fin du traitement, temps (ms) ");
  • t = GetTickCount() - t;
  • char Buf[20];
  • strcpy(Buf,itoa(t,Buf,10));
  • SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)Buf);
  • EnableWindow(hOK,TRUE);
  • return 1;
  • }
//****************************************************************************************
//MORARD Vincent
//vincent.morard@cpe.fr
//pistol.petesampras.free.fr
//****************************************************************************************

#include "CImage.h"
#include "DlgCallback.h"
void Message5(HWND hList,HWND hDlg,char *Mes,int Buf)
{
	SendMessage(hList,LB_ADDSTRING, 0, (LONG)Mes);
	SendMessage(hDlg,WM_UPDATE,Buf,0);
	Sleep(0);
}
//************************************************************************************
//Thread Cercle3 : Détection de cercle sur l'image d'un oeil. 
//Le but de ce traitement est de détecter le contour de la pupile ainsi que le contour de l'iris
//Le but final étant de trouver le centre de l'oeil et les rayon des cercles associés.
//************************************************************************************
DWORD WINAPI DetectionCercle3(LPVOID lpParam )
{
	HWND hDlg,hOK,hwndList;
	int R,X,Y;

	hDlg=(HWND) lpParam;
	hwndList=GetDlgItem(hDlg, IDC_LIST1);
	hOK=GetDlgItem(hDlg, IDOK);

	int t = GetTickCount();  //initialisation du temps

	SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)"Début du traitement");

	if(Img[0].LoadBmp("./Hough.bmp")==0)return 0;
	Img[0].ConvertRGB2Gray();
	Message5(hwndList,hDlg,"Ouverture de l'image : Fait",0);
	
	if(Img[0].Sobel(GRAY,&Img[1])==0)return 0;
	Message5(hwndList,hDlg,"Sobel : Fait",1);
	
	if(Img[1].Threashold(254,&Img[2])==0)return 0;
	Message5(hwndList,hDlg,"Seuillage : Fait",2);

	if(Img[2].HoughCircleCompute(36,38,&Img[3],&X,&Y,&R)==0)return 0;
	if(Img[3].HoughContrasteAuto()==0)return 0;
	Message5(hwndList,hDlg,"Hough: détection de cercle : Fait",3);

	if(Img[0].DrawCircle(R,X,Y,255,0,0)==0)return 0;
	Message5(hwndList,hDlg,"Dessin du cercle trouvé : Fait",0);

	//Fin de la détection de la pupile coord: R, X, Y
	
	if(Img[0].Median(GRAY,9,40,&Img[4])==0)return 0;
	Message5(hwndList,hDlg,"Filtre médian : Fait",4);

	if(Img[4].Sobel(GRAY,&Img[5])==0)return 0;
	Message5(hwndList,hDlg,"Sobel : Fait",5);

	if(Img[5].Threashold(20,&Img[6])==0)return 0;
	Message5(hwndList,hDlg,"Seuillage: Fait",6);

	if(Img[6].HoughCircleCompute(100,100,&Img[7],&X,&Y,&R)==0)return 0;
	if(Img[7].HoughContrasteAuto()==0)return 0;
	Message5(hwndList,hDlg,"Hough: detection de cerlce : Fait",6);

	if(Img[0].DrawCircle(R,X+1,Y+1,0,255,0)==0)return 0;
	Message5(hwndList,hDlg,"Dessin du cercle trouvé : Fait",0);
	
	//Fin du traitement, le second cercle est de coordonnée R,X,Y
	
	SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)"Fin du traitement, temps (ms) ");
	t = GetTickCount() - t;  
	char Buf[20];
	strcpy(Buf,itoa(t,Buf,10));
	SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)Buf);

	EnableWindow(hOK,TRUE);
	return 1;

}

Conclusion

Le logiciel en lui même permettant ces traitements à aussi été amélioré:
-Drag and drop des image provenant de fichier vers le logiciel
-Scroll verticale et horizontale
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

13 février 2008 00:00:38 :
Mise en forme

Commentaires et avis

signaler à un administrateur
Commentaire de Kirua le 13/02/2008 12:48:31

Salut!

En dessinant des cônes dans un espace de Hough 3D plutôt que 2D, à savoir: avec les coordonnées (x, y) du centre comme tu fais + le rayon r du cercle, tu peux supprimer l'exigence de la connaissance du rayon. Par contre, ça va prendre carrément plus de place, et la discrétisation de la troisième dimension va être assez critique, ça c'est clair.

C'est déjà avec toi qu'on avait eu la discussion sur la détection des droites non?

signaler à un administrateur
Commentaire de Pistol_Pete le 13/02/2008 13:32:35

Salut Kirua

Oui c'était déja avec moi que l'on aavais eu cette discussion sur la transformée de Hough. C'était sur ma source :
http://www.cppfrance.com/codes/DETECTION-DROITES-DANS-IMAGE-HOUGH_43486.aspx

Si j'ai bien compris, la méthode que tu me proposes est en quelque sorte de calculer la transformée de Hough 2D pour tous les rayons r afin de constituer l'espace de Hough 3D.
Effectivement en effectuant cette methode, il n'y aurai plus besoin de connaitre le rayon du cercle recherche.
Tu remarquera que c'est ce que je fais dans mon traitement 1:

HoughCircleCompute(Rmin,Rmax,&Img[7],&X,&Y,&R);
Je calcule Rmax -Rmin fois la transformée de Hough 2D
Ta méthode revient bien a cela, non?

signaler à un administrateur
Commentaire de Pistol_Pete le 13/02/2008 13:43:09

Pour s'affranchir totalement du rayon du cercle recherché, il y aurai cette méthode bien meilleur coté perf et mémoire:

En calculant l'image des gradients,avec un Sobel par exemple, on connaitra direction du vecteur pour chaque point des contours.
Donc au lieu de tracer des cercles dans l'accumulateur, on pourra tracer des droites perpendiculaires a la direction de ce vecteur. Toutes ces droites convergeront vers un unique point: le centre du cercle.
Et la, on s'affranchie totalement du rayon des cercles recherché.

Cette méthode permettrait de ne pas calculer n fois la transformée de Hough

Dis moi ce que tu en penses:

signaler à un administrateur
Commentaire de aquamanfx le 01/03/2008 09:15:31

C'est une des méthodes que l'on peut utiliser en effet. Il est souvent intéressant dans les HT de coupler certaines variables afin de réduire l'espace de recherche.
Sinon, je vois que tu fais une méthode de 1 à m; mais la méthode m à 1 est pas mal quand tu n'as pas trop de points (tu testes tous les triplets de points de ton image, ça fait du C(n,3) (combinatoire de 3 avec n points) ). Avec une petite recherche rapide des rayons potentiels en plus, ça "dépote" en temps de calcul :o)

signaler à un administrateur
Commentaire de bakira4 le 04/03/2008 18:20:24

Bonjour à tous!
Etant en ce moment en plein projet portant sur le traitement d'image,
je souhaiterais savoir si vous connaissiez un moyen simple et peu couteux de supprimer les "petits objets" d'une image?
Car je tente de faire un algo de détection de ligne (aider par la LTI lib) cependant la transfirmé de hough fournit définit comme droite tout segment de l'image j'obtien donc des résultats inéxploitable...
En tout cas je tiens a remercier Pistol pour toutes les sources sur le domaine qu'il a publié; vraiment beau travail!

signaler à un administrateur
Commentaire de Kirua le 04/03/2008 18:42:51

A priori, les petits objets auront peu de points, donc il suffit, je pense, d'utiliser un seuil plus élevé au moment de la sélection des droites dans l'espace de Hough.

signaler à un administrateur
Commentaire de aquamanfx le 04/03/2008 19:02:55

Entièrement d'accord avec Kirua.
Cependant s'il s'agit de petits objets résiduels alignés sur une droite plus grande détectée au préalable, il faut indexer les points pour regarder les extrema. Et en fonction d'une loi de distance isoler ou garder par post traitement ce qui intéresse.

signaler à un administrateur
Commentaire de Pistol_Pete le 05/03/2008 09:53:48

Salut AquamanFX
Merci de ton commentaire toujours tres instructif et constructif.
Quant tu parles de reduire l'espace de recherche, je suis entierement d'accord avec toi. Cependant, c'est surtout valable dans la recherche des ellipses non? Peut etre que je me trompe mais, je ne pense pas qu'il soit possible de trouver des ellipses dans une image sans avoir la moindre connaissance des proprietes de l'ellipse que l'on recherche, en un temps de calcul raisonnable. Pour un cercle, c'est possible.
Je vais maintenant m'interesser a la recherche des ellipses. Ca me semble largement plus complique et par consequent, plus passionnant.
Faut il obligatoirement passer par la detection des deux foyers?

Salut Bakira4, merci de ton commentaire, ca me fait tres plaisir de savoir que mes sources peuvent t'aider. Je pense que les reponses de Kirua et d'AquamanFX te permettront de resoudre le probleme que tu as soulever. La methode d'Aquamanfx est sans doute plus longue a mettre en place mais donnera sans doute de meilleurs resultats.
En tout cas si tu as d'autres soucis sur la TH n'hesite pas.

A+

signaler à un administrateur
Commentaire de Kirua le 05/03/2008 13:14:33

Ca m'intéresserait de savoir quelles subtilités tu vas utiliser pour réduire l'espace de recherche pour les ellipses :). Parce qu'effectivement, a fait un espace de hough à ... quoi, 6 dimensions? (à pouf) A moins que 5 ... euh, j'ai un peu perdu mes bases de géométrie :p Mais deux foyers font déjà 4 dimensions, et puis il faut juste l'excentricité ou aussi autre chose?

signaler à un administrateur
Commentaire de Pistol_Pete le 06/03/2008 12:18:58

Salut
Effectivement pour les ellipses cela fait un espace a 5 dimensions. En generale, les parametres de l'ellipse sont:
(x0,y0): le centre de l'ellipse
a: la taille du petit axe divise par 2
b: la taille du grand axe divise par 2
Alpha: l'orientation de l'ellipse

Je pense que pour reduire l'espace de recherche, on peut utiliser les proprietes geometriques de l'ellipse pour passer d'un espace a 5 dim a un espace a 3 dim. En effet, en selectionnant uniquement 3 points de l'ellipse, on peut definir, avec une marge d'erreur, les 5 parametres. Les points de l'ellipse, bien sur, ne doivent pas etre choisis au hazard: On doit rechercher les deux points qui definissent le grand axe et pour le troisieme peu importe.

Je pense que le temps de calcule restera relativement important: il y a 3 dimensions tout de meme!
Mais je ne pense pas que l'on puisse faire mieux que 3 dimensions. Il faudrait que je me documente mieux pour savoir ou les chercheurs en sont.

A+

signaler à un administrateur
Commentaire de aquamanfx le 06/03/2008 12:56:51

Rapidos en réponse au précédent message :
- http://perso.enst.fr/~maitre/BETI/ellipses/Houghol.htm de Mr Maître, des résultats et une explication "simples"
- sinon la solution de Rémy B. Arnaud L. de mon ancien labo (la publi finale de l'IEEE était plus détaillée il me semble): aletroter.free.fr/articles/SiPS05.pdf . Rémy Bulot en avait fait une encore plus rapide, mais je ne la retrouve plus... à voir
A+

signaler à un administrateur
Commentaire de Kirua le 06/03/2008 14:17:07

Merci pour le lien :)

signaler à un administrateur
Commentaire de Pistol_Pete le 07/03/2008 12:54:41

Salut
Oui effectivement, merci beaucoup pour les documents.
La detection des ellipses est quand meme largement plus interessante que la detection des cercles... Je vais essayer de trouver le temps de faire la mienne. En attendant, je travaille sur les detections optimales des contours (canny shen-castan,deriche...).  Ben oui, une transformee de Hough efficasse, passe obligatoirement par la!
Je pense que ca va te plaire Kirua. Ya pas mal de math.

A+

signaler à un administrateur
Commentaire de Kirua le 07/03/2008 13:14:32

Et pour le seuillage, Otsu est ton ami :).

signaler à un administrateur
Commentaire de Pistol_Pete le 07/03/2008 15:26:59

Non, pour le seuillage, j'ai pas vraiment d'ami fidèle. Tout dépend de l'endroit ou l'on va...

signaler à un administrateur
Commentaire de Pistol_Pete le 11/03/2008 13:33:27

Voila la detection de contours est arrive coome promis!
C'est par ici:
http://www.cppfrance.com/codes/DETECTION-OPTIMALE-CONTOURS-CANNY-DERICHE-SHENCASTAN_45999.aspx

A+

signaler à un administrateur
Commentaire de aquamanfx le 14/03/2008 09:15:51

Je connais Mr Deriche, je l'avais rencontré à la soutenance de thèse d'un ami.
Je  viens d'ailleurs de remettre la main sur son mémoire de thèse (de l'ami!) qui (j'en suis presque certain) va énormément te plaire!
En effet tu verras tout le travail qui a été fait autour du filtrage et des optimisations (multi échelle) et des transformées de Hough pour droites et ellipses.
http://www.cmi.univ-mrs.fr/ecole-doctorale/pdftheses/LeTroter.pdf
C'est une demi réponse à ta requête au sujet de ma propre thèse (qui est confidentielle pour 10 ans...), puisque j'ai utilisé des optimisations sur Hough parfois équivalentes (même directeur de thèse... comme par hasard :o) )
A+
PS : je trouve humblement sa thèse très accessible, puisque faite dans esprit très didactique plus informatique que mathématique.

signaler à un administrateur
Commentaire de adilensas le 27/02/2009 21:05:35

salut tout le monde; j'ai un mini-projet concernant la reconnaissance de forme par vision artificielle.
s'il ya qel q'un des documentation sur se sujet...merci

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Definir une region circulaire dans une image 12 bit bmp [ par pirate75000 ] Je travail sur des images de 12 bits de niveau de grisJe desire appliquer des filtre sur cette image,la partie principale etant contenue dans un cercl Transformée de Hough [ par elo29 ] Bonjour, Je travaille avec visual C++ et je debute dans le traitement d'image et en programmation C++. Je dois effectuer la detection de cercles dans traitement image : filtre circulaire [ par jphotension ] jphotensionBonjour,je traite des images binaires bitmap en programmant en C. J'effectue des traitements sur l'image : érosion, dilatation, ouverture, image en forme de cercle [ par mathieu57100 ] bonjour, j'aimerai savoir comment faire appraitre une image seulement dans un cercle, la partie de l'image hors du cercle n'apparaitrait pas.j'ai essa détection de route dans une image de rue [ par wnxbcvqmsldkfjgh ] Bonjour,J'ai un projet dans lequel je dois détecter une route dans une image de rue, contenant bâtiments, piétons, voitures... Savez-vous si on peut t Mise en couleur d'image sur une page HTML [ par stephane85700 ] bonjour, Je débute dans la création de site, et j'aimerai un peu de vos lumières pour avancer.Je souhaiterais pouvoir créer une page ou il serait poss traitement d'image [ par salma2011 ] Slt tt le monde,je cherche un théme pour ma representation de PFE avec powerpoint,j'ai comme sujet le traitement d'image avec vc++,,qq1 peut m'aider?? Probleme avec filtre image en c [ par simomiso ] Bonjour,tout d'abords un GRAND MERCI a tous ceux ki ont participé ds la conception de ce site.En fait j'ai un proble avec un filtre image avec matrice image jpg dans ressource [ par mogwai93 ] bonjourj'aimerais afficher sur une fenetre une image jpg contenu dans une ressource.pour le moment, je sais afficher une image jpg à l'exterieur Pb. de détection d'OS Windows [ par bachdorches ] à priori je ne dispose pas de tous les outils de compilation dont j'ai besoin. J'ai téléchargé et installé le Borland C++Comp


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,608 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.