Computation Photography Project 4: Face Morphing

Michael Kamm (mkamm)

Overview

For this project, I had to implement a face-morphing algorithm in MATLAB. With this algorithm, I had to produce a 61-frame animation that turns my face into a fellow student's face. I also had to find the average face of our class.

To make a morph between two images, I first had to find corresponding feature points between our two faces. I then obtained a delaunay triangulation of the midway shape of the two sets of feature points. To create a morphed image, I first had to warp the shape correctly (update the feature points) using linear interpolation. I then had to find, for each arbitrary pixel [i;j], two transformation matrices (from [i;j] in the morphed image to [i';j'] in image A, and from [i;j] in the morphed image to [i";j"] in image B). I used the delaunay triangulation and barycentric coordinates to get these matrices. Once I had these transformation matrices, I found the correct corresponding pixels in image A and image B using bilinear interpolation. I then cross-dissolved the two colors at these pixels to get the color for pixel [i;j]

Results - Morphing

Here is the morph animation from my face to the next students face: I added 4 feature points to each corner which helped get rid of some artifacts

Here are the original images:

mkamm - nfeltman -

Results - Mean Image

To find the mean face of our class, I just computed the average shape (average corresponding feature points), warped each face to this shape, and then averaged all the colors. Here is the average face of our class:

Here is my face warped to the average shape: OH GOD!!

Here is the average face warped to my face shape:

Bells and Whistles - Caricatures

I was able to make a caricature of my already terrible picture by finding the difference between my feature points and the average feature points and then extrapolating that value. Here are the results:

avg_points + 0.5*difference:

avg_points + 1.0*difference:

avg_points + 1.5*difference:

avg_points + 2.0*difference:

avg_points + 3.0*difference:

hot guy alert