XMRM : Morphing with Linux
XMRM (Multi Resolution Morphing for X) is a morphing
program that allows one to create an mpeg video based on two
images, where one image transforms progressively (according to many
parameters) into the other. This article describes the principal
functions of the program (thanks to the very complete documentation
in English available on the XMRM site), as well as an example of a
small animation that shows how one can obtain interesting results
The version used in this article is from an RPM (on RedHat 6.0),
but you can also find the source distribution at
As well as the program itself, in order to save the animation as an
mpeg, you need to install "tifftopnm" and "ppmtoyouvsplit", which
are both in the package "netpbm01mar94", which you can find here:
ftp://ftp.x.org/contrib/utilities/ as well as "mpeg"
The way XMRM works is as follows: you load two images, one called
"source" and the other called "destination". Then, using vectors,
you do a tracing on each image, where each point in the line on one
image corresponds to a point on the other image. These tracings
will determine the contours of the morphing. After you've chosen
the type of morphing, the quality, the number of steps (frames),
you "calculate" the animation, which you can then save as an mpeg.
Menu and principal functions.
This menu serves a dual function since each command corresponds to
a button on the general interface.
This menu allows you to choose the type of "wavelet," ie, the
type of transformation. The various choices are different image
transformation algorithms. "RTS-Transform" is sufficient in most
cases, especially for previewing. For high quality results, choose
in the range between Biorthogonal Spline and Battle Lemarie (which
go from the most complex to the slowest).
The three others can produce funny results.
This menu allows you to hide or show the different work windows.
XMRM uses the TIFF format.
All of your settings, including the vectors, the names of the
imges, the parameters, etc, can be saved, loaded, and saved
Projects are saved with the extension .prj; vectors are saved in a
separate file with the extension .prj.vec.
Swap the source and destination images as well as the vectors to
reverse the direction of the morph.
Load a black and white image to use the Detail Map Morph
A color image will be converted into black and white.
Basic morphing by mixing the source and destination images.
This feature uses a black and white image along with the source and
destination. It allows you to control the progression of the
transformation: A white zone in the black and white image indicates
rapid transformation from source to destination, while conversely,
a black zone indicates slow progression.
Here only the source image is transformed based on the vectors.
Surprising effects guaranteed!
Allows you to create a sequence starting with the less detailed
areas of the source image and the less detailed areas of the
destination, to continue in the reverse direction and return to the
beginning to finish the cycle.
In advanced mode, the "wavelet-functions" can be selected and
configured separately; in the simple mode, 1 is always selected:
With the "high quality" option the calculation can take as much as
4 times as long...
This option positions invisible vectors on the four sides of the
two images (source and destination). This allows you to avoid
deforming the frame during morphing.
When this button is not pressed, conventional morphing is used.
This function determines the value of the source and destination
images for each image in the animation.
When it is activated, it uses the more advanced
"wavelet-transformations mode", which is configurable with the
"Advanced Mode" option.
It's possible to modify the progress of the morph as follows: The
X-axis represents the time or the position of the image in the
animation: on the left is the source image; on the right is the
On the Y-axis, on bottom is the source image and at the top is the
So, following the three examples below, you can have an even
progression, a progression where the destination image appears
towards the end, and finally one where you have a loop.
To add or modify the position of a point, use the left mouse
button; to delete, use the right mouse button.
Positioning the vectors
Once the two images are loaded, use the tools Edit, delete /vector,
and set /Line to trace the vectors that determing the contours for
the morphing of each image. The greater the number of vectors the
better the quality of the morph will be.
It is possible to have several tracings per image: for example, in
the official documentation, there is an example of morphing a bear
and a leopard where they have the contour of the head, plus the
outline of each eye, for a total of three tracings per photo.
Calculating the animation
Here you determine the number of images (frames) that will
comprise the animation, which will determine how long it is (in
conjunction with the number of frames per second) and the rendering
(fluid, jerky...) of the animation.
Here you set the number of frames per second (fps) as well as
whether the animation will loop, using the "Cycle" button.
The "frame preview" option is for viewing a given image according
to its position in the animation.
Saving the animation
"Save pics from animation"--Save each frame as a tiff file
after the animation has been calculated. You must first choose a
directory and a base_filename.tif. (The save works like
base_filename000.tif; base_filename001.tif, base_filename002.tif,
etc...). "Save pics when calculate" -- Save the same files,
corresponding to each frame, but at the same time as the animation
is calculated. You must choose the file name before running
"calculate". This option gives you a much better color quality in
You call up this dialog by clicking "Execute xmrm_mpeg". You then
choose the first and last images of the animation using the "choose
start/stop frame" button, and click GO to start the final operation
for making the mpeg animation.
You can also create a loop, and start mpeg_play as soon as the mpeg
Create a morphing quickly
First, here are the two images you can download if you want the
same ones as in the example:
01.tif and 02.tif (90 kb
Click "Load Source" and load 01.tif, then "Load Destination" to
With the "Set vector" tool, do a tracing around the baby.
To use this tool, click the left mouse button, drag to draw the
vector, and release when you have the desired length.
You will see that one of the arrows at the top of the baby's head
is green. This is a reference point, which helps you draw and
position the same number of vectors on the destination image as on
the source. After we've finished the tracing on the first image,
when we start on the second, the tracing will have a green arrow
along the first line, and so make the job easier.
Here are the parameters I used to get an interesting result:
- Simple morph
- Border vector
- use wavelets
- The cursor "wavelet interpolation levels" raised to 3/4.
- The Morphing-progress rectilinear and centered
- Number of frames: 50
- "Animation sequence" checked and 25 fps
Now click "calculate" to generate the animation; you can view it
with the "animate" button to, and make modifications. Be careful:
rerunning "calculate" erases the previous animation.
Once you have a satisfactory result, check "save pics from
animation" and choose a file name and a directory. Here you will
save the 50 .tif files that are generated by the "ready" command in
the dialog box you open with "choose filename".
Last operation: Click "Execute xmrm_mpeg", choose filename000.tif
as the START-frame and filename049.tif as the LAST-frame and click
"GO" to create the mpeg file. This file will be called filename.mpg
and will be located in the same directory as the 50 tif files.
This animation (in full size) is downloadable here as mpg-file or as
Editors note: The compilation of xmrm with recent Linux distributions
is not straight forward. We have therefore compiled a list of tips:
Talkback form for this article
Every article has its own talkback page. On this page you can submit a comment or look at comments from other readers:
2001-09-04, generated by lfparser version 2.17