TP3: Morphage de visages

- Déformation et fondue d'image à image -

par Olivier Duguay

GIF-4105/7105 Photographie Algorithmique, Hiver 2015
Image du visage moyen
Image du visage moyen

1-Objectifs du projet 2-Description de l'algorithme 3-Résultats 4-Extras

1-Objectifs du projet

Dans le cadre de ce troisième projet du cours de photographie algorithmique, il nous faut implémenter une fonction qui permet le «morphage» entre 2 images données. Cette technique sera utilisée pour faire la transition entre deux images de visages. Il faut donc créer une animation (vidéo) qui métamorphose un visage en un autre à partir de deux portraits et de leur points de correspondances respectifs. De plus, à l'aide de cette algorithme de morphage, il faut mesurer le visage moyen de la classe en utilisant les photos de chacuns des élèves.

Pour plus de détails, voyez l'énoncé complet ICI.

2-Description de l'algorithme

Pour effectuer ce projet, il faut tout d'abord déterminer la fonction de morphage suivante à l'aide de Matlab :

morphed_img = morph(img1, img2, img1_pts, img2_pts, tri, warp_frac, dissolve_frac)

Tout d'abord, à l'aide de l'image source et de destination, on utilise une fonction qui permet de sélectionner des points d'intérêts dans chacune des images. Chacun des points d'intérêts de l'image source devront correspondre aux «mêmes» points d'intérêts dans l'image de destination. Cette étape à pour but de définir les zones des images pour lesquels les transformations (métamorphosages) sont semblables et vers quels pixels de l'image source vont les pixels de l'image de destination. C'est à l'aide de ces points que nous détermineront la triangulation.

On utilisera la fonction suivante :

saveAndDisplayFeatures(imgfilename,n)
Cette fonction permet de dessiner «n» points de correspondance sur une image donnée (imgfilename).Comme il est illustré sur les images suivantes, on voit le tracé des points de correspondance entre 2 images à métamorphoser. Chacun des points sur l'un des «Pokémon» est le même pour l'autre créant ainsi les différents points d'intérêts semblables pour chacune des images.

Pts de correspondance 1 Pts de correspondance 1
Pts de correspondance 1 Pts de correspondance 2

Par la suite, à l'aide des points de correspondance déterminés précédemmment, on calcule une triangulation selon l'algorithme de Delaunay afin de maximiser la grandeur (l'aire) de chacun des triangles. L'utilisation de triangles peu minces évite la distorsion trop accentuée de l'image lors du morphage.

Pour ce faire, on utilisera la fonction suivante :

tri_img = triDelaunay(img1_pts, img2_pts, alpha)
Cette fonction permet de calculer la meilleure triangulation selon l'algorithme de Delaunay et ce, selon un pourcentage de déformation entre les deux images. En effet, une bonne approche est de calculer la triangulation pour des points intermédiaires (moyens) entre les 2 fichiers de points de correspondances (img1_pts et img2_pts) selon un pourcentage de déformation (alpha) afin de diminuer la possible déformation des triangles. On aura donc la même triangulation pour chacune des images et on se retrouvera donc avec les points intermédiaires suivants :
inter_pts = ((1-alpha)*img1_pts) + (alpha*img2_pts);
Voici le résultat de la triangulation sur les deux visages à métamorphoser :

Triangulation 1 Triangulation 2
Triangulation de la source Triangulation de la destination


Il est important de noter que pour effectuer une bonne transition du «background» des deux images, on utilise la fonction suivante dans le but d'ajouter des points de correspondance sur le contour de des images :
pts_out = addBorderPts(image, pts)
Cette fonction permet donc d'ajouté 8 points de correspondances (provenant du fichier de point (pts)) au contour de l'image (image).

Une fois la triangulation calculée, il est possible d'effectuer le morphage d'une image vers l'autre. En effet, il suffit de calculé la transformation affine de chacunes des paires de triangles correspondants dans chaque image selon le critère de déformation «warp_frac». Une fois la déformation calculé, il suffit d'effectuer l'effet de transitions (fondu) entre les deux triangles correspondants selon le critère de dissolution d'image «dissolve_frac». Ces deux critères sont utilisé de la même façon décrite précédemment pour la détermination de la triangulation moyenne.

Pour la confection de l'algorithme de morphage, les importante fonctions suivantes ont été utilisées :

triNo = mytsearch(x,y,tri,X_pts,Y_pts)
La fonction mytsearch permet de créer un masque de triangulation. En effet, avec cette fonction il est possible de savoir à quel triangle appartient chacun des pixels constituant une image. Il suffit d'utiliser les coordonnées de l'image à trianguler (x,y), la triangulation (tri), ainsi que les points de correspondances (X_pts,Y_pts) qui ont été utilisés pour la triangulation.
imageInter = interp2(V,Xq,Yq,method)
La fonction interp2 permet quant à elle de faire l'interpolation entre différents points de chacune des images et d'en effectuer le fondu. En effet, avec cette fonction, on détermine une valeur d'intensité de pixel selon l'image source (V) pour des pixels (Xq, Yq) selon un type d'interpolation (method) qui peut être linéaire, polynomiale (spline) ou autre. On utilisera cette fonction pour déterminer le fondu entre les deux images (source et destination) selon le critère de dissolution.

Avec l'algorithme de morphage de déterminer, il est trivial de trouver le visage moyen en se basant sur les coordonnées et images de chacuns des visages de classe. Plus il y aura de photos, meilleur l'estimation du visage sera.

Pour calculer le visage moyen, il faut d'abord déterminer la FORME moyenne des visages. Pour ce faire, il suffit d'utiliser la moyenne des points de correspondances de chacunes des images car ces points correspondent aux mêmes points d'intérêts du visage des gens de la classe. Puis, avec cette déformation moyenne, on calcule la déformation de chacun des visages vers cette déformation à l'aide de la fonction de morphage. Pour cette étape, il est important de simplement calculer la déformation des images et non «le fondu». Il faudra donc utiliser un pourcentage de déformation (warp_frac) de 100% et un pourcentage de dissolution (dissolve_frac) de 0%. Finalement pour déterminer le visage moyen, il suffit de faire l'addition de chacun de ces visages déformés selon la déformation et de diviser le résultat par le nombre d'image permettant de constituer la moyenne.

3-Résultats

Image d'origine (Moi) Image métamorphosée à 25% Image métamorphosée à 50% Image métamorphosée à 75% Image de destination (étudiant suivant)
Image d'origine (Moi) Image métamorphosée à 25% Image métamorphosée à 50% Image métamorphosée à 75% Image de destination (étudiant suivant)

Comme on peut le voir sur les images précédentes, il est possible de faire une transition fluide entre les deux images en calculant la déformation et le fondu de chacunes de images pour un certain pourcentage. Il est important de bien choisir les points de correspondances des 2 images afin de réduire le plus possible les artéfacts et problèmes de distorsion si des paires de points sont trop dissociés. Cependant, on remarque que l'algorithme possède ses limites. En effet, pour des transitions où l'on doit faire «apparaître» des cheveux ou des lunettes, seul l'effet de fondu est utile et pour des interpolations linéaires, on remarque que ceux-ci apparaîssent «subitement». Pour le visage moyen, on remarque certains artéfacts surtout dûe au cheveux plus long et volumineux de certain d'entre nous. De plus, le fait qu'il y ait plus de garçons que de filles dans la classe fait en sorte que le visage moyen à d'avantage de traits masculins que féminins. En se basant sur ce principe, on peut faire la moyenne pour les filles et les garçons et utiliser cette moyenne afin de féminiser ou masculiniser les traits d'une personne mais cet extra sera pour une prochaine fois.


Vidéo du morphage
Images de transition

Image animée (aperçu)

4-Extras

En guise d'extra, j'ai simplement utilisé l'algorithme de morphage sur différentes images dont des Pokémons pour en faire leur évolution (retour en enfance). De plus j'ai utilisé le morphage pour faire le vide d'un verre d'eau, sans en boire une goutte ou même le renverser.


Vidéo du morphage

Vidéo du morphage

Vidéo du morphage