While playing around on the last post for averaging long exposure images, I stumbled across something interesting. Apparently Imagemagick can open video files. At that point I just had to have a go at averaging some music videos.
The results were … interesting to say the least.
Some of them were really cool though. For instance here’s Beyoncé’s “All the Single Ladies”:
Beyoncé - “All the Single Ladies” (5955 frames)
Or kicking it a little old school produces some greats.
Here's A-ha’s “Take On Me”:
A-Ha - “Take On Me” (6807 frames)
“Tonight, Tonight” from The Smashing Pumpkins:
The Smashing Pumpkins - “Tonight, Tonight” (6475 frames)
I couldn't help but mess around and try some more recent videos as well, of course.
Not surprisingly, Gotye’s “Somebody That I Used to Know’ looks exactly like you'd expect:
Gotye - “Somebody That I Used to Know” (6099 frames)
Of course, I had to do Robin Thicke’s “Blurred Lines” video, for (ahem ) science:
Robin Thicke - “Blurred Lines” (6235 glorious NSFW frames)
PinkBillboards Woman of the Year, Pink, yielded some interesting results:
Pink - “Blow Me (One Last Kiss)” (5535 frames)
Pink - “Try” (5972 frames)
Pink - “Just Give Me a Reason” (5814 frames)
Pink - “True Love” (5803 frames)
I find it interesting that if you’re familiar at all with these videos, the blends immediately evoke the sense of what you’ll see watching them.
Die AntwoordAlmost completely on the other side of the musical spectrum, we have Die Antwoord. I want to send a special “Thank You!” to Boing Boinger Xeni Jardin for turning me onto these guys (I consider it telling that I’ve lost count of the cool things that Boing Boing has led me to over the years).
If you haven’t had a chance to give them a listen, do it.
Die Antwoord - “Enter the Ninja” (7805 frames)
Die Antwoord - “Rich Bitch” (4402 frames)
Die Antwoord - “Evil Boy” (6961 frames)
Die Antwoord - “I Fink You Freeky” (5865 frames)
Die Antwoord - “Fatty Boom Boom” (8554 frames)
I like “Fatty Boom Boom” because it really looks like the video sounds. Hectic.
Die Antwoord - “Cookie Thumper” (8459 frames)
Creating TheseI did mention back at the beginning that it was cool I could load video files directly into Imagemagick. Just one problem: IM likes to load up the entire set of files before doing further operations against them. So trying to load up a full HD video in memory didn't work so well. SD videos loaded, but took forever to process.
To speed it up I just dumped the videos to files first, then operated on them in batches.
You'll need FFmpeg and Imagemagick, of course. I also happen to be using Cygwin, because I'm more comfortable doing things in a bash shell vs. windows command line.
Dumping the VideoI dumped the video using ffmpeg:
ffmpeg -i INFILE -y -f image2 output_%05d.png
This is fairly self-explanatory. The %05d tells ffmpeg to name each file with 5 digits sequentially.
So now I have a directory of files called output_00001.png, output_00002.png, etc.
Batch AveragingAs I said, IM will choke up if you try to load it with too much data (thousands of 1080p frames for instance). So I did a first pass of averaging by only generating the averages for 100 files at a time:
ls output_*.png | xargs -n 100 sh -c 'convert "$0" "$@" -evaluate-sequence mean outdir/"$0" '
Don't worry, it's not so as it looks. Let's break it down:
ls output_*.png | …
Generate a list of files in the directory name output_*.png. Then pipe that list into...
xargs -n 100 sh -c
xargs is used to build a command up. The -n 100 switch tells it to use 100 items from the piped list (all the filenames from the ls command) at a time.
Spawn a shell, and run this command:
convert "$0" "$@" -evaluate-sequence mean outdir/"$0"
This just runs the previous imagemagick command to mean average the images. $0 is the first in the list, $@ are the rest.
Then output the results into the directory “outdir”, with the file named the first in the list.
In my “outdir” directory, there are now a bunch of files with names like “output_00000.png, output_00100.png, output_00200.png” etc. These are averages of 100 frames from my video at a time.
In that directory, it's now trivial to get the final average:
convert output_*.png -evaluate-sequence mean -channel RGB -normalize final.png
This will generate the final mean average from all of the images we output previously. The inclusion of “-channel RGB -normalize” is to automatically normalize the results on a per-channel basis.
Batch Averaging (Windows Command Line)Reader Belzecue has noted below a means for doing the first run batch averaging with just the windows command line:
FOR /L %i in (0,1,8) DO convert c:\inputpath\output_0%i*.png -evaluate-sequence mean -channel RGB -normalize c:\outputpath\final_0%i.png
The magic part is the options in the FOR command (0,1,8). Basically it means, start counting at 0, increment by 1, and stop at 8. Couple that with the globbing for filename “output_0%i*.png”, and that command will batch up 9 images, averaged across 1000 items at a time.
(The result to the command line will be output_00*.png, output_01*.png, output_02*.png, etc…)
Thanks for the tip!