TP3: Morphage de visage

Présentation du projet

Dans ce projet on cherche à créer un morphage entre deux visages. Le but est de créer une animation continue entre les deux visages. Le morphage de visage sera aussi utilisé pour créer un visage moyen des étudiants de la classe.

Explication de la méthode de morphage

Le morphage de visage consiste à transformer la géométrie d'un visage vers celle d'un autre. Dans le même temps on transforme les couleurs des pixels d'un visage vers celui de l'autre. La première étape pour calculer ces transformations est de définir la géométrie des deux visages de la même manière. Pour cela on sélectionnera des points de correspondance dans le même ordre dans les deux images de visages.

Exemple de points de correspondance (ici 43 points)


Ces points vont nous servir à créer une triangulation c'est à dire que l'on va chercher à relier les points entre eux pour obtenir des triangles. Il existe beaucoup de solution de triangulation différentes, cependant la méthode de Delaunay permet d'obtenir une triangulation la "meilleure" possible, c'est à dire que les triangles soient le moins plats possible.

Exemple de triangulation de Delaunay avec les points
d'intérêts du visage de notre dépanneur préféré


Cependant, la meilleure triangulation d'un visage ne correspondra pas forcément à celle d'un autre. Dans le cas du passage d'un visage à un autre il sera plus intéressant de choisir la triangulation des points à mi-chemin entre les points des deux visages, c'est à dire qu'on calcule la moyennes des coordonnées des points de correspondance et qu'on applique la triangulation de Delaunay sur ces points. C'est à partir de ces triangles que nous allons créer le morphage de visage.
Dans un premier temps nous chercherons à créer une image intermédiaire entre les deux images. Pour cela nous avons besoin de définir deux nombres qui varierons entre 0 et 1: warp_frac qui définira le niveau de distorsion et dissolve_frac qui définira le niveau de fondu. Par exemple warp_frac = 0 correspond à la forme du premier visage et warp_frac = 1 à la forme du second visage. De même pour dissolve_frac pour les couleurs des pixels.
Nous allons donc d'abord chercher la géométrie du visage de l'image intermédiaire à partir du paramètre warp_frac. Les points définissants les triangles de l’image intermédiaires seront obtenus par une moyenne pondérée par warp_frac:

pts_inter = (1-warp_frac)*img1_pts+warp_frac*img2_pts;

On utilisera toujours la triangulation définie comme précédemment pour chaque image (les deux images de visage et l'image intermédiaire). Ainsi nous allons calculer les déformations à appliquer à chaque triangle de l'image du premier et du deuxième visage vers les triangles correspondants de l'image intermédiaire. Ces déformations correspondent à des transformations affines. Comme nous travaillons sur des triangles nous avons 3 correspondances pour chaque transformation, ce qui est suffisant pour le calcul des paramètres des transformations affines. Les paramètres sont calculés de la façon suivante:
Soit P1, P2 et P3 les 3 points d'un triangle de coordonnées respectives (x1,y1), (x2,y2) et (x3,y3) et P'1, P'2 et P'3 de coordonnées respectives (X1,Y1), (X2,Y2) et (X3,Y3) les points du triangle correspondant. Comme on cherche à estimer une transformation affine, celle-ci peut être écrite sous la forme d'une matrice T définie comme suit:
T =
 
a b c
d e f
 
Pour trouver les 6 inconnues de la matrice il suffit de résoudre les équations découlant des égalités suivantes:
 
Xi
Yi
1
 
= T
 
xi
yi
1
 
pour i = {1,2,3}
Une fois les matrices de transformation calculées, il faut les appliquer à tous les pixels contenus par les triangles. Cette façon de procéder peut poser problème car il se peut qu'il y est des pixels dans la valeur n'est pas été assignée. Pour éviter cela, on procèdera de la façon inverse, c'est à dire qu'on cherchera quels pixels correspondent à ceux du triangle d'arrivée. Ceci se fait grâce à la transformation inverse de T. Quand les valeurs des antécédents calculés seront non entières de pixels, il faudra calculer une interpolation sur la zone de l'image pour trouver la meilleure valeur pour le pixel. Nous avons aussi essayer de choisir la valeur du pixel le plus proche mais cela créait parfois de léger artéfact visuel car cela réhaussait les fréquences de certaines zones de l'image (voir l'animation de l'évolution de Darwin). La couleur d'un pixel dans l'image intérmédiaire sera une moyenne pondérée des couleurs des pixels antécédent des deux images de visage en fonction de disolve_frac. Pour chaque canal on calcule:

morphed_img(pixel) = (1-dissolve_frac)*Valeur_interp_Img1(ant1_pixel)+dissolve_frac*Valeur_interp_Img2(ant2_pixel);
Avec toutes ces méthodes nous pouvons générer un visage intermédiaire entre deux visages. Pour créer une animation fluide d'un passage à un autre il suffit de générer plusieurs visages intermédiaires en faisant varier warp_frac et dissolve_frac. Les zones avec de grandes différences entre les deux images génèrent une transformation moins continue que les autres zones. C'est le cas ci-dessous du sourire ouvert et fermé. Pour obtenir le résultat ci-dessous nous avons utilisé 170 points de correspondance.

Résultat final (Ralenti) Résultat final


Le deuxième travail consiste à calculer le visage moyen pour les étudiants de la classe. Nous disposons pour cela de 9 images de visages avec pour chacun, 43 points sélectionnés comme dans les premières images. Il faut dans un premier temps calculer la forme du visage moyen. Cette forme correspond à la moyenne des points de correspondance pour les 9 images. On transforme ensuite la forme de chaque visage dans la géométrie du visage moyen trouvée. Les images ci-dessous sont les 9 visages transformés vers le visage moyen.



Pour obtenir le visage moyen de la classe, il suffit de faire la moyenne de ces 9 images sur chaque canal de couleur. On obtient le résultat ci-dessous.

On remarque que ce visage à des traits masculin plus marqués de par la majorité de visages masculin dans les 9 images. Les lunettes créent des artéfacts ; nous avons donc enlevé les lunettes des visages de Diane et Charles avec des outils de suppression d'objets vus dans le cours. Nous avons obtenu le résultat ci-dessous.




Quelques exemples:



Évolution de Darwin
Morphage avec choix du plus proche voisin
On remarque des artéfacts au niveau des sourcils


Lenna->Tom



Scarlett Johansson Tom
Masculinisation de Scarlett
avec la géométrie du visage de Tom
Visage Moyen de Scarlett et Tom



Transformation de 90cents en 8$


Chat Morphage d'une partie du visage avec celle d'un chat


Morphage intégral