Morphing entre deux images


Projet Réalisé par Pascal Corpet et Ludovic Seegmuller (promo 2001)

Télécharger le programme


Description du projet

Le principe de base est, à partir de deux images source similaires, de pouvoir créer une série d'images intermédiaires qui passe progressivement de la première image source à la seconde. Si on contente de faire un fondu de la première vers la seconde et que les zones similaires ne se recouvrent pas parfaitement, on arrive à distinguer les deux images (par exemple s'il s'agit de visages, on peut reconnaître le nez ou les yeux des deux modèles de base). L'idée est donc de les déformer pour que les zones similaires se recouvrent parfaitement. Pour cela, l'utilisateur identifie des zones similaires en indiquant des points caractéristiques qu'il place sur les deux images.

Algorithmes utilisés

A partir des points que l'utilisateur à indiquer, le logiciel crée une triangulation commune au deux images source, c'est-à-dire que la disposition des points varie, mais que les points sont reliés entre eux de la même façon. On identifie une image intermédiaire par t compris entre 0 et 1, l'image t=0 étant identique à la première image source, et t=1 identique à la seconde. Pour une image t, on redispose les points de façon à ce qu'ils se trouvent à la position du barycentre des points des images source, pondérés par (1-t) et t. On utilisera avec ces points la même triangulation que pour les images source. On découpe les deux images sources selon la triangulation qu'on a créée et on déforme chaque triangle de façon à ce qu'il coïncide avec la nouvelle forme des triangles (celle qu'on vient créer). On mélange ensuite les deux image en donnant un poids (1-t) à la première et t à la seconde. Logiquement, la déformation des triangles devraient faire se recouvrir les zones identifiées par des mêmes points.

Le premier problème avec cette méthode est de définir la "bonne" triangulation qu'on va utiliser. Calculer une triangulation de Delaunay semble être la meilleure solution puisqu'on cherche à travailler sur des zones ramassées, et donc sur des triangles de faible étendue. Si on calcule la triangulation de Delaunay sur la première image, on risque d'obtenir de mauvais résultats pour la seconde. Pour symétriser le problème, nous avons donc choisi de la calculer sur la position des points à t=0,5. Le second problème est de calculer la déformation des triangles. Dans un premier temps, nous avons utilisé une fonction qui pour chaque pixel de l'image générée recherchait la position dans chaque image source, et calculait la valeur des pixels de l'image source à cette position en réalisant une moyenne locale sur les 9 pixels les plus proches (pondérés par une petite gaussienne). Ce système était très lent, et nous nous sommes finalement tournés vers OpenGL qui permet de faire la déformation des triangles en temps réel.

Résultats obtenus

-Le domaine où ce type de programme peut être le plus efficace, ce sont les visages. Il fait apparaître les domaines où cet algorithme est efficace et ceux où il ne l'est pas. Il est plus facile de tester son efficacité, puisqu'on peut facilement juger si une image intermédiaire, en particulier t=0,5 le critère est : "l'image ressemble-t-elle à un visage humain ?". On constate par exemple qu'en ne plaçant que quelques points (au niveau des yeux, du nez, de la bouche) on obtient au centre du visage de très bons résultats : les yeux, le nez et la bouche ont l'air réels. Un exemple avec cette image qui n'utilise que 5 points caractéristiques.

Les résultats sont en revanche moins convaincants lorsque la disposition des cheveux des deux sources sont différents (par exemple lorsque les oreilles sont recouvertes dans un cas et pas dans l'autre). Une grande variation de carrure n'est en général pas un problème si on arrive à disposer une suite de points qui suive rigoureusement le bord des épaules. La triangulation permet en effet de délimiter des espaces uniquement par des lignes brisées, et on peut distinguer les deux images source si cet arrondi est mal délimité par les points de base.

D'une façon générale, le plus important est donc de pouvoir manipuler correctement le logiciel, mais il n'est pas capable de traiter toutes les situations de façon satisfaisante.

Prenons maintenant deux images ne représentant pas des visages. Ici, nous avons utilisé les tours Empire State Building et Chrysler Building à New York. Elles ont évidement une morphologie assez proche, ce qui peut permettre d'obtenir un résultat d'ensemble acceptable, mais il est évident que le mélange des textures de façade ne donne pas un très bon résultat si on regarde de près, contrairement à la peau (le mélange de deux peaux ressemble en général à de la peau).

Problèmes rencontrés et solutions apportées

Outre les problèmes des texture que nous avons évoqué plus haut, il peut apparaître dans certains cas des triangles qui deviennent indirects : pour une même triangulation, le fait de déplacer des points peut "retourner" un triangle. Ce problème peut venir d'une triangulation mal choisie, et le fait d'avoir choisi une triangulation de Delaunay pour une disposition des points intermédiaire a permis de résoudre le problème dans la plupart des cas. Pour les autres cas (si on reste dans l'hypothèse où la configuration des objets qu'on représente reste la même), cela correspond à la situation où une zone qui était visible devient invisible.

Pour ce cas, nous avons envisagé plusieurs solutions : soit on utilise le fait que les triangles indirects sont superposé avec deux triangles directs. On prend alors l'un des triangles directs pour recouvrir le triangle indirect. Il faut alors identifier lequel des deux triangles directs doit être "sur le dessus". Cette méthode est celle qui rend le mieux compte le fait qu'une zone en a recouvert une autre physiquement (lorsque qu'une image source est la représentation 2D d'un objet 3D, et que celui-ci a pivoté par exemple). La deuxième solution est de supprimer le triangle indirect, soit en ajoutant des points, soit en cherchant une autre triangulation.


Retour