Face Morphing

with (occasionally creepy) results

Gautam Mittal

Defining Correspondences

To create a face morph between Bruce Lee and myself, we first define a set of facial keypoints and a triangulation.

Bruce Lee (from Google Images) and Gautam (me).

Computing the "Mid-way Face"

With these features, we can now compute the midway shape and cross-dissolve the color values at each pair of warped triangles between the two images to produce an intermediate face.

Bruce Lee, Gautam, and the midway face.

The Morph Sequence

Using 100 alpha values uniformly spaced along the domain [0, 1], we produce an animation of one face morphing to the other.

Gautam -> Bruce Leee. alpha = np.linspace(0, 1, 100).

The "Mean Face" of a Population

Using the Danes annotated faces dataset, the mean face (shape, color) can be computed.

The mean Dane face.
Example Dane images morphed to the geometry of the mean face.
Gautam morphed to the geometry of the mean Dane face. Mean Dane face morphed to the geometry of Gautam.

Caricatures: Extrapolating from the Mean

Extrapolating from the mean (in this case the same mean Danish face as shown above) produces exaggerated carricatures. A negative alpha value is further away from the mean (anti-Danish mean) while a positive alpha value amplifies the features of the mean.

From left to right: alpha = [-2, -1, 0, 1, 2]

B&W: Change Gender

Using the average Indian female face (taken from Google Images), I generated a feminine version of my face.

From left to right: original Gautam, original average female Indian face, structural morph, color morph, combined morph. alpha = 0.5.