Convert images from two lists

Questions and postings pertaining to the usage of ImageMagick regardless of the interface. This includes the command-line utilities, as well as the C and C++ APIs. Usage questions are like "How do I use ImageMagick to create drop shadows?".
Post Reply
slowhand1980
Posts: 4
Joined: 2011-02-25T09:17:15-07:00
Authentication code: 8675308

Convert images from two lists

Post by slowhand1980 »

I'm new to imagemagick, I'm using ImageMagick 6.6.7-9 Q16 version.
Finally I was able two averaging a set of images with the command

Code: Select all

convert -average image*.jpg output.jpg
Now I would to know if is it possiblo to convert, automatically, images from two different sets, somthing that can automate this:

Code: Select all

convert -average x1.jpg y1.jpg xy1.jpg
convert -average x2.jpg y1.jpg xy2.jpg
convert -average x3.jpg y1.jpg xy3.jpg
convert -average x4.jpg y1.jpg xy4.jpg
....
convert -average xn.jpg y1.jpg xyn.jpg
if I were working in java I would have done simething like this:

Code: Select all

for (i=1; i<imagenumber; i++){
convert -average xi.jpg yi.jpg xyi.jpg
}
is it possible?

thanks
User avatar
fmw42
Posts: 25562
Joined: 2007-07-02T17:14:51-07:00
Authentication code: 1152
Location: Sunnyvale, California, USA

Re: Convert images from two lists

Post by fmw42 »

convert -average image*.jpg output.jpg
Proper syntax has the input images first

convert image*.jpg -average output.jpg

also -average is deprecated in favor of -evaluate-sequence average

With regard to using lists, IM can take lists of input images, but not the way you want them as far as I know. You can use the @file.txt as input to IM such as:

convert @file.txt -average output.jpg

That takes all images in file1.txt as input.

I don't know that you can take one image from each list without using shell scripting. As far as I know there is no way to index into a list directly within IM for doing what you want.
slowhand1980
Posts: 4
Joined: 2011-02-25T09:17:15-07:00
Authentication code: 8675308

Re: Convert images from two lists

Post by slowhand1980 »

can someone help me to create a shell script like this one in Java?

Code: Select all

for (i=1; i<imagenumber; i++){
convert -average xi.jpg yi.jpg xyi.jpg
}
User avatar
anthony
Posts: 8883
Joined: 2004-05-31T19:27:03-07:00
Authentication code: 8675308
Location: Brisbane, Australia

Re: Convert images from two lists

Post by anthony »

slowhand1980 wrote:Now I would to know if is it possiblo to convert, automatically, images from two different sets, somthing that can automate this:

Code: Select all

convert -average x1.jpg y1.jpg xy1.jpg
convert -average x2.jpg y1.jpg xy2.jpg
convert -average x3.jpg y1.jpg xy3.jpg
convert -average x4.jpg y1.jpg xy4.jpg
....
convert -average xn.jpg y1.jpg xyn.jpg
A slightly tricky solution...

Code: Select all

convert x*.jpg null: y*.jpg  -compose blend -define compose:args=50x50 -layers composite z%d.jpg
I did not use 'xy' for the output so as to not muck up image reading (the "x*.jpg") when repeating the above command.

See Layers Composition for composition with two image lists
http://www.imagemagick.org/Usage/anim_mods/#composite

And Blend for weighted addition composition (average = 50x50 composition)
http://www.imagemagick.org/Usage/compose/#blend

One point ALL the images will be in memory at some point, so watch your memory limits, or IM will swicth to a VERY slow disk caching method.

Another alturnative is to 'append' all the images into two single images, average (or whatever), then tile crop them back into individual images. I have used this technique in the past to to do things like: a 'difference' of two animations, to append two image sequences, generate common color maps or count up all unique color over all images, etc..
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
slowhand1980
Posts: 4
Joined: 2011-02-25T09:17:15-07:00
Authentication code: 8675308

Re: Convert images from two lists

Post by slowhand1980 »

thank yu so much, by the way I've solved with this script:

Code: Select all

#!/bin/bash
for((i=0; i<10; i++)); do
touch file$i.log
convert x$i.jpg y$i.jpg -evaluate-sequence Mean xy$i.jpg
done

thanks to you now I can try also with this one

Code: Select all

#!/bin/bash
for((i=0; i<10; i++)); do
touch file$i.log
convert x$i.jpg null: y$i.jpg  -compose blend -define compose:args=50x50 -layers composite z$i.jpg
done
User avatar
anthony
Posts: 8883
Joined: 2004-05-31T19:27:03-07:00
Authentication code: 8675308
Location: Brisbane, Australia

Re: Convert images from two lists

Post by anthony »

slowhand1980 wrote:thanks to you now I can try also with this one

Code: Select all

#!/bin/bash
for((i=0; i<10; i++)); do
touch file$i.log
convert x$i.jpg null: y$i.jpg  -compose blend -define compose:args=50x50 -layers composite z$i.jpg
done
No need for loop with -layers composite. It merges two sequences (separated by null:) together.
Assuming you do not have xy*.jpg images in the current directory!

Code: Select all

convert x*.jpg null: y*.jpg  -compose blend -define compose:args=50x50 -layers composite z%d.jpg
If you were using a loop this is the simpler two image (rather that tw image sequence) composition

Code: Select all

convert x$i.jpg y$i.jpg  -compose blend -define compose:args=50x50 -composite z$i.jpg
No null: and no layers.
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
slowhand1980
Posts: 4
Joined: 2011-02-25T09:17:15-07:00
Authentication code: 8675308

Re: Convert images from two lists

Post by slowhand1980 »

Can you explain the "null:" function?
User avatar
anthony
Posts: 8883
Joined: 2004-05-31T19:27:03-07:00
Authentication code: 8675308
Location: Brisbane, Australia

Re: Convert images from two lists

Post by anthony »

It just generates a 'special' image that is generally used as place holders

For example in "montage" a null: image creates a blank tile in the montage output.

It is also a 'marker' for 'null results' such as when a -crop misses the actual image generating a invalid result.

In -layers composite it is used to mark the end of the destination image sequence, and the start of the source image sequence. What the two sequences are then 'composed' together in pairs, until all the image of one sequence runs out. If one of those sequences is a single image, that image is composed with all the other images in the other image sequence. That is whay a loop is not needed, as IM will loop though all the images in memory.

ASIDE: The composition understand -geometry and -gravity for 'global' positioning of the source image sequence (according to its virtual canvas), while image virtual offsets position individual images relative to that virtual canvas position.
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
Post Reply