On the basis of the previous posts, this posts presents a method of generating a digital contact sheet using another ImageMagick command,
montage. It can be used for pure images, or as I like to do, create a contact sheet with the images and their intensity histograms. Like many commands there are a myriad of options, but a basic use of montage might be:
montage *.png -geometry 200x150 -tile 8x5 contact.png
This takes all PNG files in the current directory and creates an 8×5 montage (8 columns by 5 rows) with 200×150 thumbnails of the images, and saves the montage in a file named
contact.png. This will hold 40 images, and if there are more than this, they spill over into a second image. This is a little bit awkward, so to make things nicer, we can write a script to process the images. Below is a
bash shell script called
#!/bin/bash ls *.png > imglist read nImgs <<< $(sed -n '$=' imglist) let nrows=nImgs/8 let lefto=nImgs%8 if [ $lefto -gt 0 ] then let nrows=nrows+1 fi montage @imglist -geometry 200x150 -tile 8x$nrow $1 rm imglist
Now let’s look through this script based on what each line does.
- Line 1 Identifies the script as a
- Line 2 uses the
lscommand to list all the PNG image files in the current directory, and outputs the list to a text file called
imglist. The files will be sorted in alphabetical order.
- Line 3 counts the number of lines in the file
imglist, using the
sed(stream editor) command,
sed -n '$=' imglist. The number of lines represents the number of PNG files, as there is one filename per line. The number of files calculated is stored in the variable
- Line 4 calculates the number of rows by dividing
nImgsby 8, and stores the value in the variable
nrows(assuming we want 8 images across in the montage). This will produce an integer result. For example if the number of images is 41, then 41/8 = 5.
- Line 5 calculates the leftover from the division of
nImgsby 8, and stores it in the variable
lefto. For example 41%8 = 1.
- Line 6 questions if the leftover, i.e. the value in
lefto, is greater than 0. If it is, it indicates a extra row should be added to the variable
nrows(Line 8). This deals with the issue of montage creating an extra image should the number of images go beyond the 8×5 tiles.
- Line 10, generates the contact sheet using
montage. It uses the list in
imglist, and uses the variable
nrowsto specify the number of rows in the montage, i.e.
$1at the end of the command is the output filename for the montage, which is specified when
contactsheetis run, for example (result shown in Fig.1):
- Line 11 deletes the file containing the list of images.
It may seem quite complicated, but once you get the hang of it, writing these scripts save a lot of time. If you have a folder with a lot of images in it, then you may prefer to produce a series of smaller contact sheets, in which case the script becomes much simpler. In the simpler version below, the tile size remains at 8×5. So 190 images would produce 5 contact sheets.
#!/bin/bash ls *.png > imglist montage @imglist -geometry 200x150 -tile 8x5 $1 rm imglist
There are lots of things which can be customized. Perhaps you want smaller images, which can be achieved by modifying the geometry size. Or perhaps you want each image in the montage labelled? Or perhaps you want to process JPGs?