Face Morphing

Face Morphing

Computational Photography

Beautiful portraits by Martin Schoeller.


My program produces a "morph" animation of faces, computes the mean of a population of faces and extrapolates from a population mean to create a caricature.

A morph is a simultaneous warp of the image shape and a cross-dissolve of the image colors. For this to work, the warp is controlled by defining a correspondence between two pictures, which maps eyes to eyes, mouth to mouth, chin to chin, ears to ears, etc., to get the smoothest transpormations possible. Here is an example correspondence set (shown on the right):

With these points, we can compute a triangulation for morphing. For this, I use a Delaunay triangulation at a midway shape (i.e. mean of two image point sets) to lessen the potential triangle deformations.

A Delaunay triangulation in the plane with circumcircles shown above.

"Mid-way Face"

Computing a mid-way face between images A and B involves: 1) computing the average shape, 2) warping both faces into that shape, and 3) averaging the colors together. I warp the images into an average shape using an affine transformation matrix for each triangle in the traingulation from the original images to this new shape. I generate a mask directly using bounding box polygons.

For example, images A (left) and B (right) yield the following mid-way face (middle) of my friends:

We can also do this with portraits from Martin Schoeller.

Morph Sequence

We can warp two images into an intermediate shape configuration controlled by some warp fraction, and then cross-disolve by some factor. For interpolation, these parameters lie in the range [0,1]. The result is a warp between two images using the point correspondences and a triangulation structure, which we can do multiple times with varying warp fractions in the range [0,1] to generate a morph sequence. Here are the results.

Jackson and Daniel.

George Clooney and Stephen Curry.

"Mean face" of a population

I picked a dataset of annotated faces of Danish individuals. Using the keypoints already annotated on the data I: 1) compute the average face shape from the dataset, 2) morph each of the faces into an average shape, and 3) compute the average face of the population.

Some of the faces are shown below (left), morphed into an average shape from the population (right).

Shown below is the average face of the population of 40:

Terrifying. I also produced a caricature of my face by extrapolating from the population mean calculated above. Unfortunately, this does not work as well with glasses, and would probably be better if I used a gender-specific mean of a subset of populations that look similar to me.

Bells and Whistles

I decided to photograph some people I shared a house with senior year, and morph these images together. Here is the result:


  • CS 194-26 Course Staff at UC Berkeley
  • Professor Alexei (Alyosha) Efros