Détection des cercles dans une image: hough

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 / Exemple :


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

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.