• Aucun résultat trouvé

Combien d’objets dans une image?

N/A
N/A
Protected

Academic year: 2022

Partager "Combien d’objets dans une image?"

Copied!
34
0
0

Texte intégral

(1)

Combien d’objets dans une image?

Jean-Jacques L évy

INRIA

(2)
(3)
(4)
(5)
(6)
(7)

pixels

800

1200 1Mpix

10 6

(pictures elements)

(8)

Problème et Algorithme

(9)

Qu’ est ce qu’un objet?

• ensemble de pixels contigus similaires

-

similaire ?

• simplification

-

images niveau de gris (255 valeurs)

-

0 = noir, 255 = blanc

-

similaires = contigus avec valeurs voisines

• donner un numéro différent à chaque objet

• le nombre d’objets est le numéro max

(10)

Étiquetage

15 objets dans cette figure 1

1

2 3

4 5 6

7

8 9

10

11 12

13 14

(11)

Algorithme naïf

1) choisir un point non parcouru

2) parcourir tous les pixels connexes similaires

3) et recommencer tant qu’il y a un point non parcouru

Complexité élevée:

-

trouver un pixel non parcouru

-

explorer la zone connexe (quelle direction?)

(12)

Algorithme

1) première passe

-

balayer les pixels en donnant un nouveau numéro à tout nouvel objet

2) deuxième passe

-

générer les équivalences dues aux contiguités découvertes au cours du balayage

3) troisième passe

-

compter le nombre de classes d’équivalence

Complexité:

-

parcourir 2 fois l’image (coût linéaire)

-

gérer efficacement les classes d’équivalences

(13)

Animation

système Polka d’animation d’algorithmes

(14)

Classes d’équivalence

(15)

Classes d’équivalences

“Union-Find”

objets

• équivalences

• trouver la classe de x

1

, x

2

, ... , x

n

x

p

• 3 opérations:

-

- -

NEW(x ) FIND(x )

UNION(x , y )

nouvel objet

trouver représentant canonique fusionner 2 classes d’équivalence

(16)

Classes d’équivalences

“Union-Find”

• 3 opérations:

-

- -

NEW(x ) FIND(x )

UNION(x , y )

nouvel objet

trouver représentant canonique fusionner 2 classes d’équivalence

• représentation par des listes chaînées

-

canonique en tête de liste

-

tous les éléments de la classe pointent sur lui

-

exemple:

x

7

= x

4

, x

1

= x

9

, x

5

= x

1

, x

5

= x

4

x

1

x

7

x

4

x

5

x

9

(17)

Classes d’équivalences

“Union-Find”

• opération délicate

-

UNION(x , y )

fusionner 2 classes d’équivalence

x

1

x

7

x

4

x

5

x

9

x

3

x

2

x

6

x

3

x

2

x

6

x

9

x

1

x

7

x

4

x

5

opérations

O (n)

(18)

Classes d’équivalences

“Union-Find”

• opération délicate

-

UNION(x , y )

fusionner 2 classes d’équivalence

x

1

x

7

x

4

x

5

x

9

x

3

x

2

x

6

x

1

x

7

x

4

x

5

x

9

x

2

x

6

x

3

opérations

O (log n)

(19)

Classes d’équivalences

“Union-Find”

• avec une arborescence x

9

x

7

x

5

x

10

x

1

x

4

x

2

x

6

x

3

x

8

x

11

x

12

x

13

• représentée par le tableau des ancètres directs:

7 9 9 7

9

0 2 11 1 2 8 8 13 8

père

(20)

Classes d’équivalences

“Union-Find”

• la fusion crée des déséquilibres

-

UNION(x , y )

fusionner 2 classes d’équivalence

x

9

x

7

x

5

x

10

x

1

x

4

x

3

x

8

x

11

x

12

x

13

x

6

x

2

x

6

= x

13

(21)

Classes d’équivalences

“Union-Find”

• équilibrer l’arborescence

-

UNION(x , y )

fusionner 2 classes d’équivalence

x

9

x

7

x

5

x

10

x

1

x

4

x

3

x

8

x

11

x

12

x

13

x

6

x

2

il suffit de maintenir la hauteur des arbres dans chaque noeud opérations pour

O (log n)

FIND(x)

(22)

Classes d’équivalences

“Union-Find”

• compression du chemin vers le canonique

-

FIND(x )

a un effet de bord sur l’arborescence

x

9

x

7

x

5

x

10

x

1

x

4

x

6

x

2

x

9

x

7

x

5

x

10

x

1

x

4

x

6

x

2

FIND(x

4

)

(23)

Classes d’équivalences

“Union-Find”

• la programmation de la compression est récursive

ZZZ: écrire cette fonction sans récursion est bien plus délicat

function FIND (x) =

if pere[x] == x then return x;

else {

int y = FIND (pere[x]);

pere[x] = y;

return y;

};

(24)

Classes d’équivalences

“Union-Find [R. Tarjan]”

• Si on fusionne en équilibrant et si on trouve le

canonique en compressant les chemins d’accès, la complexité pour opérations est m O (α(m , n))

où la fonction d’Ackermann A(m, n) est définie par

D’où α(m, n) ! 4

la fonction d’Ackermann croit plus vite que toutes les fonctions récursives primitives (i.e. les programmes avec des boucles for)

α(m, n) = min { i | i 1, A(i , " m/n # ) > log n }

A(0, n) = n + 1

A(m, 0) = A(m 1, 1)

A(m, n) = A(m 1, A(m , n 1)

(25)

Complexité

1) première passe

-

balayer les pixels en donnant un nouveau numéro à tout nouvel objet

2) deuxième passe

-

générer les équivalences dues aux contiguités découvertes au cours du balayage

3) troisième passe

-

compter le nombre Soit

O (N )

O (N )

de classes d’équivalence

k N

le nombre de pixels

O (N × α(N , k ))

(26)

Démo

(27)

Programme

(28)

Programme

(29)

Programme

(30)

Programme

(31)

Programme

Union-Find = 8 lignes

Programme entier = 246 lignes

(32)

Conclusion

(33)

Conclusion

• Derrière d’anodins problèmes, il y a des algorithmes ou des fonctions logiques intéressants

• Le problème algorithmique ne représente qu’une infime partie du programme (ici 3%)

• Les techniques de programmation s’apprennent (récursion, utilisation des bibliothèques, structuration du programme). Cela prend du temps de les maitriser.

• C’est amusant ...

(34)

Références

Documents relatifs

Prouver un algorithme à l’aide d’un invariant de boucle : c’est une propriété qui si elle est vraie en début de boucle, reste vraie en fin de boucle.. Connaître le principe

Il faudrait que le paramètre se comporte comme une « variable à laquelle on peut donner une valeur

Le concept de module a été introduit comme unité de3. structuration pour les programmes de taille importante mettant en œuvre

Le programmeur doit instancier ce package générique afin de créer un nouveau package spécialisé pour le type énuméré considéré!. Un package ainsi créé par instanciation

Chapitre 4 : Listes chaînées Mise à

Chaîne formée, de gauche à droite, de la valeur!. des feuilles

[r]

[r]