Parcourir une image => StackOverFlow ...

Mrreivax Messages postés 100 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 26 juin 2010 - 26 juin 2010 à 16:54
Mrreivax Messages postés 100 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 26 juin 2010 - 26 juin 2010 à 17:42
Bonjour à tous!
J'ai un petit soucis, que je ne comprends pas trop...
Je suis sur une image Noir & Blanc. Je souhaiterai "remplir" à la manière de "Fill" une zone de pixels noires contiguës. Pour ce faire, j'utilise une méthode récursive qui parcoure les 4 pixels voisins (Haut, Bas, Gauche, Droite). Cela marche très bien, sauf qu'à partir d'un certain moment, j'ai un "StackOverflow", et je ne sais pas comment y remédier ...
Voilà le code qui m'embête:
    Dim curBitmap As Bitmap
    ' Les pixels voisins à ne pas tester
    Enum _cotes
        tous
        gauche
        droite
        bas
        haut
    End Enum
    ' Fonction récursive
    Sub recusiv(ByVal x As Integer, ByVal y As Integer, ByVal nepasfaire As _cotes)
        curBitmap.SetPixel(x, y, Color.Red)
        'PictureBox1.Image = curBitmap
        Application.DoEvents()
        ' A droite
        If nepasfaire <> _cotes.droite And isBlack(curBitmap.GetPixel(x + 1, y)) Then
            recusiv(x + 1, y, _cotes.gauche)
        End If
        ' A gauche
        If nepasfaire <> _cotes.gauche And isBlack(curBitmap.GetPixel(x - 1, y)) Then
            recusiv(x - 1, y, _cotes.droite)
        End If
        ' En bas
        If nepasfaire <> _cotes.bas And isBlack(curBitmap.GetPixel(x, y + 1)) Then
            recusiv(x, y + 1, _cotes.haut)
        End If
        ' En haut
        If nepasfaire <> _cotes.haut And isBlack(curBitmap.GetPixel(x, y - 1)) Then
            recusiv(x, y - 1, _cotes.bas)
        End If
    End Sub

    Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
        curBitmap = PictureBox1.Image
        recusiv(e.X, e.Y, _cotes.tous)
        PictureBox1.Image = curBitmap
        MsgBox("Fin !")
    End Sub

    ' Si le pixel est plus noir que blanc
    Function isBlack(ByVal c As Color) As Boolean
        If (c.R + c.G + c.B) / 3 < 100 Then
            Return True
        Else
            Return False
        End If
    End Function


Merci d'avance !


Xavier

2 réponses

raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
26 juin 2010 à 17:37
Salut, j'ai pas tout compris à ton code
mais il semble que ça donne une boucle infinie
puisque recusiv est appelée à chaque fois ?
Sinon qu'est ce que tu veux faire ?
Il y a peu être une autre méthode
que celle ci pour arriver à ton but ?
0
Mrreivax Messages postés 100 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 26 juin 2010 7
26 juin 2010 à 17:42
En fait, j'ai trouvé, il fallait "simplement" utiliser les piles
http://fr.wikipedia.org/wiki/Algorithme_de_remplissage_par_diffusion


Xavier
0
Rejoignez-nous