Tracer les contours d'une image

Soyez le premier à donner votre avis sur cette source.

Vue 11 423 fois - Téléchargée 1 051 fois

Description

Une petite source pour moustachu et ennixo.

Moustachu voulait savoir comment appliquer un antialiasing aux contours d'une image, alors que ennixo ne me coryait pas que c'est aussi facile de tracé un contour.

Donc, voici ma réponde : pour tracé les contours d'une image, il suffit d'appliquer deux matrices :
1 0 -1
1 0 -1
1 0 -1

puis
1 1 1
0 0 0
-1 -1 -1

Ce qui donne au final l'application d'une matrice
2 1 0
1 0 -1
0 -1 -2

Le code n'est pas trop compliqué, il se base sur ma classe de gestion d'image, donc le code sera bien plus rapide en compilé qu'en interprêté !

Source / Exemple :


Private Sub cmdTrace_Click(Index As Integer)

'déclaration des variables privées
Dim oGestionImageSrc As New CGestionImage
Dim oGestionImageDest As New CGestionImage
Dim iFor1 As Integer 'stocke les valeurs de la boucle For->Next
Dim iFor2 As Integer 'stocke les valeurs de la boucle For->Next
Dim iBleu As Byte 'stocke la composante bleue à récupèrer
Dim iVert As Byte 'stocke la composante verte à récupèrer
Dim iRouge As Byte 'stocke la composante rouge à récupèrer
Dim iBleuCouleur As Double 'stocke la composante bleue à appliquer
Dim iVertCouleur As Double 'stocke la composante verte à appliquer
Dim iRougeCouleur As Double 'stocke la composante rouge à appliquer
    
    'on définit les contrôles sources et destination
    Set oGestionImageSrc.PictureBox = pctSource
    Set oGestionImageDest.PictureBox = pctDest

    'on parcourt les pixels 1 à 1 et on applique une matrice de tracé de contour
    For iFor1 = 0 To pctDest.ScaleWidth
    
        For iFor2 = 0 To pctDest.ScaleHeight
        
            'on définit l'index du zoom sur X et Y
            Let iBleuCouleur = 0
            Let iVertCouleur = 0
            Let iRougeCouleur = 0
            
            'on définit la couleur du pixel courant à partir des pixels alentours
            Call oGestionImageSrc.GetPixelRGB(iFor1 - 1, iFor2 - 1, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur + iBleu * 2
            Let iVertCouleur = iVertCouleur + iVert * 2
            Let iRougeCouleur = iRougeCouleur + iRouge * 2
            Call oGestionImageSrc.GetPixelRGB(iFor1 + 1, iFor2 + 1, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur - iBleu * 2
            Let iVertCouleur = iVertCouleur - iVert * 2
            Let iRougeCouleur = iRougeCouleur - iRouge * 2
            Call oGestionImageSrc.GetPixelRGB(iFor1, iFor2 - 1, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur + iBleu
            Let iVertCouleur = iVertCouleur + iVert
            Let iRougeCouleur = iRougeCouleur + iRouge
            Call oGestionImageSrc.GetPixelRGB(iFor1, iFor2 + 1, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur - iBleu
            Let iVertCouleur = iVertCouleur - iVert
            Let iRougeCouleur = iRougeCouleur - iRouge
            Call oGestionImageSrc.GetPixelRGB(iFor1 - 1, iFor2, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur + iBleu
            Let iVertCouleur = iVertCouleur + iVert
            Let iRougeCouleur = iRougeCouleur + iRouge
            Call oGestionImageSrc.GetPixelRGB(iFor1 + 1, iFor2, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur - iBleu
            Let iVertCouleur = iVertCouleur - iVert
            Let iRougeCouleur = iRougeCouleur - iRouge
            
            If iBleuCouleur > 255 Then Let iBleuCouleur = 255
            If iVertCouleur > 255 Then Let iVertCouleur = 255
            If iRougeCouleur > 255 Then Let iRougeCouleur = 255
            If iBleuCouleur < 0 Then Let iBleuCouleur = 0
            If iVertCouleur < 0 Then Let iVertCouleur = 0
            If iRougeCouleur < 0 Then Let iRougeCouleur = 0
            
            If Index = 0 Then

                'contour + image
                Let iVertCouleur = Abs(iVertCouleur - iVert)
                Let iBleuCouleur = Abs(iBleuCouleur - iBleu)
                Let iRougeCouleur = Abs(iRougeCouleur - iRouge)

            End If
                        
            Call oGestionImageDest.SetPixelRGB(iFor1, iFor2, iRougeCouleur, iVertCouleur, iBleuCouleur)
            
            DoEvents
            
        Next iFor2
        
    Next iFor1
    
    Call oGestionImageDest.Refresh
    
End Sub

Conclusion :


Je ne pense pas mettre cette source à jour vu qu'il ne s'agit que d'une méthode pour tracer les contours d'une image.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
vanoise : je n'en ai aucune idée. Cette source n'est là que pour vous montrer comment tracer les contours d'une image, mais je n'ai jamais dit qu'elle était fiable à 100 %. C'est juste pour avoir un détourage grossier.

DarK Sidious
Messages postés
1
Date d'inscription
jeudi 20 janvier 2005
Statut
Membre
Dernière intervention
24 janvier 2005

Ma question est la suivante et ressemble un peu aux autres.
Si je dois tracer un cercle d epaisseur 2 pixels avec la methode de Bresenham.
Je trace en fait 2 cercles, 1 avec un rayou r, l autre r+1.
Ca marche ms sur un Display, il reste des points blancs car 4 pixels ne sont pas allumes a la bonne place. (Il y a 1 pixel d ecart)
Comment je fais pour tracer mon cercle et que tout reste noir?
Messages postés
224
Date d'inscription
samedi 25 janvier 2003
Statut
Membre
Dernière intervention
17 juin 2006

pour réaliser un bon anticrénelage une simple matrice ne suffit pas...

ce que je t'ai montré est un fake car je n'ai fait aucun algo d'anticrénelage, mais c t juste pour te montrer ce que ça doit faire.

et oui tu dis ici que c'est un tracé des contours mais ce qu'on t'avait demandé c'est un anticrénelage =)

bon aller joyeux noel, je reviendrai pas avant qqes jours =)
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
ennixo : je n'ai pas dit qu'il s'agissait d'un anticrénelage, mais du tracé des contours, ce n'est pas pareil !

Pour l'anticrénelage, voir ici :

http://www.vbfrance.com/code.aspx?ID=28386

Par contre, je n'obtiens pas tout à faire le même résultat que toi, mais le principe reste le même ! (j'obtiens un résultat meilleur dans certaines parties, et moins bon dans d'autres, car je ne dois pas utiliser la même matrice de flou !)

DarK Sidious
Messages postés
1079
Date d'inscription
jeudi 14 novembre 2002
Statut
Membre
Dernière intervention
1 janvier 2012

:'o), c'est noël je suis très ému ! Je vais voir comment tu traduis tes matrices pour te classes !

++
Moustachu
Afficher les 6 commentaires

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.