begin process at 2008 07 06 12:52:48
1 205 544 membres
121 nouveaux aujourd'hui
14 119 membres club

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é: 5 743 / 364

Note :
Aucune note

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


Description

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
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

13 février 2008 00:00:38 :
Mise en forme
  • 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.

Ajouter un commentaire

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS