Algorithmique et Programmation Projets...

14
Algorithmique et Programmation Projets 2006/2007 G1: keriven(at)certis.enpc.fr G2: thorstensen(at)certis.enpc.fr G3: aganj(at)certis.enpc.fr G4: etyngier(at)certis.enpc.fr G5: segonne(at)certis.enpc.fr G6: chariot(at)certis.enpc.fr 1 Stéréo, Carte de Disparité et Reconstruction 3d 1.1 Introduction Lorsqu’on dispose de deux images, on parle d’images stéréo et il existe alors des techniques pour retrouver la troisième dimension afin de reconstruire un modèle 3d de la scène. L’objectif de ce projet est de réaliser un programme capable de reconstruire automatiquement un objet 3d [un visage par exemple] à partir d’images stéréo. 1.2 Préliminaires Nous allons réaliser ce projet par étapes successives. Commencez par ouvrir et afficher à l’aide des fonctions fournies et de la WinLib les images 1 RVleft.bmp (I 1 ) et RVright.bmp (I 2 ) dans une même fenêtre. RVleft.bmp correspond à une prise de vue légèrement par le bas du visage tandis que RVright.bmp à une prise de vue légèrement par le haut du visage. Ces images sont tournées pour des raisons pratiques. Deux points, l’un dans chacune des deux images seront dit correspondants s’ils représentent le même point réel. (voir les croix rouges dans la figure 1. Observez ensuite que pour tout point dans une image, son point correspondant se trouve sur la même ligne dans l’autre image . Une homographie a été appliquée aux deux images originales pour obtenir cette propriété. Le calcul de cette transformation sera effectuée dans une étape ultérieure de ce projet. La disparité d est l’écart entre deux points correspondants (fig.1 ). Elle va nous permettre de calculer la profondeur p = f *c 1 c 2 d de chaque pixel. f est la distance focale des caméras utilisées, c 1 c 2 est la distance entre les centres optiques de la position des deux caméras. FIG. 1 – A gauche : deux vues d’un visage. Le croix rouges désignent des points correspondants. A droite : La disparité est l’écart entre deux points correspondants. On essaie de trouver le correspondant dans la deuxième image par corrélation. Pour un pixel (x 1 ,y 1 ) de I 1 , on estime la "ressemblance" du pixel (x 2 ,y 2 ) de I 2 . Pour cela, on compare les valeurs des pixels autour de (x 1 ,y 1 ) et de (x 2 ,y 2 ). Plus précisément, on mesure la corrélation entre deux “fenêtres” autour de ces points. On définit par étapes la corrélation C 12 : 1 toutes les données se trouvent dans le répertoire Data 1

Transcript of Algorithmique et Programmation Projets...

Page 1: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

Algorithmique et Programmation—

Projets 2006/2007—

G1: keriven(at)certis.enpc.fr G2: thorstensen(at)certis.enpc.frG3: aganj(at)certis.enpc.fr G4: etyngier(at)certis.enpc.frG5: segonne(at)certis.enpc.fr G6: chariot(at)certis.enpc.fr

1 Stéréo, Carte de Disparité et Reconstruction 3d

1.1 Introduction

Lorsqu’on dispose de deux images, on parle d’images stéréo et il existe alors des techniques pour retrouverla troisième dimension afin de reconstruire un modèle 3d de la scène. L’objectif de ce projet est de réaliser unprogramme capable de reconstruire automatiquement un objet 3d [un visage par exemple] à partir d’imagesstéréo.

1.2 Préliminaires

Nous allons réaliser ce projet par étapes successives. Commencez par ouvrir et afficher à l’aide des fonctionsfournies et de la WinLib les images1 RVleft.bmp (I1) et RVright.bmp (I2) dans une même fenêtre. RVleft.bmpcorrespond à une prise de vue légèrement par le bas du visage tandis que RVright.bmp à une prise de vuelégèrement par le haut du visage. Ces images sont tournées pour des raisons pratiques. Deux points, l’undans chacune des deux images seront dit correspondants s’ils représentent le même point réel. (voir les croixrouges dans la figure 1. Observez ensuite que pour tout point dans une image, son point correspondant setrouve sur la même ligne dans l’autre image . Une homographie a été appliquée aux deux images originalespour obtenir cette propriété. Le calcul de cette transformation sera effectuée dans une étape ultérieure de ceprojet. La disparité d est l’écart entre deux points correspondants (fig.1 ). Elle va nous permettre de calculer laprofondeur p = f∗c1c2

d de chaque pixel. f est la distance focale des caméras utilisées, c1c2 est la distance entreles centres optiques de la position des deux caméras.

FIG. 1 – A gauche : deux vues d’un visage. Le croix rouges désignent des points correspondants. A droite : Ladisparité est l’écart entre deux points correspondants.

On essaie de trouver le correspondant dans la deuxième image par corrélation. Pour un pixel (x1, y1) deI1, on estime la "ressemblance" du pixel (x2, y2) de I2. Pour cela, on compare les valeurs des pixels autour de(x1, y1) et de (x2, y2). Plus précisément, on mesure la corrélation entre deux “fenêtres” autour de ces points.On définit par étapes la corrélation C12 :

1toutes les données se trouvent dans le répertoire Data

1

Page 2: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

– Moyennes :

Ii(xi, yi) =1

(2N + 1)2

N∑

u=−N

N∑

v=−N

Ii(xi + u, yi + v)

– Produit scalaire :

〈Ii, Ij〉(xi, yi, xj , yj) =1

(2N + 1)2

N∑

u=−N

N∑

v=−N

(Ii(xi + u, yi + v)− Ii(xi, yi))

(Ij(xj + u, yj + v)− Ij(xj , yj))

– Norme :|Ii|(xi, yi) =

√〈Ii, Ii〉(xi, yi, xi, yi)

– Corrélation-croisée normalisée :

C12(x1, y1, x2, y2) =〈I1, I2〉(x1, y1, x2, y2)|I1|(x1, y1)|I2|(x2, y2)

qui vérifie −1 ≤ C12 ≤ 1 (ce qui est un bon test de correction du programme !)Pour un point (x1, y1), on pourrait choisir alors comme point correspondant le point (x2, y2) maximisant lacorrélation C12(x1, y1, x2, y2). Dans notre cas la recherche se reduit le long d’une ligne et on cherche donc àmaximiser C12(x1, y, x2, y) où y est fixé par le pixel de I1.Commencez par programmer les deux fonctions suivantes :

1. La corrélation C12(x1, y, x2, y)

2. La correspondance qui pour un pixel p1 dans I1 renvoie son pixel correspondant p2 ainsi que la valeurde corrélation.

Conseils : Pensez à utiliser le type Pixel de la WinLib. Testez ces fonctions en permettant à l’utilisateur decliquer sur n’importe quel pixel de I1 et affichant le pixel correpondant dans I2. Prendre N = 5 (en constante)pour la taille de la fenêtre de corrélation.

1.3 Carte de disparités

L’objectif est à présent de calculer la disparité et la pofondeur pour tous les pixels de l’image. Calculer ladisparité des pixels dans l’ordre ne permet pas d’obtenir des resultats convenables. Il faut d’abord commencerpar les points pour lesquels disparité est fiable et propager le calcul aux voisins en utilisant les disparités déjàconnues.Dans le répertoire Data, vous trouverez un fichier graines.txt qui contient des coordonnées de points dans I1

2.Utilisez les fonctions standards pour lire le fichier et construire une liste de graine (=pixel). Les graines sontdes points qui ont le meilleur taux de corrélation et donc pour lesquels la valeur de la disparité sera d’autantplus fiable. (Ces points devront être calculés dans une étape ultérieure de ce projet.)On procède de la manière suivante :

1. Pour chaque graine gi = pi1 dans I1, on calcule le pixel pi

2 correspondant dans I2,la disparité est notédi = pi

2 − pi1. On note V(gi) l’ensemble des pixels voisins de gi.

2. Pour chaque pixel pk1 ∈ V(gi), le correspondant pk

2 dans I2 est tel que

pk2(x) = pi

2(x) + (pi1(x)− pk

1(x)) + l

où l est choisi pour maximiser la corrélation entre pk1 et pk

2 , avec |l| <= v. En d’autre termes la variationde disparité est bornée : |di − dk| <= v où dk est la disparité du pixel pk (prendre v = 1 pixel).

3. Ajouter pk1 dans la liste des graines (en queue !)

4. Itérer tant que la liste des graines n’est pas vide

Conseils : utilisez le type plist pour les listes. Utilisez le type dimage pour construire une carte de corrélationainsi qu’une carte de disparité. Pensez à afficher le resultat dans une fenêtre WinLib. Pour les images fournies :initialisez la disparité pour tous les points à une disparité −30.

2Le nombre de point est indiqué à la première ligne

2

Page 3: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

1.4 Calcul des graines initiales

On extrait des points particuliers caractéristiques dans I1, par exemple les “coins”, en utilisant le détecteurde Harris.

– Soit I(x,y) la luminosité du pixel (x,y)– A(x, y) = ∂I

∂x (x, y)2

– B(x, y) = ∂I∂y (x, y)2

– C(x, y) = ∂I∂x (x, y)× ∂I

∂y (x, y)– A, B et C des lissages de A, B et C.

– M(x, y) =(

A C

C B

)

– H(x, y) = det(M)− k tr(M) où k est une constante (k = 0.04 marche bien !)– Les “coins” sont les maxima locaux de H de valeur supérieure à un certain seuil (prendre 100 par

exemple)Pour chacun de des points de Harris trouvé, calculer son correspondant et garder ceux pour lesquels la corré-lation dépasse un seuil de corrélation haut (0.95 par exemple). Le résultat sera évidemment stocké dans uneliste.

1.5 Carte de profondeur & visualisation

On souhaite visualiser le résultat en 3d à l’aide d’une carte de profondeur. Avant de calculer cette dernière,il faut seuiller la carte de disparité entre des valeurs smin et smax, telles que |smin| < |smax|. Le premier seuilpermet d’éviter de représenter la profondeur des points qui constituent le fond de l’image dont la disparitéest très faible. Les disparités dont les valeurs dépassent le second seuil sont considérées comme des erreursà supprimer. On écrit E = {j, dj > |smax|, dj < |smin|} et donc on seuille la carte de disparité de la manièresuivante :

∀j′ ∈ E dj′ = smin

Construire un ensuite un tableau de point 3d Point* tabPoints à l’aide de la carte de profondeur et un tableaude couleurs Color* tabColor à l’aide des images originales.Pour visualiser le résultat, il suffira d’utiliser le bout de code suivant :

// On créee une triangulation 2D sur l’image originale de// dimension w*h

for (int j=0; j<h-1; j++)for (int i=0; i<w-1; i++){tabTri[2*(i+(w-1)*j)] = Triangle(i+w*j, i+1+w*j, i+w*(j+1));tabTri[2*(i+(w-1)*j)+1] = Triangle(i+1+w*j, i+1+w*(j+1), i+w*(j+1));}

// Création & affichage du maillage

Mesh maillage(tabPoints, w*h, tabTri, (w-1)*(h-1)*2,PointColor, GuessNormals);

maillage.SetColors(tabColor);

Window Ww=OpenWindow(w, h, "visage en 3D", Window3D);UseWindow(Ww);ShowMesh(maillage);

Conseils : pour les images fournies : f = 47, c1c2 = 249, smin = −30, smax = −55Utilisez le type Point de la WinLib.

1.6 Amélioration du résultat

Proprosez et implémentez une méthode pour améliorer le résultat. On pourra par exemple lisser la surface.

1.7 Rectification

Pour continuer le projet, il faut ajouter 4 fichiers dans le projet Images que vous pourrez trouver à l’adressesuivante : http://cermics.enpc.fr/~etyngier/info_algo_06_07.html. Des informations complé-

3

Page 4: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

FIG. 2 – Résultats que vous devriez obtenir

mentaires qui vous seront utiles se trouvent sur la page.Nous avons observé dans la partie précédente de ce projet que pour tout point dans une image, son point correspon-dant se trouve sur la même ligne dans l’autre image. Une telle propriété est rendu possible après avoir appliqué unehomographie aux deux images orinigales (face00.gif et face01.gif ). Utilisez la fonction de rectification suivantepour trouver les transformations à appliquer à chaque image : bool rectification(const mat &matrice_fondamentale,int W, int H, mat & H1, mat & H2) La fonction prend en argument une matrice (3 × 3) appelée matrice fonda-mentale. Elle caractérise la géométrie de la position des caméras à partir de laquelle nous pouvons retrouverles transformations H1 et H2 à appliquer respectivement aux images 1 et 2. W et H correspondent aux dimen-sions de l’image. Transformez ensuite les images 1 et 2 Pour le couple d’images face00.gif et face01.gif, la ma-trice fondamentale est à récupérer sur ce lien : http://cermics.enpc.fr/~etyngier/Info/matrice_fondamentale_RV.txt

1.8 Estimation de la matrice fondamentale

Afin de pouvoir reconstruire d’autres visages en 3d, il faut pouvoir estimer la matrice fondamentale à partird’un couple quelconque de deux images . L’estimation se fait à partir de points correspondants. Commencezpar ré-utiliser le detecteur de Harris [première partie] et adapter votre fonction de corrélation pour trouver despoints caractéristiques dans les deux images ainsi que leur correspondants.On note les k points correpondants trouvés {(ui, vi) , (u′i, v

′i)}i=1,...,k où (ui, vi) sont les coordonnées dans

l’image 1 et (u′i, v′i) les coordonnées dans l’image 2. Chacun de ces points doivent vérifier l’équation m′

iFmi =0 où m′

i = [ui, vi, 1]T , m′i = [u′i, v′i, 1]T et F est la matrice fondamentale de dimension 3× 3.

Pour estimer F il faut d’abord réécrire l’équation m′iFmi = 0 sous la forme suivante : uT

i f = 0 avec

ui = [uiu′i, viu

′i, u

′i, uiv

′i, viv

′i, v

′i, ui, vi, 1]T

etf = [F11, F12, F13, F21, F22, F23, F31, F32, F33]

T

Fij est l’élément de la ligne i et de la colonne j de F

2 Blending, Graph Cut

2.1 Objectif

Le but de ce projet est d’implémenter un algorithme de Blending permettant de fusionner deux images enutilisant une technique à base de la méthode des Graph Cuts. L’idée de l’algorithme est de copier une partied’une image sur l’autre image en essayant de créer une transition entre les deux images la plus invisiblepossible pour l’œil.

4

Page 5: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

FIG. 3 – Construction du graphe

2.2 Approche

On considère les trois régions suivantes :– la région où l’image A est seule– la région où les deux images se recouvrent– la région où l’image B est seuleL’objectif est de couper la région de l’intersection en deux sous-régions disjointes de telle sorte à ce que

leur frontière soit la plus discrète possible sur l’image de sortie. Trouver la partition optimale de cette régionrevient à trouver une coupe minimale (ce qui revient à chercher un flot maximum) sur le graphe construit dela manière suivante :

Les noeuds :– un nœud source qui représente l’image A– un nœud puits qui représente l’image B– un nœud pour chaque pixel de la région d’intersection entre les deux imagesLes arêtes :– une arête de poids |A(s)−B(s)|+ |A(t)−B(t)| entre deux sommets s et t représentants des pixels voisins,

où A(x) (resp. B(x)) est la couleur du pixel x dans l’image A (resp. l’image B)– une arête de poids infini entre la source (resp. le puis) et les nœuds représentants les pixels voisins de

l’image A (resp. l’image B).Le problème de la coupe minimale est de partitionner l’ensemble des sommets en deux partie C et D tels

que la source soit dans C, le puit dans D et que la somme des poids des arêtes faisant office de frontière entre lesdeux parties soit minimale. Pour trouver cette partition on utilise la méthode des Graph Cuts. Pour construirel’image résultat il suffit de conserver telles quelles les régions où les images A ou B sont seules et de recopieruniquement le pixel d’une des deux images sur la région de superposition selon que le nœud correspondantest relié à la source ou au puit dans le résultat des Graph Cuts.

2.3 A faire

Implémentation de l’algorithme de Blending en utilisant la bibliothèque de Graph Cuts pour trouver lacoupe minimale. Pour la manipulation des images, on utilisera la Winlib.

2.4 Liens utiles

Pour une présentation complète de l’algorithme, et des exemples graphiques :– http://cpl.cc.gatech.edu/projects/graphcuttextures/

3 Pacman

3.1 Objectif

Il s’agit de programmer un jeu de PacMan dans lequel le PacMan et les fantômes sont des acteurs, êtresautonomes agissant chacun de leur côté. Les règles seront les suivantes :

– Le terrain possède un passage secret reliant la gauche et la droite du labyrinthe (cf. figure 4). Quatrevitamines sont placées au hasard.

– Il y a un PacMan et quatre fantômes.– Quand le PacMan a mangé toutes les "gommes" et les "vitamines", un nouveau tableau commence.– Quand le PacMan mange une des quatre "vitamines", alors il peut manger les fantômes et les fantômes

n’avancent qu’un coup sur deux, et ce pendant 35 tours de jeu.

5

Page 6: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

FIG. 4 – Le terrain de jeu.

– Au début de chaque tableau, les fantômes sont placés dans leur "repère", comme sur la figure. Ils y sontreplacés après s’être fait manger. On ne peut pas rentrer dans le repère, mais seulement en sortir.

– Le PacMan possède 5 vies.– Points marqués :

– gomme : 10 points– vitamine : 50 points– fantôme : 200 puis 400 puis 800 puis 1600 points (au cours de la même prise de vitamine).– tableau entier : 500 points

3.2 Structuration du travail

Dans le but de pouvoir faire se rencontrer les programmes des différents binômes, on séparera le source ensix : jeu.cpp qui contiendra main() et le programme central qui s’occupera de l’affichage et de la gestiondu jeu, pacman.cpp/pacman.h qui contiendront le PacMan, fantome.cpp/fantome.h qui contiendrontles fantômes, et enfin jeu.h qui contiendra les déclarations communes. C’est le programme central qui estresponsable du respect des règles, qui compte les points, etc. Notamment :

– Les acteurs connaissent la configuration du terrain (murs) a leur naissances, mais pas son état (gommes,vitamines, position des autres acteurs).

– Ils ne voient ni à travers les murs, ni à travers les autres acteurs.– C’est le jeu qui leur permet d’avancer d’un cran, qui les renseigne sur ce qu’ils voient, qui les fait naître

et mourir, etc.– Les fantômes ne distinguent pas les vitamines des gommes.

3.3 Travail à fournir

La solution de départ fournie comporte déjà toute la programmation du jeu et de l’affichage graphique.Votre travail consiste à programmer des acteurs performants. Cela nécessitera dans un premier temps de com-prendre le fonctionnement de la boucle de jeu, les structures et variables qu’elle utilise, les informations qu’elletransmet aux acteurs et le retour qu’elle en attend.

La programmation des acteurs se fera dans les fichiers pacman.cpp/pacman.h et fantome.cpp/fantome.h.En aucun cas vous ne devrez altérer ou modifier les fichiers jeu.cpp et jeu.h. Le respect de ce périmètrepermettra au terme du projet de faire s’affronter PacMan et fantômes des différents binômes entre eux.

Que le meilleur gagne ! ! !

4 Asteroids

1. Modèle : un des tous premiers "jeux de café", bien avant PacMan : Asteroids (Fig. 5) :

6

Page 7: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

FIG. 5 – Asteroids

– Page WEB : http://www.programurl.com/asteroids-extreme.htm– Progamme : http://www.chunkypig.com/games/download/asteroids_extreme.exe– Touches : les flèches, la barre d’espace, mais aussi Shift.

2. A faire au minimum :– Gérer l’inertie.– Un tir à la fois.– Des astéroïdes que ne se coupent pas en deux.

3. A faire éventuellement :– Des astéroïdes qui se divisent.– Des tirs multiples.– L’hyper-espace (touche Shift )– La soucoupe volante.– Gestion des scores.

4. Techniquement :– Utiliser la WinLib : penser au paramètre XOR des tracés de ligne.

5 Vie/Abeilles

5.1 Jeu de la vie

5.1.1 Description

Il s’agit d’un automate cellulaire inventé par le mathématicien John Conway en 1970, décrivant l’évolu-tion d’une population selon des règles simples. On considère un réseau rectangulaire 2D de cellules, chacunepouvant être vide ou occupée. L’évolution du système se fait en temps discret, en suivant simultanément lesrègles :

– Naissance : une cellule vide se remplit à l’instant suivant si elle a exactement 3 voisins parmis les 8cellules environnantes (naissance dans un environnement optimal).

– Survie/mort : une cellule occupée se vide à l’instant suivant si elle n’a pas exactement 2 ou 3 voisins(mort liée à la désertification ou à la surpopulation).

5.1.2 Objectifs

Implémenter le jeu de la vie, puis charger depuis des fichiers de données des configurations initiales. Éven-tuellement implémenter la version 3D du jeu de la vie. Trouver toutes les configurations initiales qui mènentà une évolution périodique sans jamais avoir plus de n cellules occupées, sans quitter une certaine zone ou enmoins de p de pas de temps. Trouver les motifs de moins de n cellules, qui, en moins de p pas de temps, seretrouvent translatés.

5.2 L’essaim d’abeilles

5.2.1 Description

Faire évoluer un essaim d’abeilles poursuivant le curseur ou un objet se déplaçant aléatoirement (en l’occu-rence dont l’accélation est aléatoire, bornée, de loi uniforme sur la plage de valeurs autorisées). Le mouvementdes abeilles est régi de la façon suivante : l’accélération de chaque abeille est constante en norme et est pointéevers la position de l’objet à suivre, mais on seuille en plus la norme de la vitesse.

7

Page 8: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

FIG. 6 – Une configuration menant à une évolution périodique.

5.2.2 Objectifs

Implémenter le mouvement des abeilles. Régler correctement les paramètres. Ajouter régulièrement unpeu de bruit dans les vitesses des abeilles. Garder à l’écran la trace des n dernières positions de chaque abeille(pour faire plus joli), avec des couleurs évoluant avec le temps..

6 Morphing 2D

FIG. 7 – Morphing

On se donne deux images A et B. On souhaite passer de manière "continue" de l’une à l’autre. On cherchedonc à définir une suite d’image C(t) telle que C(0) = A et C(1) = B. Supposons que l’on dispose de deuxfonctions :

ft : C(t) → A

gt : C(t) → B

qui, à chaque pixel P de C(t), associent un pixel ft(P ) de A et un pixel gt(P ) de B, alors on peut définirl’intensité du pixel P de C(t) par

P = (1− t) ft(P ) + t gt(P ).

La difficulté est donc de trouver les fonctions ft et gt qui associent des points qui semblent se correspondre.Pour cela, on va demander à l’utilisateur d’indiquer une grille sur chaque image initiale A et B (Fig. 7).

Ces grilles vont guider la transformation. Soit (ai,j)1≤i,j≤n les points constituant la grille sur A, et (bi,j)1≤i,j≤n

pour celle sur B. On a donc ai,j qui "correspond"’ à bi,j pour tout (i, j).Soit t ∈ [0, 1], on veut remplir l’image C(t), c’est-à-dire définir une fonction φC qui à chaque pixel de C(t)

associe une valeur (une intensité, une couleur). On commence par définir une grille sur C(t) par :

ci,j = (1− t) ai,j + t bi,j , 1 ≤ i, j ≤ n

Soit P un point de C(t), on veut définir φC(t).– si P = ci,j , φC(P ) = (1− t) φA(ai,j) + t φB(bi,j)– si P n’est pas sur la grille, on cherche dans quelle "case" de la grille il est, puis on cherche à quel point de

la case correspondante sur A on va l’associer (Fig. 8) et on fait de même pour B.

8

Page 9: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

FIG. 8 – correspondance entre deux quadrilatères

FIG. 9 – Ray tracing

9

Page 10: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

7 Ray Tracing

1. Modèle : un programme d’images de synthèse gratuit : Pov Ray (Fig. 9) :– Page WEB : http://www.povray.org/– Progamme : http://www.povray.org/ftp/pub/povray/Official/Windows/povwin36.exe

2. A faire au minimum :– Comprendre le principe du Ray Tracing (lancé de rayons). (Recherche WEB).– Commencer par un programme simple, sans fichier de description, pour lequel les objets sont des

sphères, sans traiter les reflets.– Rajouter un affichage progressif : ne pas calculer les pixels ligne par ligne mais par grilles de plus en

plus fines, en les affichant au fur et à mesure.– Rajouter les reflets.– Rajouter d’autres objets analytiques (cubes, cylindres, etc.).– Construire de nouveaux objets par intersection, union et différence d’objets de base.

3. A faire éventuellement :– Lire un fichier de description des objets.– Rajouter les transparences.– Gérer des objets de type maillage (ex. : R2D2 dans C:\Program Files\WinLib5\Test\Test\surprise.3d).– Optimiser le calcul d’intersections avec une notion de boites.

8 Pseudo-compression JPEG

FIG. 10 – Lena, image originale et image (trop) compressée

8.1 Objectif

Le but de ce projet est d’implémenter un algorithme de compression similaire au standard JPEG (JointPhotographic Experts Groups).

8.2 Principe de la compression JPEG

La compression de données permet des échanges ou des chargements plus rapides. Le format JPEG est unenorme de compression d’image avec pertes, c’est à dire avec destruction d’une partie de l’image (les hautesfréquences, celles auxquelles l’oeil humain est le moins sensible). La compression d’une image en JPEG se faiten plusieurs étapes :

Découpage en blocs de pixels

Une des étapes suivantes nécessitant un calcul sur une partie carrée de l’image, l’algorithme JPEG prévoitde découper l’image à compresser en blocs carrés de 8 pixels de côté ;

Transformation de couleurs

L’espace de couleur classiquement utilisé est le RGB : chaque pixel code un niveau de rouge, de vert etde bleu. L’algoritme JPEG peut fonctionner avec n’importe quel espace de couleur, mais comme l’oeil humainest plus sensible à la luminance Y (ou brillance) qu’aux chrominances (Cr, Cb), on effectuera une conversiond’espace de couleur, de RGB vers YCrCb, pour ensuite pouvoir échantillonner les chrominances et pas laluminance.

10

Page 11: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

FIG. 11 – Algorithme de compression JPEG

Les formules de conversions sont données par :

Y = 0.257 ∗R + 0.504 ∗G + 0.098 ∗B + 16

Cr = 0.439 ∗R− 0.368 ∗G− 0.071 ∗B + 128

Cb = −0.148 ∗R− 0.291 ∗G + 0.439 ∗B + 128

Les formules inverses sont alors :

B = 1.164 ∗ (Y − 16) + 2.018 ∗ (Cb− 128)

G = 1.164 ∗ (Y − 16)− 0.813 ∗ (Cr − 128)− 0.391 ∗ (Cb− 128)

R = 1.164 ∗ (Y − 16) + 1.596 ∗ (Cr − 128)

Sous échantillonnage

L’oeil étant moins sensible aux chrominances qu’à la luminance, il est possible de sous échantillonner (oudownsampler) ces chrominances Cr et Cb avec peu d’effet visible sur l’image.L’échantillonnage consiste à réduire les matrices 8 ∗ 8 des chrominances en des matrices plus petites, parexemple en matrices 4 ∗ 4, quatre éléments formant un carré dans la matrice 8 ∗ 8 étant moyenné pour for-mer un élément de la nouvelle matrice 4 ∗ 4.On diminue alors la taille des chrominances par 4, et ainsi la taille de l’image globalement par 2, avec deminimes pertes.

La luminance n’est pas sous-échantillonnée car porteuse de l’information.

DCT

La transformation DCT, ou Discrete Cosine Transform, est une transformation fréquentielle, au même titreque la transformée de Fourier. On y décompose chaque bloc de pixels en une carte de fréquences et amplitudes.A chaque bloc de n pixels est associées n fréquences.

La transformée DCT de l’image I s’écrit ainsi :

DCT (i, j) =2N∗ C(i) ∗ C(j) ∗

N−1∑x=0

N−1∑y=0

I(x, y) ∗ cos(

(2x + 1)iπ2N

)cos

((2y + 1)iπ

2N

)

avec (i, j) ∈ N2, C(k) = 1√2

si k = 0, et C(k) = 1 si k > 0.On comprend ici l’intérêt de découper en blocs carrés de N = 8 pixels de côté : le calcul d’un coefficient

demande N*N additions, soit 64 dans notre cas, ce qui est assez peu. Sur un bloc de taille 300*300, il faudrait90000 additions pour le calcul d’un seul coefficient, ce qui n’est plus raisonnable pour une simple transforma-tion DCT, la compression JPEG prendrait trop de temps.

La transformée inverse (également appliquée sur une matrice 8 ∗ 8) est donnée par :

I(x, y) =2N∗

N−1∑

i=0

N−1∑

j=0

C(i) ∗ C(j)DCT (i, j) ∗ cos(

(2x + 1)iπ2N

)cos

((2y + 1)iπ

2N

)

avec (x, y) ∈ N2.

11

Page 12: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

Quantification

C’est l’étape de destruction partielle des données (donc de la qualité), mais aussi celle qui va permettrele gain de place. La quantification consiste à diviser terme à terme (par divisions entières) la matrice obtenuede la DCT par une autre, la matrice de quantification. Les coefficients de cette matrice ne sont bien sûr paschoisis au hasard : on va, par ce jeu de coefficients, chercher à atténuer les hautes fréquences, celles de faiblesamplitudes. On crée donc un filtre passe-bas.

On effectue alors

F ′(u, v) = E

(F (u, v)Q(u, v)

)

avec F la matrice calculée par la DCT, F ′ la matrice quantifiée et Q la matrice des coefficients de quantifi-cation, donnés par :

Q(u, v) = 1 + (1 + i + j) ∗ Fq

Fq est le facteur de qualité ; il correspond au paramètre réglable dans les logiciels de traitement d’image.On pourra par exemple le prendre égal à 5.

La quantification ramène beaucoup de coefficients à 0, particulièrement en bas à gauche de la matrice (zonecorrespondant aux hautes fréquences) ; on ne garde ainsi que l’information la plus essentielle. L’intérêt est quelorsque l’on va encoder les données restantes, la longue suite de 0 ne prendra que très peu de place en mémoire.

Si l’on choisit un facteur de qualité trop important, il restera trop peu d’information pour restituer l’imagecorrectement et l’on verra des blocs apparaître dans l’image.

Codage RLE et Huffman

Il reste à encoder les données résultantes, c’est à dire à trouver une représentation en mémoire prenant lemoins de place possible.

Pour l’algorithme de compression JPEG, les données sont encodées suivant un codage de Huffman. Cecodage est une méthode statistique, dans laquelle on remplace un caractère par une suite de bits (une suitede 0 et de 1), sachant que plus la probabilité d’apparition du caractère est forte et plus la séquence de bits lereprésentant sera courte.

Connaissant les probabilités d’apparition des données, on peut construire un arbre binaire représentant lecodage de tous nos caractères.

Le parcours de la matrice quantifiée et la création de l’arbre sont détaillés sur les pages citées dans la partieLiens utiles.

Cette suite d’opérations amène à l’image compressée. Sous cette forme, elle n’est cependant pas visible, ilfaut donc appliquer le processus inverse pour pouvoir la visionner :

– Décompression de Huffman ;– Déquantification ;– DCT inverse (ou IDCT) ;– Echantillonage inverse ;– Conversion vers l’espace RGB ;– Affichage.

8.3 Simplifications de l’algorithme

On ne souhaite pas implémenter tout l’algorithme décrit précédemment.Dans un premier temps, la quantification se fera par simple troncature des valeurs correspondantes aux hautesfréquences, et le codage de Huffman n’est pas non plus demandé : on simulera l’encodage par une compressionzip. Par la suite, on implémentera une meilleure quantification.

8.4 A faire au minimum

On demande donc au minimum l’implémentation des éléments suivants :– Conversion d’espace de couleur (directes et inverses) ;– Echantillonnage (direct et inverse) ;– DCT et IDCT ;– Troncature des hautes fréquences pour simuler la quantification.Pour la manipulation des images, on utilisera la Winlib.

12

Page 13: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

8.5 A faire ensuite

On pourra par la suite ajouter :– La quantification des données (avec choix de l’utilisateur quant à la qualité de compression) ;– Enfin, le codage de Huffman, direct et inverse (voir avec votre responsable lorsque vous en êtes arrivé ici

pour des informations plus précises sur l’algorithme)

8.6 Liens utiles

Vous trouverez sur ces deux sites les explications complètes de l’encodage JPEG.– http://fr.wikipedia.org/wiki/Joint_Photographic_Experts_Group pour l’historique du

standard JPEG ;– http://xavier.chassagneux.free.fr/tipe/tipe.htm pour une présentation complète de l’al-

gorithme, un exemple graphique et les équations de passage d’un espace de couleur à un autre ;– http://fr.wikipedia.org/wiki/Compression_JPEG pour une autre présentation complète avec

exemple numérique ;– http://www.fourcc.org/fccyvrgb.php pour de plus amples informations sur les espaces de cou-

leur.

9 Reconnaissance d’objets en utilisant les descripteurs SURF

FIG. 12 – Détection et appariements de points

9.1 Objectif

L’appariement de points caractéristiques entre 2 images de la même scène ou du même objet est une tachefondamentale de la vision par ordinateur, notamment pour la reconstruction tridimensionnel (voir le projetsur la stérovision), le recalage d’images, et la reconnaissance d’objets. Des points d’intérêt, représentatifs d’unepetite région d’une image ou d’un objet, sont détectés et utilisés pour identifier des parties correspondantes.Chaque point d’intérêt correspond à un endroit caractéristique de la scène (ou de l’objet) (coins, blobs, T-jonctions, . . .), qui est codé par un descripteur local associé a chaque point (i.e un vecteur).

Le but de ce projet est d’implémenter un algorithme de reconnaissance d’objets dans des images à partirde descripteurs locaux robustes dénommés SURF (Speeded Up Robust Features). Ces points d’intérêt et des-cripteurs ont l’avantage d’être robuste au bruit, rapide, et précis. Les meilleurs résultats actuels en vision parordinateur utilisent ces descripteurs.

9.2 Méthode

9.2.1 Identification des points d’intérêt

Un point d’intérêt correspond à un point caractéristique d’une image. Ce dernier est associé à un descrip-teur qui décrit localement le voisinage du point. Toute la difficulté réside en la détection de “bons” points

13

Page 14: Algorithmique et Programmation Projets 2006/2007imagine.enpc.fr/~monasse/Info/Projets/2006/projets.pdfWindow Ww=OpenWindow(w, h, "visage en 3D", Window3D); UseWindow(Ww); ShowMesh(maillage);

caractéristiques et en l’obtention d’une description locale du voisinage du point par un vecteur de taille fixe.Pour cela, nous suivons la méthode SURF (Speeded Up Robust Features).

9.2.2 Reconnaissance d’objets

Lorsque des points d’intérêt ont été identifiés dans une série d’images, il s’agit de trouver les appariementspossibles entre ces derniers et des matchs potentiels (par exemple les points d’intérêt d’une voiture). Un objetsera alors détecté lorsqu’un certain nombre de matchs auront été réalisés entre l’image et un objet caractéris-tique (e.g. la voiture) décrit ses points caractéristiques.

Pour cela, il s’agit de pouvoir apparier deux points caractéristiques, ainsi que d’évaluer la qualité d’un ap-pariement. Pour cela, les experts estiment qu’un appariement peut être considéré comme correct si la distanceentre les deux points (distance à prendre au sens des descripteurs) est plus proche que 70% de la distance dudeuxième plus proche voisin. Ce critère évalue simplement la non-ambiguïté d’un match ; cela n’implique paspour autant que le match est correct.

Finalement, un objet dans une image sera détecté dans une image lorsqu’un nombre suffisant de matchsentre un objet type et l’image aura été réalisé.

9.3 Liens utiles

Pour une présentation complète de l’algorithme, et des exemples graphiques :– http://www.vision.ee.ethz.ch/~surf/eccv06.pdf

10 Réalité augmentée interactive

FIG. 13 – Réalité augmentée

Il s’agira de réaliser un système de marqueurs visuels pour l’insertion interactive d’objects virtuels dansune séquence filmée par une WebCam. Références :

– La base :http://www.hitl.washington.edu/artoolkit/Papers/IWAR99.kato.pdf

– Eventuellement :http://www.iit-iti.nrc-cnrc.gc.ca/iit-publications-iti/docs/NRC-47419.pdf

11 Autre

Vous pouvez proposer des sujets (à valider !)

14