Stitching image on given canvas size ? [SOLVED]
Stitching image on given canvas size ? [SOLVED]
I currently am trying to do the following with Image Magick:
I would like to do the following using image magick:
1. set a specific canvas size, say 1056x576 for example
2. Take one image, this one for example.: https://dl.dropbox.com/u/14586156/stuff ... %20001.gif
3. Have image magick stitch this image multiple times over said canvas so it will look like this.: https://dl.dropbox.com/u/14586156/stuff ... result.gif
I would like to do the following using image magick:
1. set a specific canvas size, say 1056x576 for example
2. Take one image, this one for example.: https://dl.dropbox.com/u/14586156/stuff ... %20001.gif
3. Have image magick stitch this image multiple times over said canvas so it will look like this.: https://dl.dropbox.com/u/14586156/stuff ... result.gif
Last edited by Rye on 2013-03-08T05:33:40-07:00, edited 1 time in total.
Version: ImageMagick-7.0.7-28-Q16-x64-static http://www.imagemagick.org
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
- fmw42
- Posts: 25562
- Joined: 2007-07-02T17:14:51-07:00
- Authentication code: 1152
- Location: Sunnyvale, California, USA
Re: Stitching image on given canvas size using ImageMagic ?
This would be the command
convert -size 1056x576 tile:Castillo_001.gif Castillo_tiled.gif
except your image does not conform to be tiled as it is does not wrap nor is it cropped to avoid seams. You need to crop out a section that will repeat without a seam.
So crop the image something like this:
Now run this unix set of commands.
width=1056
height=576
infile="Castillo_001_crop2.gif"
hh2=`convert $infile -format "%[fx:h/2]" info:`
convert $infile \
\( -clone 0 -roll +0+${hh2} \) +append \
-write mpr:cell +delete \
-size ${width}x${height} tile:mpr:cell \
Castillo_001_tiles.gif
see
http://www.imagemagick.org/Usage/canvas/#tile_memory
convert -size 1056x576 tile:Castillo_001.gif Castillo_tiled.gif
except your image does not conform to be tiled as it is does not wrap nor is it cropped to avoid seams. You need to crop out a section that will repeat without a seam.
So crop the image something like this:
Now run this unix set of commands.
width=1056
height=576
infile="Castillo_001_crop2.gif"
hh2=`convert $infile -format "%[fx:h/2]" info:`
convert $infile \
\( -clone 0 -roll +0+${hh2} \) +append \
-write mpr:cell +delete \
-size ${width}x${height} tile:mpr:cell \
Castillo_001_tiles.gif
see
http://www.imagemagick.org/Usage/canvas/#tile_memory
Re: Stitching image on given canvas size using ImageMagic ?
Sure, I understand it is very possible WITH CROPPING.
However I don't want to crop.
I need a solution that doesn't involve cropping.
(I'd have to crop 600 images so this is not an option).
Thanks for your answer
However I don't want to crop.
I need a solution that doesn't involve cropping.
(I'd have to crop 600 images so this is not an option).
Thanks for your answer
Version: ImageMagick-7.0.7-28-Q16-x64-static http://www.imagemagick.org
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: Stitching image on given canvas size using ImageMagic ?
As a general problem: we have a repeating pattern, like a wallpaper. The pattern does not repeat exactly. How do we overlap the pieces so the pattern matches in the best way?
One approach: for this example, we need to examine horizontal positions only. Try overlap with offsets +1, +2, ... +width-1. At each position, "-composite difference". The best match is where the result is darkest.
That gives us the horizontal overlap offset. Repeat for the vertical overlap.
One approach: for this example, we need to examine horizontal positions only. Try overlap with offsets +1, +2, ... +width-1. At each position, "-composite difference". The best match is where the result is darkest.
That gives us the horizontal overlap offset. Repeat for the vertical overlap.
snibgo's IM pages: im.snibgo.com
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: Stitching image on given canvas size using ImageMagic ?
The theory sounded good. Does it actually work? Windows script:
Yeah, perfect result.
Code: Select all
setlocal enabledelayedexpansion
set SRC=Castillo001.gif
FOR /F "tokens=1,2" %%i IN ('%IM%identify -ping -format "%%w %%h" %SRC%') DO (
set WIDTH=%%i
set HEIGHT=%%j
)
set /A wm1=%WIDTH%-1
set /A MinGray=999999
set /A OffsAtMin=0
FOR /L %%a in (1,1,%wm1%) DO (
set OFFSET=%%a
"%IMG%convert" ^
%SRC% ^
^( +clone -geometry +!OFFSET!+0 ^) ^
-compose Difference -composite ^
-crop 1x%HEIGHT%+!OFFSET!+0 ^
-resize "1x1^!" ^
-modulate 100,0,100 -alpha off ^
txt:gray.txt
rem What is the grey value at this offset?
for /F "eol=# tokens=3 delims=,() " %%b in (gray.txt) do set grey=%%b
if !MinGray! GTR !grey! (
set MinGray=!grey!
set OffsAtMin=!OFFSET!
)
echo grey !MinGray! at offset !OffsAtMin!
)
echo grey %MinGray% at offset %OffsAtMin%
rem Result is "grey 11 at offset 128".
rem So we can crop horizontally at offset 128 for a repeating pattern.
rem Do likewise for vertical repeat. For fun, let's pretend it repeats at 128 vertically.
"%IMG%convert" ^
%SRC% ^
-crop %OffsAtMin%x128+0+0 +repage ^
cropped.png
"%IMG%convert" ^
-size 1056x576 ^
tile:cropped.png ^
tiled.png
snibgo's IM pages: im.snibgo.com
- anthony
- Posts: 8883
- Joined: 2004-05-31T19:27:03-07:00
- Authentication code: 8675308
- Location: Brisbane, Australia
Re: Stitching image on given canvas size using ImageMagic ?
there are two ways.
one is to try and overlap images so as to cover the whole canvas. That can be tricky as the images may not overlap squarely or may not form a regular pattern.
The second is to try and automatically from the tiling pattern (perhaps rotating do it is aligned properly).
This is tricky, but may be do able.
One solution for the second method ise to possibly use FFT (Fast Fourier Transform). This may be able to locate the repeating pattern and also find the closest orthogonal (axis aligned) separation of the tiles. In other words, it should let you find the overall pattern and then simplify (rotate) and replicate it to a larger canvas.
This can take some work but seems the best course of action. Just needs -- time -- which I do not have.
Here is a photo I took of another repeating pattern, which makes a good test image...
The vignette lighting effect you see is sun-dappling from trees.
I'd like to see what people come up with
one is to try and overlap images so as to cover the whole canvas. That can be tricky as the images may not overlap squarely or may not form a regular pattern.
The second is to try and automatically from the tiling pattern (perhaps rotating do it is aligned properly).
This is tricky, but may be do able.
One solution for the second method ise to possibly use FFT (Fast Fourier Transform). This may be able to locate the repeating pattern and also find the closest orthogonal (axis aligned) separation of the tiles. In other words, it should let you find the overall pattern and then simplify (rotate) and replicate it to a larger canvas.
This can take some work but seems the best course of action. Just needs -- time -- which I do not have.
Here is a photo I took of another repeating pattern, which makes a good test image...
The vignette lighting effect you see is sun-dappling from trees.
I'd like to see what people come up with
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
https://imagemagick.org/Usage/
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: Stitching image on given canvas size using ImageMagic ?
Rye's image repeats almost exactly both horizontally and vertically, at fixed distances. Anthony's image is real-world: axes are not orthogonal, neither x or y, the repetition distances are not equal, and probably not even in straight lines.
Here is a first stab at analysis.
I extend my above script to evaluate all possible offsets, both x and y. It finds the average difference in the area that overlaps the original, and the original offset by (x,y). The Windows script takes 2.5 hours; a compiled program might take around a minute.
The result is the same size as the input. Darker pixels indicate a close match at that (x,y) offset; lighter pixels are worse matches. The top-left pixel is exactly black because the image matches itself at (0,0) offset. Bottom-right is noisy as the overlapping area is small.
grays.png: https://www.dropbox.com/s/cgys9wt4mztv09t/grays.png
graysHL.png, with some troughs highlighted by hand: https://www.dropbox.com/s/lc5uqo5v4rze8k7/graysHL.png
We can see the pattern of repeats. More usefully, we could extract the coordinates of the centre of each trough. We could then find the closest troughs to (0,0), and associate each of those with troughs at roughly the same distance and angle from the first. Then a distort map can be built so the repeats are at exactly the same distance and angle as each other.
Here is a first stab at analysis.
I extend my above script to evaluate all possible offsets, both x and y. It finds the average difference in the area that overlaps the original, and the original offset by (x,y). The Windows script takes 2.5 hours; a compiled program might take around a minute.
The result is the same size as the input. Darker pixels indicate a close match at that (x,y) offset; lighter pixels are worse matches. The top-left pixel is exactly black because the image matches itself at (0,0) offset. Bottom-right is noisy as the overlapping area is small.
Code: Select all
convert grays.txt -auto-level grays.png
graysHL.png, with some troughs highlighted by hand: https://www.dropbox.com/s/lc5uqo5v4rze8k7/graysHL.png
We can see the pattern of repeats. More usefully, we could extract the coordinates of the centre of each trough. We could then find the closest troughs to (0,0), and associate each of those with troughs at roughly the same distance and angle from the first. Then a distort map can be built so the repeats are at exactly the same distance and angle as each other.
snibgo's IM pages: im.snibgo.com
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: Stitching image on given canvas size using ImageMagic ?
I should have set "-depth 16" in the script, to retain precision.
The troughs nearest to (0,0) are at (87,12) and (35,82). So we can crop that area, and repeat it as often as we like.
g2.png: https://www.dropbox.com/s/dqxj4u7y7w9j75y/g2.png
This process could have been started by cropping an area, either from a corner or the centre, and doing a sub-image search to find the pattern. But how large should that crop be? Ideally it would be the size of the repetition (87x82 if we examine the top-left), and we don't know that until we do some work. We could guess, then iterate if the guess turns out too large or too small.
The troughs nearest to (0,0) are at (87,12) and (35,82). So we can crop that area, and repeat it as often as we like.
Code: Select all
set SRC=tiles_closeup_sm.jpg
"%IMG%convert" ^
%SRC% ^
-crop 87x82+0+0 +repage ^
cropped.png
rem 87+35=122
rem 12+82=94
"%IMG%convert" ^
-size 200x200 xc:pink ^
cropped.png -composite ^
cropped.png -geometry +87+12 -composite ^
cropped.png -geometry +35+82 -composite ^
cropped.png -geometry +122+94 -composite ^
g2.png
This process could have been started by cropping an area, either from a corner or the centre, and doing a sub-image search to find the pattern. But how large should that crop be? Ideally it would be the size of the repetition (87x82 if we examine the top-left), and we don't know that until we do some work. We could guess, then iterate if the guess turns out too large or too small.
snibgo's IM pages: im.snibgo.com
- anthony
- Posts: 8883
- Joined: 2004-05-31T19:27:03-07:00
- Authentication code: 8675308
- Location: Brisbane, Australia
Re: Stitching image on given canvas size using ImageMagic ?
snibgo wrote:AOne approach: for this example, we need to examine horizontal positions only. Try overlap with offsets +1, +2, ... +width-1. At each position, "-composite difference". The best match is where the result is darkest.
Hmmm that sounds more like a sub-image search using itself!!!!
Assuming the tile pattern is smaller than 50% of the input image (it would be pretty bad if it wasn't)...
Code: Select all
convert "Castillo 001.gif" \( +clone -crop 50%x+0+0 \) miff:- |
compare -subimage-search - miff:- |
convert - -delete 0 tile_search_result.png
Resulting in...
NOTE: This is VERY slow. But even so, on my 8 core machine completed in -- 11.5 seconds!
WARNING: the image for some reason contains a random transparency! This is a bug, as the gray scale map should not contain any transparency. I re-processed the above image to simply turn off alpha channel.
The result is also not just a simple difference of grayscale values, but the length of the color different vector (RMSE), as such it should work well even for images with little grayscale variance.
You can get the same result with "composite Difference" using a difference of individual color channels, which is then squared, added and square-root.
For large image compares a FFT convolution would be better. Fred, can you provide an equivalent FFT example?
One point. this time determination only determined the size and relative offsets of the tile pattern. It does NOT try to center the main part (high entropy) of the tile in the center of the tile, so that the low entropy areas (background areas) are used along the borders of the tile.
Extracting the tile appropriatally would be the next step. As would any rotation correction, and edge blending
Hmmm.... Do I hear a script in the making here... Fred?
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
https://imagemagick.org/Usage/
- anthony
- Posts: 8883
- Joined: 2004-05-31T19:27:03-07:00
- Authentication code: 8675308
- Location: Brisbane, Australia
Re: Stitching image on given canvas size using ImageMagic ?
Repeating with my far more complicated image...
Time: 1 minute 52.0 seconds
Not as good a result, probably as the image needs perspective and barrel distortion fixing.
But an upper-left tile could be determined.
A better result may be possible using a center crop (to get a centered tile pattern) and a determination of distances between match peaks.
Time: 1 minute 53.4 seconds (not surprising same image sizes)
the bright spot is of course the offset of the 50% centered crop relative to the top left corner, which works out to be the center of the 'quarter image map'.
One pre-step may be to first determine a high entropy area so that you can extract a smaller sub-image from the original image, and still be sure you file matching tiling points. A smaller sub-image will generate a larger 'map' image, and (cross fingers) be a bit faster in sub-image searching. Finding such high entropy sub-images was part of my work in another topic "Overlapping Images", and this is highly relevent. In this case you want a high entropy sub-image near the center of the original image, rather than the edge as I needed in finding overlaps.
See viewtopic.php?f=1&t=22526
Regardless a center crop does let you see the hexagonal tile pattern that is present, and can more easily determine the size, relative offsets, and orientation of those tiles for extraction, rotation and blending.
Anyone like to give the extraction and blending step a go?
Code: Select all
time convert tiles_closeup_sm.jpg \( +clone -crop 50%x+0+0 \) miff:- |
compare -subimage-search - miff:- |
convert - -delete 0 -alpha off tile_search_result_2.png
Time: 1 minute 52.0 seconds
Not as good a result, probably as the image needs perspective and barrel distortion fixing.
But an upper-left tile could be determined.
A better result may be possible using a center crop (to get a centered tile pattern) and a determination of distances between match peaks.
Code: Select all
time convert tiles_closeup_sm.jpg \( +clone -gravity center -crop 50% \) miff:- |
compare -subimage-search - miff:- |
convert - -delete 0 -alpha off tile_search_result_3.png
Time: 1 minute 53.4 seconds (not surprising same image sizes)
the bright spot is of course the offset of the 50% centered crop relative to the top left corner, which works out to be the center of the 'quarter image map'.
One pre-step may be to first determine a high entropy area so that you can extract a smaller sub-image from the original image, and still be sure you file matching tiling points. A smaller sub-image will generate a larger 'map' image, and (cross fingers) be a bit faster in sub-image searching. Finding such high entropy sub-images was part of my work in another topic "Overlapping Images", and this is highly relevent. In this case you want a high entropy sub-image near the center of the original image, rather than the edge as I needed in finding overlaps.
See viewtopic.php?f=1&t=22526
Regardless a center crop does let you see the hexagonal tile pattern that is present, and can more easily determine the size, relative offsets, and orientation of those tiles for extraction, rotation and blending.
Anyone like to give the extraction and blending step a go?
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
https://imagemagick.org/Usage/
- anthony
- Posts: 8883
- Joined: 2004-05-31T19:27:03-07:00
- Authentication code: 8675308
- Location: Brisbane, Australia
Re: Stitching image on given canvas size using ImageMagic ?
For locating the peaks see the rough notes in
IM Examples, Comparing Images...
http://www.imagemagick.org/Usage/compare/#peak_finding
IM Examples, Comparing Images...
http://www.imagemagick.org/Usage/compare/#peak_finding
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
https://imagemagick.org/Usage/
Re: Stitching image on given canvas size using ImageMagic ?
Hmm... I tried to get that command working under windows, however it will do me no good.snibgo wrote:The theory sounded good. Does it actually work? Windows script:Yeah, perfect result.Code: Select all
setlocal enabledelayedexpansion set SRC=Castillo001.gif FOR /F "tokens=1,2" %%i IN ('%IM%identify -ping -format "%%w %%h" %SRC%') DO ( set WIDTH=%%i set HEIGHT=%%j ) set /A wm1=%WIDTH%-1 set /A MinGray=999999 set /A OffsAtMin=0 FOR /L %%a in (1,1,%wm1%) DO ( set OFFSET=%%a "%IMG%convert" ^ %SRC% ^ ^( +clone -geometry +!OFFSET!+0 ^) ^ -compose Difference -composite ^ -crop 1x%HEIGHT%+!OFFSET!+0 ^ -resize "1x1^!" ^ -modulate 100,0,100 -alpha off ^ txt:gray.txt rem What is the grey value at this offset? for /F "eol=# tokens=3 delims=,() " %%b in (gray.txt) do set grey=%%b if !MinGray! GTR !grey! ( set MinGray=!grey! set OffsAtMin=!OFFSET! ) echo grey !MinGray! at offset !OffsAtMin! ) echo grey %MinGray% at offset %OffsAtMin% rem Result is "grey 11 at offset 128". rem So we can crop horizontally at offset 128 for a repeating pattern. rem Do likewise for vertical repeat. For fun, let's pretend it repeats at 128 vertically. "%IMG%convert" ^ %SRC% ^ -crop %OffsAtMin%x128+0+0 +repage ^ cropped.png "%IMG%convert" ^ -size 1056x576 ^ tile:cropped.png ^ tiled.png
I have ImageMagick installed on my machine, put the bat (this script you wrote) and the image file in the same directory.
However when I now call this script it tells me:
- command "identify" not found
- Illegal Parameter - - crop
- Illegal Parameter - 1056x576
Am I doing something wrong ? Is there anything you have to consider while trying to runs such script ?
BTW: AWESOME feedback ! Never thought to get so many productive answers.
Thanks alot !
Version: ImageMagick-7.0.7-28-Q16-x64-static http://www.imagemagick.org
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: Stitching image on given canvas size using ImageMagic ?
What happens when you type the commandRye wrote:- command "identify" not found
Code: Select all
identify -version
It should say something like "Version: ImageMagick 6.7.9-6 2012-09-13 Q16 http://www.imagemagick.org". If it says "'identify' is not recognized as an internal or external command, operable program or batch file" then Windows doesn't know where the program is.
Most people install ImageMagick ticking the box saying "Add directory to system path".
Personally, I don't. Instead, I use environment variables IM and IMG to point to IM's directory.
snibgo's IM pages: im.snibgo.com
Re: Stitching image on given canvas size using ImageMagic ?
I reinstalled ImageMagick with said checkbox disabled...
The erros I said still occur.
Typing identify -version yields:
The command "identify" is either written incorrectly or couldn't be found.
Also that command that is suggested at the installation:
only outputs:
Illegal Parameter - wizard.jpg
Illegal Parameter - win
typing imdisplay only yields:
The command "imdisplay is either written incorrectly or couldn't be found.
I used this installation package: ftp://ftp.imagemagick.org/pub/ImageMagi ... 86-dll.exe
What in the world is going on... ?
The erros I said still occur.
Typing identify -version yields:
The command "identify" is either written incorrectly or couldn't be found.
Also that command that is suggested at the installation:
Code: Select all
convert wizard: wizard.jpg
convert wizard.jpg win
Illegal Parameter - wizard.jpg
Illegal Parameter - win
typing imdisplay only yields:
The command "imdisplay is either written incorrectly or couldn't be found.
I used this installation package: ftp://ftp.imagemagick.org/pub/ImageMagi ... 86-dll.exe
What in the world is going on... ?
Version: ImageMagick-7.0.7-28-Q16-x64-static http://www.imagemagick.org
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: Stitching image on given canvas size using ImageMagic ?
I suggest you reinstall with the checkbox _enabled_.Rye wrote:I reinstalled ImageMagick with said checkbox disabled...
What version of Windows are you running? Are you running the commands in a "command prompt" window?
What happens when you type:
Code: Select all
"c:\program files\imageMagick-6.8.3-Q16\identify" -version
snibgo's IM pages: im.snibgo.com