Computational Photography Assignment 3

Alyssa Reuter - Spring 2010

Description

To implement my image morpher, I first find the average data point of the two images and then determine a delaunay triangulation from that average. Next I call a morph function for each interpolation step between the two images. The morph function computes the affine transformation for each triangle using the computeAffine function, and then determines which triangle each of the pixels in the final warped image are in. Finally it iterates through each of these pixels, multiplying the affine matrix of their respective triangle with their location to determine which pixel in the original images to sample. These results from each of the input images are then dissolved together based on the interpolation.

The image averager uses the same morph function, but in a slightly different way. Each image to be added to the average is warped to the average of the data points, and then 1/nth of its color values are cumulatively added to the average image.

I was also curious to see what the average girl in the class looked like. To find out, I slightly modified the code for the average face so that it would only iterate over the girls' data:

Results

My program produces believable morphs and averages, so in this sense my implementation succeeds. There appear to be some ghosting issues (such as in the average female image) which appear to be caused by inaccurately placed data points, but not the morpher.

However, my implementation runs very, very slowly. I couldn't figure out how to vectorize some of the operations I used to transform the images and used for loops instead, which really slowed things down. As a result, rendering morphs from one face to another take about 3 hours, so unfortunately I didn't have time to tweak the data points to produce more accurate results.

Files

Morph to average

My face to next face (12->13)