Salut,

Il existe plusieurs algorithmes de squelettisation d'images, je vais essayer de vous expliquer quelques uns, je commence par l'algorithme de Hilditch :


Considérons le voisinage suivant :

P1 P2 P3
P8 P P4
P7 P6 P5
Hilditch présente quatre conditions qu’un squelette doit remplir :

2 < = B(p1) < = 6
A(p1)=1
p2.p4.p8=0 ou A(p2)!= 1
p2.p4.p6=0 ou A(p4)!= 1


Avec :

B(p1) = nombre de voisins non nuls de P1.
A(p1) = nombre de passage de 0,1 de la séquence : P2,p3,p4,p5,p6,p7,p8,p1,p2

code C++
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
H=Image2->Picture->Bitmap->Height;
W=Image2->Picture->Bitmap->Width;
int Bp,Ap1,Ap2,Ap4;
for (int i=1;i<=nombreitération; i++)
{
for(int x=1;x<W;x++)
        for(int y=1;y<H;y++)
        {
        Bp=0;
        Ap1=0;
        Ap2=0;
        Ap4=0;
 
        if (Image2->Canvas->Pixels[x-1][y-1]==clBlack)Bp=Bp+1;
        if (Image2->Canvas->Pixels[x-1][y]==clBlack)Bp=Bp+1;
        if (Image2->Canvas->Pixels[x-1][y+1]==clBlack)Bp=Bp+1;
        if (Image2->Canvas->Pixels[x][y+1]==clBlack)Bp=Bp+1;
        if (Image2->Canvas->Pixels[x+1][y+1]==clBlack)Bp=Bp+1;
        if (Image2->Canvas->Pixels[x+1][y]==clBlack)Bp=Bp+1;
        if (Image2->Canvas->Pixels[x+1][y-1]==clBlack)Bp=Bp+1;
        if (Image2->Canvas->Pixels[x][y-1]==clBlack)Bp=Bp+1;
 
 
        if (Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x-1][y+1]==clBlack)Ap1=Ap1+1;
        if (Image2->Canvas->Pixels[x-1][y+1]==clWhite && Image2->Canvas->Pixels[x][y+1]==clBlack)Ap1=Ap1+1;
        if (Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y+1]==clBlack)Ap1=Ap1+1;
        if (Image2->Canvas->Pixels[x+1][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y]==clBlack)Ap1=Ap1+1;
        if (Image2->Canvas->Pixels[x+1][y]==clWhite && Image2->Canvas->Pixels[x+1][y-1]==clBlack)Ap1=Ap1+1;
        if (Image2->Canvas->Pixels[x+1][y-1]==clWhite && Image2->Canvas->Pixels[x][y-1]==clBlack)Ap1=Ap1+1;
        if (Image2->Canvas->Pixels[x][y-1]==clWhite && Image2->Canvas->Pixels[x-1][y-1]==clBlack)Ap1=Ap1+1;
        if (Image2->Canvas->Pixels[x-1][y-1]==clWhite && Image2->Canvas->Pixels[x-1][y]==clBlack)Ap1=Ap1+1;
 
 
        if (Image2->Canvas->Pixels[x-2][y]==clWhite && Image2->Canvas->Pixels[x-2][y+1]==clBlack)Ap2=Ap2+1;
        if (Image2->Canvas->Pixels[x-2][y+1]==clWhite && Image2->Canvas->Pixels[x-1][y+1]==clBlack)Ap2=Ap2+1;
        if (Image2->Canvas->Pixels[x-1][y+1]==clWhite && Image2->Canvas->Pixels[x][y+1]==clBlack)Ap2=Ap2+1;
        if (Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x][y]==clBlack)Ap2=Ap2+1;
        if (Image2->Canvas->Pixels[x][y]==clWhite && Image2->Canvas->Pixels[x][y-1]==clBlack)Ap2=Ap2+1;
        if (Image2->Canvas->Pixels[x][y-1]==clWhite && Image2->Canvas->Pixels[x-1][y-1]==clBlack)Ap2=Ap2+1;
        if (Image2->Canvas->Pixels[x-1][y-1]==clWhite && Image2->Canvas->Pixels[x-2][y-1]==clBlack)Ap2=Ap2+1;
        if (Image2->Canvas->Pixels[x-2][y-1]==clWhite && Image2->Canvas->Pixels[x-2][y]==clBlack)Ap2=Ap2+1;
 
 
        if (Image2->Canvas->Pixels[x-1][y+1]==clWhite && Image2->Canvas->Pixels[x-1][y+2]==clBlack)Ap4=Ap4+1;
        if (Image2->Canvas->Pixels[x-1][y+2]==clWhite && Image2->Canvas->Pixels[x][y+2]==clBlack)Ap4=Ap4+1;
        if (Image2->Canvas->Pixels[x][y+2]==clWhite && Image2->Canvas->Pixels[x+1][y+2]==clBlack)Ap4=Ap4+1;
        if (Image2->Canvas->Pixels[x+1][y+2]==clWhite && Image2->Canvas->Pixels[x+1][y+1]==clBlack)Ap4=Ap4+1;
        if (Image2->Canvas->Pixels[x+1][y+1]==clWhite && Image2->Canvas->Pixels[x][y+1]==clBlack)Ap4=Ap4+1;
        if (Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x][y]==clBlack)Ap4=Ap4+1;
        if (Image2->Canvas->Pixels[x][y]==clWhite && Image2->Canvas->Pixels[x-1][y]==clBlack)Ap4=Ap4+1;
        if (Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x-1][y+1]==clBlack)Ap4=Ap4+1;
 
 
        if (Bp>=2 && Bp<=6 && Ap1==1)
        {
        if ((Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x][y-1]==clWhite)|| (Ap2==1) )
        {
        if ((Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y]==clWhite)|| (Ap4==1) )
                {
                Image2->Canvas->Pixels[x][y]=clWhite;
                }
        }
        }
}
}

NB : Les objets dans l'image doivent être noirs ( je n'aime pas les fonds noirs )

A suivre....