TP3: Morphage de visages, par Louis Bourdages

Introduction et fonctionnement

Le morphage de visages est une technique couramment utilisée pour des effets spéciaux dans les films Hollywoodiens. Ici, nous nous en servirons de manière ludique.

Le but du TP3 est d'implémenter un algorithme de morphage de visages. Chaque étudiant morphe son propre visage vers celui d'un autre étudiant, et produit un vidéo de l'animation. Un but secondaire est d'utiliser cet algorithme de morphage afin de calculer le visage moyen d'un étudiant en photographie algorithmique.


Implémentation du morphage de visages

On commence par charger les images avec les points qui leur sont associés. On ajoute des points sur la bordure de l'image (36 au total), ce qui permettra de traiter convenablement l'arrière-plan. Puis, on calcule les coordonnées moyennes de chaque point et on calcule une triangulation de Delaunay à partir de cet ensemble de points.


Note: certains points ne sont pas affichés car ils sont situés à 0 en X ou Y; cela ne change strictement rien d'un point de vue algorithmique.

On commence le morphage en calculant l'ensemble de points moyen en faisant une moyenne des points associés à chaque image pondérée par warp_frac. Puis, pour chaque triangle, on effectue les trois étapes suivantes:

La dernière étape consiste à aller chercher les couleurs correspondant aux coordonnées calculées plus haut dans chacune des images, puis à effectuer un mélange pondéré par dissolve_frac.

Pour la production de la vidéo, warp_frac croît de manière linéaire entre 0 et 1. Pour pallier aux problèmes de mauvais alignement lorsqu'une image est utilisée en proportion plus grande que l'autre, dissolve_frac est basée sur une arctangente, normalisée de manière à valoir 0 et 1 au extrémités du domaine. Ainsi, le fondu se fait plus rapidement au milieu, lorsque les images sont mieux alignées.



Calcul du visage moyen

Une fois le morphage de visages implémenté, le calcul du visage moyen est trivial. On commence par calculer l'ensemble de points moyen, puis on calcule la triangulation à partir de celui-ci.

Ensuite, on transforme chaque visage vers le visage moyen à l'aide de la fonction morph, en utilisant une image vide comme deuxième image, et l'ensemble de points moyen comme deuxième ensemble de points. La valeur de warp_frac est de 1 et celle de dissolve_frac de zéro. On fait finalement une moyenne de chaque image.



Résultats

Morphage de mon visage vers celui de Simon Fréchet:

Source Transformation Destination
Visage moyen:

On remarque que le visage a une apparence masculine, de par la forme (relativement large) et la couleur (il semble y avoir une légère barbe de quelques jours). Les parties du visages ont toutes une forme neutre: par exemple, le nez n'est ni gros, ni petit. Le visage est de plus extrêmement symétrique.

On remarque aussi un certain flou dans l'image. À bien y penser, c'est logique: le théorème central limite stipule qu'en présence d'un grand nombre de variables aléatoires, la distribution prend la forme d'une gaussienne. Bien qu'on ne soit pas en présence de variables aléatoires à proprement parler, les différents visages ne sont pas corrélés entre eux et il est normal que le résultat soit plutôt flou.



Crédits supplémentaires

Observer la triangulation m'a fait penser aux vieilles animations 3D au style très polygonal. J'ai donc décidé de modifier mon code afin que pouvoir générer des images offrant le même effet.


Image provenant du clip de Musique Non Stop du groupe allemand Kraftwerk.

Deux versions de la fonction de morphage ont été produites. La première remplit tout le triangle par la couleur du pixel "moyen" - celui dont les coordonnées sont la moyenne des coordonées post-transformation. La seconde calcule la couleur moyenne pour chaque triangle, une fois le traitement normal effectué, et remplit les triangles avec celle-ci.

Deux scripts ont été produits. Le premier sert à générer une image "robot" à partir d'une image et d'un ensemble de points. Le second permet de faire du morphage d'images en utilisant une apparence polygonale comme celle-ci. Je n'ai pas inclus de vidéo à cause de la taille, mais il est tout à fait possible d'en créer.

Moyenne géométrique Moyenne des couleurs

Moyenne des couleurs, 50% Louis, 50% Simon

La version avec la moyenne des couleurs représente plus fidèlement l'image. En augmentant le nombre de points, on améliore l'apparence et il devient même possible de reconnaître le visage lorsqu'on regarde l'image de loin ou qu'on plisse les yeux, puisque les basses fréquences de l'image sont conservées dans une certaine mesure.