Besides the fact that it was a pain to find out how ImageMagick’s -average option is to be used, it turned out to operate wrongly. The switch calculates the mean of an image sequence, i.e. the mean color values for every pixel. Say, if you have a bunch of images with file names like img*.jpg and want the average saved into avg.jpg, the command line is:
$ convert img*jpg -average avg.jpg
Pretty intuitive. The problem is that you define the mean image Ī[n] of n images I[k] as
while ImageMagick does it recursively as
(with Ĩ[1]=I[1]),
giving you wrong weights 1⁄2n−k+1 like e.g. for n=8
instead of the intended weights 1⁄n like
.
This misbehaviour can be proven e.g. by taking this sequence of a plain blue, green and red image:
and averaging it with the above command. The result is too reddish:
The solution I found was to call convert recursively like this:
#!/bin/bash
i=0
for file in img*jpg; do
echo -n "$file.. "
if [ $i -eq 0 ]; then
cp $file avg.jpg
else
convert $file avg.jpg -fx "(u+$i*v)/$[$i+1]" avg.jpg
fi
i=$[$i+1]
done
By this, the average of the above example images correctly becomes gray:
There might be similar problems with the other image sequence operators, but I haven’t examined them. Maybe I should file a bug.
I love such writeups,short,simple! RT @paux: blogged: Averaging an image sequence with ImageMagick http://7ax.de/0xdq #imageprocessing #bug
Tracked: May 02, 21:06
Tracked: Jan 27, 10:35