Accueil > > > DÉTECTION DES CERCLES DANS UNE IMAGE: HOUGH
DÉTECTION DES CERCLES DANS UNE IMAGE: HOUGH
Information sur la source
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
Historique
- 13 février 2008 00:00:38 :
- Mise en forme
Sources du même auteur
Sources de la même categorie
Commentaires et avis
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,
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
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
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
palette de couleurs pour une image BMP [ par fuitanoi ]
Bonjour je cherche à savoir comment créer une palette de couleurs en niveau de gris pour une image BMP en c.l'image sera en 8 bits( 256 coul
trouver une image dans une autre [ par hilairenicolas ]
Bonjour, je dispose de 2 images BMP, dont l'une est un sous-ensemble de l'autre (une partie de la première) j'aimerai obtenir les coordonn
Upload sur ImageShack [ par alex124 ]
Bonjour, j'aimerais savoir s'il serait possible de faire un programme qui permette d'uploader directement une image sur ImageShack. Par exemple on met
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|