To morph between two images, this algorithm first calculates the location of each correspondence point by interpolating between the location of the point on each image. It then uses a Poisson Fill algorithm to calculate the value for each pixel. Each of the correspondence point gets set to the X or Y location of the correspondence point in the original image. Additionally, the Poisson fill also fixes all of the pixels on the border to ensure that the pixels outside of the feature points don't just become a blur. The offsets for all other points are calculated by using the Poisson fill.
Once both images have been warped, they are then blended together using a cross dissolve.
To calculate the mean face, I first averaged the correspondence points on all the images to get their average locations. I then warped all the images to those points and averaged the results to get the mean face.
The video below shows the results of all of my morphs:
Morphing was the most successful when the faces were oriented the same way. Additionally, when the subjects had hair of significantly different lengths, it tends to make the morphing very noticeable. Adding more points around the head to capture the shape of the hair would probably improve the results.
Below are the starting, middle and ending frames for all the morphs:
Starting Frame | Middle Frame | Ending Frame |
---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |