TP3: Morphage de visages

TP3: Morphage de visages

Réalisé par Lei Lei

Description du projet

Le but de ce travail est de produire une animation qui affichera un visage d'un étudiant, et le métamorphosera vers le visage d'un autre étudiant, sous la forme d'une séquence vidéo. Et en utilisant l'algorithme de morphage, une image moyenne des visages de tous les étudiants de la classe sera à générer.

Description d'approche

Souvant, l'algorithme de morphage consiste à : Définir les correspondances, Calculer une triangulation, Créer le morphage (Calculer la transformation affine des triangles et Calculer le fondu des couleurs).

Définir les correspondances

Cette partie est faite avec la function "saveFeatures.m" proposée. On a obtenu 43 points de correspondances pour chaque image.

Calculer une triangulation

Ensuite, en lisant deux fichier des correspondances enregistriées, on peut calculer une moyenne des deux ensembles de points, ce qui permet de créer une jolie triangulation avec la fonction Delaunay.


Voici la bonne triangulation (tri) obtenue :


tri_inter_1 tri_inter_2
cela est à cause que je suis trop maigre dans le visage....

Créer le morphage

Dans cette partie, une fonction nomée "morph_im" a été bien écrite :

Img_target = morph_im(Img_source, pts_source, pts_target,tri)

qui produit la distorsion entre Img_source et Img_target en utilisant leur correspondance des points pts_source et pts_target et la structure de triangulation tri.

"pts_target" est calculé par une moyenne pondérée entre les points de l'image 1 et l'image 2, avec la facteur "warp_frac" variant de 0 à 1. Ils sont des points indermédiares.

Pour calculer la déformation de chaque triangle de la triangulation à pardir de Img_source jusqu'à Img_target, on a créé une fonction "tform.m" qui pourrait lire les coordonées de deux triangles et sortir la transformation affine correspondante avec l'opération matricielle simple.

Une fois on a la transformation affine, on continue à calculer la couleur de chacun des pixels dans Img_target avec la transformation affine inverse.
La fonction "mytsearch" permet de trouver tous les pixels dans la triangle considérée. Et à partir des ces pixels, les couleurs des pixels correspondantes dans l'image originale (Img_source) sont bien retrouvées avec l'aide de la fonction "interp2".

Lorsque "img1_warp" (l'image distordue de l'image 1) est bien construite, on fait la même chose pour l'image 2 afin d'obtenir "img2_warp". Ensuite on calcule la moyenne pondérée des couleurs entre "img1_warp" et "img2_warp", avec la facteur "dissolve_frac" qui varie de 0 à 1.

À la fin, "morphed_img" est bien créée.

Résultats et Commentaires

Voici les résultats obtenus:


05-lei 06-ming

Ce résultat a bien montré les étaps de morphage. À cause que je suis plus maigre que Ming, mon visage se transformait plus en plus large et descendait un peu parce que nous ne étions pas bien allignés. On a vu aussi que la couleur de l'image 2 apparait assez doucement car on a mis la variation de "dissolve_frac" est une fonction cubique, mais celle de "warp_frac" est linéaire.


Voici le visage moyenne obtenue :


visage_moyen

On pourrait peut-être obtenir un meilleur résultat en levant des lunettes. La couleur du fond est à cause que les endroits de photos n'étaient pas mêmes et les vêtements n'étaient pas pareils non plus. Les chevaux se semblent un peu bizzare pourrait être à cause que les points des correspondances ne sont pas dans les positions assez proches. Il y a des photos qui ne sont pas "pareils".

Crédits Supplémentaires

J'ai essayé de faire voir comment je grandissais....voici les réalités :


lei881 lei882

À gauche c'est quand j'avais trois mois et à droite quand j'avais six mois. Malheureusement, je n'ai que ces deux petites photos ...Dommage!
La couleur à la fin est à cause que j'ai mis seulement 20 trames totales, il y a donc petit pb d'affichage de la dernière image.

Maintenant on va regarder qu'est-ce qui se passe quand j'étais un peu élevé (60 trames totales) :


lei00 lei02

À gauche c'est quand j'avais 12 ans et à droite c'est quand j'avais 14 ans. On a vu que pendant deux ans de l'adolescence, j'ai été un peu mûr, mais le sytle de mon visage ne change jamais, même pour maintenant ! Car ces deux images ne sont pas bien alignées, on a vu le déplacement pendant le morphage. Mais le résultat n'est pas mal. Je comprends mieux comment je grandissais. (^_^)


Et puis, on va regarder les animaux du genre chat. Voici un morphage de un léopard vers un lion (80 trames totales) :


leopard lion

Ces deux images sont bien alignées et le résultat est bien présenté. Et les couleurs se changent "normalement". Parce qu'ils sont dans le même genre, ils se semblent trop. Cela alors n'soit pas un morphage, mais un grandissement.

Féminisation (Visage moyen)

J'ai calculer un visage moyen pour les filles dans notre classe (seulement deux...) et voici le résultat :


Femme

Une avec des lunettes et une autre non, ce qui conduit un résultat comme cela. On a déjà un visage moyen de tous les étudiants, si on soustrait ce résultat du visage moyen, qu'est-ce qu'on obtient ? Un visage moyen de l'Homme ?

Et voilà :


Homme

C'est un fantôme ! C'est-à-dire l'homme est fantôme! Ou on peut dire que sans femme, l'homme serait comme cela !!!


Mais qu'est qui se passera si on soustrait le visage moyen de femme du visage moyen ? (C'est-à-dire que sans homme, les femmes seront comment ?)


Et voilà :


On pourrait conclure que les femmes ou les hommes seront mals sans l'autre.

Analyse des Composantes Principales (PCA Wikipédia)

Le visage moyen précédant montre un visage moyen de tous les iamges déformées. Maintenant on va considère l'ACP. Il y a plusieurs façons d'effectuer, ici on utilise une méthode d'Expectation Maxime, qui se trouve sur le site PCA Wikipedia :

le code éffectué se trouve dans "tp3_cred_supp_PCA.m". Pour les résultats, la première composante principale doit être normalement le moyen de tous les images. En raison que on n'a pas fait la distorsion, le résultat est alors présenté comme ceci:
Lorque on a obtenu la première composante principale, l'intensité d'iamge est trop petite. Et on ne pourrait pas trouver un bon facteur pour présenter le résultat assez jolie, donc on utilise les niveaux de gris (Une fonction "imadjust" sous matlab permet de modifier l'intensité seulement pour les images gris).
En soutrayant la première composante et répétant le même algorithme, on a alors:

Bien évidement le résultat de distorsion est meilleur, sans distorsion les visages ne sont pas alignés. Une amélioration du code reste à éffectuer.

Conclusions

Ce projet nous permet de comprendre et bien appliquer la tranformation dans les images. Mais dans les détails on peut voir que les facteurs "warp_frac" et "dissolve_frac" jouent les rôles importants pendant le morphage. Le couleur du fond est plus important. Un facteur mal de "dissolve_frac" peut contruire une image bizzare.
Sur tout, on se amuse trop !

PS: Merci Maxime et Tom pour le debugging !