Traitement d'image : Detection de contour [Résolu]

Messages postés
9
Date d'inscription
lundi 3 janvier 2005
Dernière intervention
11 janvier 2005
- - Dernière réponse : MILAHA13
Messages postés
10
Date d'inscription
mercredi 7 avril 2010
Dernière intervention
22 septembre 2010
- 4 avril 2010 à 10:04
je cherche à déterminer les contours d'un objet dans une image en niveaux de gris.
Tous les pixels de l'objet sont quasiment au meme niveau de gris et le fond de l'image est totalement différent.

j'ai lu les différents codes sur la détection de contour présents sur le site, mais je n'ai rien compris...

merci d'avance.
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
3
Merci
Crois-moi c'est loin d'être compliqué ce genre de manipulation graphique ! ;)



Bon, reprenons dans l'ordre :



Tout d'abord, il faut parcourir tes pixels 1 à 1, par exemple :



for (int i=0; i<LargeurImage; i++)

for (int j=0; j<HauteurImage; j++)

{

PixelCourant = GetPixel(Image.hDC, i, j);

}



Avec cette boucle, tu récupère la couleur de chaque pixel, or toi ce
que tu veux, c'est définir la couleur du pixel selon les couleurs des
autres pixels !

Il te faut donc récupèrer les couleurs des pixels adjacents :



Pixel1 = GetPixel(Image.hDC, i-1, j-1);

Pixel2 = GetPixel(Image.hDC, i-1, j);

Pixel3 = GetPixel(Image.hDC, i-1, j+1);

Pixel4 = GetPixel(Image.hDC, i+1, j-1);

Pixel5 = GetPixel(Image.hDC, i+1, j);

Pixel6 = GetPixel(Image.hDC, i+1, j+1);


Ensuite, il te faut appliquer la matrice :



PixelCourant = Pixel1 - Pixel2 - Pixel3 + Pixel4 + Pixel5 + Pixel6;



Et enfin, tu applique la couleur au pixel courant

SetPixel(Image.hDC, i, j, PixelCourant);



Au final, cela donne :


for (int i=0; i<LargeurImage; i++)


for (int j=0; j<HauteurImage; j++)


{


Pixel1 = GetPixel(Image.hDC, i-1, j-1);

Pixel2 = GetPixel(Image.hDC, i-1, j);

Pixel3 = GetPixel(Image.hDC, i-1, j+1);

Pixel4 = GetPixel(Image.hDC, i+1, j-1);

Pixel5 = GetPixel(Image.hDC, i+1, j);

Pixel6 = GetPixel(Image.hDC, i+1, j+1);



PixelCourant = Pixel1 - Pixel2 - Pixel3 + Pixel4 + Pixel5 + Pixel6;



SetPixel(Image.hDC, i, i, PixelCourant);


}


Bon
par contre, vu que GetPixel te renvoie des couleurs en RGB, et que
SetPixel demande du RGB, il te faut convertir les couleurs de Pixel1 à
Pixel6 en niveau de gris, puis les reconvertir en couleur avant de les
appliquer.



Ceci est pour de la prog sous Windows en utilisant les API Win32 de la
gdi32 ! Mais je pense que tu dois programmer sous Linux, non ? A ce
moment là, il te suffit de remplacer les fonction GetPixel et SetPixel
par les fonctions Linux équivalent (je ne les connait pas).



DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]

Merci cs_DARKSIDIOUS 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
0
Merci
Il te faut appliquer une matrice 1 0 -1




1 0 -1



1 0 -1



A chaque pixel, c'est à dire, pour le pixel (i, j), il faut définit sa couleur selon la couleur des pixels

(i-1, j) + (i-1, j-1) + (i-1, j+1) - (i+1, j-1) - (i+1, j) - (i+1, j+1)



Voir ma source que j'ai faîte en VB récemment pour tracer les contours
d'une forme, ou encore celle pour rendre flou les contours d'une forme
quelconque.



Cette source fonctionne pour des images en couleurs, mais fonctionne
également en niveaux de gris : il suffit de ne pas traitement les
pixels sous forme de 3 composantes, mais uniquement avec 1 seule
composante !


DarK Sidious
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
9
Date d'inscription
lundi 3 janvier 2005
Dernière intervention
11 janvier 2005
0
Merci
je comprends pas trop le coup de la matrice... menfin merci quand meme
et puis je me rends compte que je suis pas encore arriver là...

il faudrait que je puisse gérer le fait que lorsque je clique sur l'image, le programme réagisse et qu'il relève le niveau de gris du pixel selectionné...
Commenter la réponse de Bambi07
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
0
Merci
Pour détecter le niveau de gris d'un pixel, utilise la fonction GetPixel



En fait, cette matrice marche comme cà :



Pour traiter un pixel de coordonnée (x, y), il faut récupèrer les
intensités des pixels voisins, et définir la nouvelle intensité du
pixel courant selon la matrice que je t'ai donné. Cela permet de tracer
les contours des formes.

DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
9
Date d'inscription
lundi 3 janvier 2005
Dernière intervention
11 janvier 2005
0
Merci
ok merci pour l'explication sur la matrice...

oui en effet j'avais trouvé la fonction GetPixel et j'ai l'intention de m'en servir, mais ce que je ne trouve pas c'est comment faire pour étudier le pixel que je viens de sélectionner en cliquant avec la souris. en gros, les coordonnées qu'on donne à GetPixel doivent être celles de ce pixel sélectionné.
Commenter la réponse de Bambi07
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
0
Merci
Utilise la fonction GetCursorPos pour récupèrer la position de ta
souris à l'écran, puis utilise la fonction ScreenToClient pour
récupèrer des coordonnées clientes à partir des coordonnées écran.
Ainsi, tu pourras savoir où se trouve la souris dans ton image.

DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
9
Date d'inscription
lundi 3 janvier 2005
Dernière intervention
11 janvier 2005
0
Merci
merci, ca va bien m'aider
ScreenToClient a 2 paramètre. le 1er me pose un prob : c le handle (je ne comprend pas bien ce que c) de la fenetre et je ne sais pas koi y mettre (je sai que pour l'écran c'est : m_hDC)....

et puis, je voudrais récupérer les informations sur les coordonnées du curseur seulement lorsque je fait un clique gauche. comment je peux faire missieur, siouplai ?
Commenter la réponse de Bambi07
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
0
Merci
Le plus simple reste d'intercepter le message LBUTTONDOWN, de plus, le
handler de ce message permet de récupèrer les coordonnées de la souris
par le paramètre point :



void CtestgraphDlg::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO : ajoutez ici le code de votre gestionnaire de messages et/ou les paramètres par défaut des appels



CDialog::OnLButtonDown(nFlags, point);

}


Donc crée une fonction interceptant le message WM_LBUTTONDOWN sur le
contrôle de ton choix, et elle se déclenchera uniquement lorsque
l'utilisateur cliqueras du bouton gauche de la souris sur le contrôle
voulu.


DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
9
Date d'inscription
lundi 3 janvier 2005
Dernière intervention
11 janvier 2005
0
Merci
void CprojetView::OnLButtonDown(UINT nFlags, CPoint point)
{
CprojetDoc* pDoc = GetDocument();

if(!pDoc->GetImage()->IsNull())
{
......

}
CView::OnLButtonDown(nFlags, point);
}

comme ca j'arrive à faire réagir le programme quand je clique et qu'il y a une image affichée.
merci.

mai je sai pas koi mettre a la place des ..... pour récupérer des infos pour les utiliser dans ma classe pour traiter mon image...
et je ne sai pas comment intercepter le mess WM_LBUTTONDOWN (je me rappelle avoir vu un truc de ce genre en TP mais je me souvien pas où, quel cancre je suis !)
Commenter la réponse de Bambi07
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
0
Merci
Pour intercepter le message WM_LBUTTONDOWN,
il te faut passer par le ClassWizard, mais normalement tu l'as fait
puisque tu as intégrer la fonction handler dans ton code !



Entre le ... il faut parcourir les pixels un à un et leur appliquer la
matrice, donc il faut parcourir ton image ligne par ligne pour chaque
colonnes, et appliquer la matrice à chaque pixel parcourut.


DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
9
Date d'inscription
lundi 3 janvier 2005
Dernière intervention
11 janvier 2005
0
Merci
je parcours les pixels... mais je comprends pas comment tu peux appliquer ta matrice (j'ai relu ta soucre en VB mais ça ne m'a pas aidé à comprendre...)
d'ailleurs je ne comprends pas à QUOI tu applique la matrice....

désolé de poser autant de question , mais j'ai vraiment besoin d'aide et je suis vraiment nul en prog... (quel bande de sadiques ces prof de prog de nous filer des projets au delà de nos compétences !!)
Commenter la réponse de Bambi07
Messages postés
9
Date d'inscription
lundi 3 janvier 2005
Dernière intervention
11 janvier 2005
0
Merci
ok merci à toi Dark Sidious
je devrai m'en sortir à peut près maintenant.
Que la force soit avec toi :-P
Commenter la réponse de Bambi07
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
0
Merci
Ah ben non, la force n'est pas avec moi justement ! ;)



Content d'avoir pu t'aider

DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
7
Date d'inscription
jeudi 3 février 2005
Dernière intervention
21 août 2006
0
Merci
Salut...
Je dois faire un projet assez similaire et je ne comprend pas a quoi correspond Image.hDC dans cette expression Pixel1 = GetPixel(Image.hDC, i-1, j-1);
vosu pourriez m aidez svp?
merci d avance
Commenter la réponse de KryztL
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
0
Merci
Cela correspond au handle de DC stockant ton image.

DarK Sidious

Administrateur et reponsable VB/API du site www.ProgOtoP.com
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
1
Date d'inscription
lundi 4 juillet 2005
Dernière intervention
5 juillet 2005
0
Merci
Bonjour ...
désolé pour le retard mais un probleme similaire
mon projet est detecter en temps réel la position du centre de gravité d'un joueur de tennis. il faut calculer ses coordonnées x et y.
je pense à faire une segmentation ou binairisation pour avoir les pixels du joueur à 1 et le fond d'ecran à 0 mais je sais pas comment faire en programmation etant un debutant et quel langage utilisé pour traiter le flux video.

merci de me répondre le plus vite possible car j'ai vraiment besoin de vos aides
Commenter la réponse de cs_Oussaama
Messages postés
10
Date d'inscription
mercredi 7 avril 2010
Dernière intervention
22 septembre 2010
0
Merci
bonjour, je veux savoir comment detecter le contour d'une image et mettre sa contour en vert par exemple en c#
merci;
Commenter la réponse de MILAHA13

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.