Image Stitching Software Problems

bubblesort

Well-known member
Joined
Nov 16, 2018
Messages
1,993
I've been getting into virtual cartography lately. There are many different ways to make maps, but my process is pretty simple. I screen cap from the world map web site, then line the caps up in photoshop, draw some vectors on them, and end up with things like this, which I can then put words and lines on.



Old Bellisseria isn't a massive area, and my technique does not require pixel perfect screen cap stitching, so I just lined stuff up by hand and drew over it.

I want to work with larger land masses now, though, so I want to stitch together massive amounts of screen caps, and do a map of all contiguous mainland continents. In the future I want to be able to just crop out the part of the mainland I want to work on from a huge high-rez screen capped map, and make my own map with it. On github, I found a python script that will pull down all the region map textures you want directly from the linden lab server, and stitch them together, but the script is not user friendly, so I decided to get the screen caps by hand and then use a program to stitch them together.

I thought this should be easy, because photo stitching software is really good with photographs now. Even my phone can stitch nice panoramas, and I have seen my astrophotography friends do amazing things with photo public domain stitching software from NASA. Turns out, photo stitching software is garbage for flat documents.

Here's what I've done so far, and why I'm hand stitching everything now:

I capped by going to maps.secondlife.com, closing the side bar, zooming into the area I want as far as possible, then hitting the little minus button on the top left hand corner to zoom out one step. Then I used the Windows 10 snipping tool to cap from the page. This is how I took every single screen cap that I want to stitch together. They are all the exact same scale and rotation, so there is no need to zoom or rotate or twist or otherwise mutilate my screen caps in order to stitch them together.

I tried Photoshop, Lightroom, and software from Microsoft called Image Composite Editor (AKA ICE), that was discontinued last year, but I found a link to download the last version here. Photoshop was an overly complicated process, but it worked ok. Lightroom gave pretty good results, but it was extremely slow. ICE gave the best results, it was easy to use, and it was fast.

All of these methods failed a lot. When it failed, I would have to try stitching together less screen caps at a time, or change the order of the regions I'm screen capping, and that would usually make it work, but sometimes I had to go back and re-cap entire regions to get it working. ICE was great when I capped from top to bottom, left to right, like a camera might scan, but it wasn't as good when I capped randomly. So using stitching software is time consuming, but it can still work... except...

The real problem is, all 3 of these methods twisted and pinched and resized and rotated my images, when they didn't need it, at all. My images are all the same scale, so they just need to be lined up. I never found a setting to do this. Photoshop's auto-aligner has a place where you can tell it to reposition only, but it fails often enough that it makes the process not worth my time.

If you want to see a demonstration of the two approaches, look at these two maps I made of the contiguous mainland (WARNING: Massive files. ICE is 22k and hand stitched is 26k). ICE did a better job than Photoshop and Lightroom, so this is the best I can do with stitching software, so far.

ICE Stitched Map
Hand Stitched Map

The one with the black background was made with ICE. It was so twisted after I let it align all the continents that I just aligned the continents by hand, after using ICE to make each continent map. So it's mostly ICE. The one with a transparent background was made by hand, from the ground up. I literally zoomed in to the pixel level and played with transparency, in order to line up every single screen cap by hand.



Look at how the ICE stitched map still twisted the continents, though. In this image, I put the northern continents side by side, and put a grid over them, to show that the ICE map on the left side twisted and rotated the screen caps so that the edges of the captures are no longer perfectly horizontal and vertical like in my hand stitched map on the right side.

On top of that, my hand stitched map has none of the weird discoloration the automated stitchers create. If I wanted to, I could just publish the hand stitched image as is. The one on the left isn't quite ready for prime time, though.

Hand stitching the entire mainland like this takes a full day, but so does fighting with the automated stitching software, and doing it by hand just gives a better result.

There has to be a better automated way to stitch images, but I can't find it. Does anybody have any suggestions?
 

Noodles

☑️
Joined
Sep 20, 2018
Messages
3,193
Location
Illinois
SL Rez
2006
Joined SLU
04-28-2010
SLU Posts
6947
Do your captires over lap with what part of the map they show?

Inwas just wondering because I THINK, there is a way to tell Photoshop (and similar) to align layers to a grid. So you could genericly drag and drop the images in place, then tell it to line them up and they would maybe snap to the grid.

Heck you may even be able to change the snap resolution of drag and drop and just do it. If they are (example), 500px wide each, you set snap to 500px, they will just drop in next to each other aligned.

I am not sure if that helps at all. I did some working with a map for a non SL coding project once, but Inwas doing the opposite of what you are doing. I had to take a complete map and break it into grids of various sizes for use with the Bing Maps overlay API.
 
  • 1Thanks
Reactions: bubblesort

bubblesort

Well-known member
Joined
Nov 16, 2018
Messages
1,993
Do your captires over lap with what part of the map they show?

Inwas just wondering because I THINK, there is a way to tell Photoshop (and similar) to align layers to a grid. So you could genericly drag and drop the images in place, then tell it to line them up and they would maybe snap to the grid.

Heck you may even be able to change the snap resolution of drag and drop and just do it. If they are (example), 500px wide each, you set snap to 500px, they will just drop in next to each other aligned.

I am not sure if that helps at all. I did some working with a map for a non SL coding project once, but Inwas doing the opposite of what you are doing. I had to take a complete map and break it into grids of various sizes for use with the Bing Maps overlay API.
My map screen caps are hand cropped off the web site. I hit the windows snipping tool, and draw a rectangle across the web site, with my mouse. So the caps aren't the exact same dimensions, but they are fairly close. You're right, though, I bet the automated stitchers would do it better if I could capture across a grid like that. I'd also have to find a way to capture exactly on the grid, which I don't do right now. I just eyeball it, to make sure the crops overlap enough to line up.

Technically, I think what I'm doing is a type of stitching called document mosaicing. At least, I think mosaicing is a type of stitching. Maybe not? Is a map a document or a picture? Maybe it's art mosaicing? Mosaic algorithms are the type of thing that academics write lots of papers about, though. I haven't dug too deep on mosaicing, because I'm not interested in coding up a solution, since hand stitching works for my purposes. If you ever want to look into it, though, that's where I'd start.
 

Noodles

☑️
Joined
Sep 20, 2018
Messages
3,193
Location
Illinois
SL Rez
2006
Joined SLU
04-28-2010
SLU Posts
6947
That script you mentioned must pull the raw images from somewhere, I wonder if you could use it to just get the images. They are more likely reguarly sized.
 

bubblesort

Well-known member
Joined
Nov 16, 2018
Messages
1,993
Maybe I'm missing something but I would be inclined to get each square via the API then use Image Magick to glue the squares together. Some simple programming likely involved to do it nicely so that's probably out if you don't program.

Yeah, that's how the python script worked. I just finished digging around in my notes and browsing history, and I can't find that script anywhere! I distinctly remember talking to another map maker in a sailing or bellisseria group and they said they didn't write it but they used it. Maybe some day I'll run into them again and I can get the link from them again.

Here's an LSL script that grabs region textrures from the API. The script I found earlier got the textures the same way this script does, but then it stitched them. I probably should have spent more time trying to figure out how to use that python script.

It still bugs me that stitiching software is so bad at stitching flat maps together, but it's great at stitching photographs of the real world.
 
Joined
Sep 19, 2018
Messages
5,730
Location
NJ suburb of Philadelphia
SL Rez
2003
SLU Posts
4494
This page shows how to get the coordinates for a sim
ShowMap(key avatar) {
string url = "Second Life Maps";
vector sim_coord = llGetRegionCorner();
string x = (string)((integer)(sim_coord.x / 256.0));
string y = (string)((integer)(sim_coord.y / 256.0));
url += "map-1-" + x + "-" + y + "-objects.jpg";
llLoadURL(avatar, "View the sim map", url);
}
I went to the Ivory Tower of Primitives in Natoma and ran a slightly modified version of it with touch_start. This gave me the url for the sim.


This code makes a jpeg that is 3 sims across and 4 high with Natoma in its NW corner.

Code:
from wand.image import Image
from wand.display import display
import urllib.request


########################### THESE ITEMS NEED TO BE CHANGED TO YOUR NEEDS ##########################
Basedir = "c:/users/ms/source/repos/SLMaps/"
x=1001
y=1002
across=3
down=4
####################################################################################################


finalimage=Image()
for tiledown in range(x, x - down, -1):
    wand=Image()
    td=str(tiledown)
    for tileacross in range( y, y + across):
        ta=str(tileacross)
    
        urllib.request.urlretrieve("https://map.secondlife.com/map-1-" + ta + "-" + td + "-objects.jpg", Basedir +  "current_tile.jpg")
        current_tile=Image(filename=Basedir +  'current_tile.jpg')
        wand.sequence.append(current_tile)

    joined=wand.concat()
    finalimage.sequence.append(wand)
finalimage.concat(True)
finalimage.save(filename = Basedir + "Final.jpg")
You will need Python, ImageMagick and Wand

The final image looks like this.

 
Last edited:

bubblesort

Well-known member
Joined
Nov 16, 2018
Messages
1,993
This page shows how to get the coordinates for a sim


I went to the Ivory Tower of Primitives in Natoma and ran a slightly modified version of it with touch_start. This gave me the url for the sim.


This code makes a jpeg that is 3 sims across and 4 high with Natoma in its NW corner.

Code:
from wand.image import Image
from wand.display import display
import urllib.request


########################### THESE ITEMS NEED TO BE CHANGED TO YOUR NEEDS ##########################
Basedir = "c:/users/ms/source/repos/SLMaps/"
x=1001
y=1002
across=3
down=4
####################################################################################################


finalimage=Image()
for tiledown in range(x, x - down, -1):
    wand=Image()
    td=str(tiledown)
    for tileacross in range( y, y + across):
        ta=str(tileacross)

        urllib.request.urlretrieve("https://map.secondlife.com/map-1-" + ta + "-" + td + "-objects.jpg", Basedir +  "current_tile.jpg")
        current_tile=Image(filename=Basedir +  'current_tile.jpg')
        wand.sequence.append(current_tile)

    joined=wand.concat()
    finalimage.sequence.append(wand)
finalimage.concat(True)
finalimage.save(filename = Basedir + "Final.jpg")
You will need Python, ImageMagick and Wand

The final image looks like this.

Thank you! I can't make this work yet, but I think I'm close. I keep hitting a 403. Maybe the amazon servers are throttling me? Maybe the url is malformed? I'm not sure yet. I can access the map textures directly by going to the url in my browser, but I can't get the map with the script. I tried fetching a single map image instead of getting 9 images at once, but that dind't help, so I'm probably not being throttled by Amazon for making too many requests. I turned my vpn off, if that makes a difference.

Here are some notes for anybody who might find this thread years from now and want to follow along...

I am on Windows 10, x64. I installed the latest python from here.

Install Image Magick from here. When I did, I made sure to set the PATH variable and install dependencies, as described in the Wand installation instructions.

I made a directory for the project, and put the python script into it. You can copy and paste Essence's python script into a text file using notepad and save it as filename.py, where you put whatever file name you want in it. Next to it, make a directory for the images the script is about to download. Technically you can put this anywhere, but I prefer to keep things together.

My python file is E:\PythonSLMaps\SLMapDownloader01.py
My image directory is E:\PythonSLMaps\SLMapDirectDownloads

Wand seems to want to be installed locally in the directory of the python script, using the pip package manager that comes with python. So open up the command line (windows search > Command Prompt), then navigate to the directory of Essence's python script and type:

pip install Wand

Now to set up the LSL script in SL, so we can get the region coordinates for the maps we want:

I ran into some problems with Essence's LSL script, so I modified it to make the image load in my web browser correctly. Also, the script now ownersays the x and y coordinate lines for you to copy-paste into the python script. Here's my new version of Essence's script:

Code:
ShowMap(key avatar) {
    string url = "http://map.secondlife.com/map-1-";
    vector sim_coord = llGetRegionCorner();
    string x = (string)((integer)(sim_coord.x / 256.0));
    string y = (string)((integer)(sim_coord.y / 256.0));
    url += x + "-" + y + "-objects.jpg";
    // This is counterintuitive, but x and y need to be reversed here to work with the script
    llOwnerSay("\nx=" + y + "\ny=" + x);
    llLoadURL(avatar, "View the sim map", url);
}

default
{
    state_entry()
    { }
    touch_start(integer total_number)
    {
        ShowMap(llDetectedKey(0));
    }
}
So I paste that into a new script, then put the script in a cube prim, and attach the prim to my HUD. While wearing that, I go to a place I want to map. The place I want to map is an island I call Oh Cae, in Bellisseria. It's a little 3x3 island to the East of Old Bellisseria, just off the Western coast of the Woodlands sub-continent. It should be perfect to test this.

In world, I went to the Tern Key region, which is the North Western most region I want to map. Then I clicked my coordinate getter / map texture fetcher HUD and got this:


It loads the map image fine in my browser, so it's time to put all this into the script. I want my directory set, my coordinates set to x=1041, and y=968, and I want to capture 3 regions across and 3 down. That looks like this:

Python:
########################### THESE ITEMS NEED TO BE CHANGED TO YOUR NEEDS ##########################
Basedir = "E:\PythonSLMaps\SLMapDirectDownloads"
x=1041
y=968
across=3
down=3
####################################################################################################
NOTE: Do not put a slash after SLMapDirectDownloads. The script will give an error.

NOTE on NOTE: You do need a slash at the end, my slashes here should be forward slashes, and my x and y values are backwards. Scroll down to essence's reply to this post, and my reply to her, to see how this works. It will save you a lot of time.

So I save it and go back to my command line. I navigate to the directory in question, and run the script, and that looks like this:

Code:
E:\PythonSLMaps>python SLMapDownloader01.py
Traceback (most recent call last):
  File "E:\PythonSLMaps\SLMapDownloader01.py", line 22, in <module>
    urllib.request.urlretrieve("https://map.secondlife.com/map-1-" + ta + "-" + td + "-objects.jpg", Basedir +  "current_tile.jpg")
  File "C:\Python39\lib\urllib\request.py", line 239, in urlretrieve
    with contextlib.closing(urlopen(url, data)) as fp:
  File "C:\Python39\lib\urllib\request.py", line 214, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python39\lib\urllib\request.py", line 523, in open
    response = meth(req, response)
  File "C:\Python39\lib\urllib\request.py", line 632, in http_response
    response = self.parent.error(
  File "C:\Python39\lib\urllib\request.py", line 561, in error
    return self._call_chain(*args)
  File "C:\Python39\lib\urllib\request.py", line 494, in _call_chain
    result = func(*args)
  File "C:\Python39\lib\urllib\request.py", line 641, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
I do not know python (I know, I should learn it), but it looks like the URL is correct. I don't have a VPN running. I've done everything I can to make sure I have all the dependencies in order. I'm not sure where I'm going wrong here.

Just to not get caught up in this error, I decided to manually download the 9 textures and see if I can line them up...

I went to the url for every map texture manually in my browser and downloaded each one (list of urls removed here to save characters)

I save them all to a new directory: E:\PythonSLMaps\SLMapsManualDownload

I don't understand photo magick, so I try photoshop:

Open photoshop, go to File > Scripts > Load Files Onto Stack This lets me try the auto-aligner.

Select all layers, go to Edit > Auto-Align, tell it to reposition only, then OK, and... Photoshop can't auto-align these map images, because they do not overlap. Contact Sheet might do it, though...

File > Automate > Contact Sheet II

Point it at the directory with 9 map images, then set the units to pixels and the width and height to 4096. 4k is overkill for this, and ultimately, I would like to have it just use the original resolution of the images next to each other, but just to experiment, lets try for 4k. Set Place to Across First, 3 columns and 3 rows, uncheck auto-spacing, set vertical and horizontal to zero, or maybe a few pixels if you want an accurate region grid. A region grid would be an awesome feature to have on maps! I've never seen an SL map with an accurate region grid before.

Click OK, then it takes a moment to run, and... it won't line the images up in the right order. It's lined up in alphanumeric order, but the images are numbered wrong to be lined up like that. I try to reorder the images in the layers window by hand before I make the contact sheet, but that changes nothing.

So photoshop seems like a dead end, unless I want to place the images by hand. I could set up a snapping tool to do it, but at this volume of images, that would take forever.

One fix for this would be to change Essence's script, to have the outer for loop begin each texture name with a count, so their alphabetical order is always the correct tiling order, left to right, top to bottom. The file names could be something like 0001, 0002, 0003, etc (9999 seems like a lot of capacity, but there are a lot of regions in the mainland).

I should really learn python.

It would probably be easier to just troubleshoot the 403 error and let Essence's script stitch it all together, though.
 
Last edited:

bubblesort

Well-known member
Joined
Nov 16, 2018
Messages
1,993
Quick followup:

I just tried changing the x and y values in my script to the x and y values you are using. You are using x=1001, y=1002, and I was using x=1041, y=968. It doesn't give a 403 error any more, when I use your coordinates! It acts like it runs fine, but when I go to check the SLMapDirectDownloads folder, I see nothing in it.

So the error is fixed, but the script doesn't seem to do anything now. A finger on the monkey's paw curls.
 

Noodles

☑️
Joined
Sep 20, 2018
Messages
3,193
Location
Illinois
SL Rez
2006
Joined SLU
04-28-2010
SLU Posts
6947
I mean, half the fun of every tech/code project is chasing the mysterious bugs of unknown origin and unknown solution because you changed nothing but this time it worked!

Right?
 
Joined
Sep 19, 2018
Messages
5,730
Location
NJ suburb of Philadelphia
SL Rez
2003
SLU Posts
4494
Quick followup:

I just tried changing the x and y values in my script to the x and y values you are using. You are using x=1001, y=1002, and I was using x=1041, y=968. It doesn't give a 403 error any more, when I use your coordinates! It acts like it runs fine, but when I go to check the SLMapDirectDownloads folder, I see nothing in it.

So the error is fixed, but the script doesn't seem to do anything now. A finger on the monkey's paw curls.
You need to change those backslashes to slashes in your local E: drive path. Backslash is an escape character in python and slashes work the same as backslashes in paths in (Windows) code. And you do need a slash on the end.
 
  • 1Thanks
Reactions: bubblesort

bubblesort

Well-known member
Joined
Nov 16, 2018
Messages
1,993
You need to change those backslashes to slashes in your local E: drive path. Backslash is an escape character in python and slashes work the same as backslashes in paths in (Windows) code. And you do need a slash on the end.
OH, right! LOL, that was a dumb mistake. I didn't look at your code closely enough. I fixed the slashes, then still had problems. It turns out I reversed my x and y values. Then I made some typos, because no project is complete without that. So I changed my folder names around a bit to eliminate typos. I now put the images in e:/PythonSLMaps/downloads The following code gives the following image:

Python:
from wand.image import Image
from wand.display import display
import urllib.request


########################### THESE ITEMS NEED TO BE CHANGED TO YOUR NEEDS ##########################
Basedir = "e:/PythonSLMaps/downloads/"
x=968
y=1041
across=3
down=3
####################################################################################################


finalimage=Image()
for tiledown in range(x, x - down, -1):
    wand=Image()
    td=str(tiledown)
    for tileacross in range( y, y + across):
        ta=str(tileacross)
    
        urllib.request.urlretrieve("https://map.secondlife.com/map-1-" + ta + "-" + td + "-objects.jpg", Basedir +  "current_tile.jpg")
        current_tile=Image(filename=Basedir +  'current_tile.jpg')
        wand.sequence.append(current_tile)

    joined=wand.concat()
    finalimage.sequence.append(wand)
finalimage.concat(True)
finalimage.save(filename = Basedir + "Final.jpg")


This is exactly what I expected!

Thank you so much for your help, Essence!

I'm going to go up to my earlier post and correct my note about the slashes.

Important final note on the edge of the world: I experimented a bit, and I found out that if you feed the script values that go off the edge of the world, then it will return a 403. Oh Cae happens to be on the edge of the world. If I ask for more than 3 regions across, it gives a 403 because there is no fourth region, going West to East, from 968,1041. If I want to capture all of old Bellisseria, though, I can start at 977,1024, and go 16 across and 16 down without issue. It takes a minute to download them all, but it doesn't get throttled.
 

bubblesort

Well-known member
Joined
Nov 16, 2018
Messages
1,993
A few technique notes about using files that this script generates:

1. The files are MASSIVE! The entire mainland was 220 MB when I hand stitched it using the techniques described in the first post. This python script technique generated a 486.5 MB map of Old Bellisseria, by itself! That's just the Old Bellisseria sub-continent, and the very edges of Sansara, Victoria, and the Woodlands. The dimensions of this are 24533x32955. If you are using a 4k HD monitor... this is 32k HD.

My point is, don't attempt this unless you have lots of memory to spare. I'm rocking 32 Gb, so I'm good, but if you are on a laptop with 4Gb, this will probably not work very well.

Here's a link to the Old Bellisseria map I made with this script.
Here's a link to my hand stitched map of the entire contiguous mainland.

Note the difference in resolution, and file size.

2. Photoshop wouldn't save these massive files as .psd files. It saved them as .psb, which is adobe's large document format. The photoshop exporter will not export this to full resolution png files. To save the full resolution image, you have to hit save as and save it as png or jpg or whatever. Your file types are a lot more limited with this file size, though.

3. These files break Photoshop's auto alignment tool. I didn't bother trying other automated photo stitching tools. At this point, I think automated stitching tools are just not going to work for this kind of work, so exploring them farther is probably a waste of time.

4. When you line up shots here, the resolution is too high to make them pixel perfect, like in the technique in the original post of this thread. No matter what you do, the pixels will always be shaded slightly differently, in a way that you will only ever notice if you zoom all the way into the pixel grid and start flipping the transparency or fill sliders off and on. This is how I lined things up by hand on lower resolution maps, but at this resolution, that's just not possible.

5. To line up maps, you want to snap to grid, and snap to document edges. There's really no other way, because the pixels will not line up. You have to play around to find the best way to do this. Sometimes, you don't have anything to snap to, so you just have to eyeball it. In the map I just linked to above, I wasn't able to set up a good way to snap the SS Galaxy portion of the map, so I eyeballed it. If I wanted to, I could have captured the SS Galaxy 3 regions down and something like 21 or 22 regions across, to snap it to the east shore of Bellisseria, but that seemed excessive, so I just worked with the Galaxy as a 3x3 submap. If you play around, you will come up with your own techniques for lining up sub maps like that. It might be worth it to try dropping the resolution, lining up the pixels, then dropping full resolution images on top of the low resolution images might end up with more perfect alignments. For now, the snapping tools seem to work for me, though.

6. This technique is great for showing the edge of the world on your maps! I spent half a day outlining Sansara's edge of the world the other day. With this technique, you don't have to do that, because the only things you can capture are in the world. If I ever learn python, it would be nice to make a script that puts black or white or transparent textures when the SL server returns 403, meaning there is no region at that coordinate. For now, though... yeah, measuring and capturing only land that exists is tedious, but it saves you time when it comes to vectoring out your maps.
 
Joined
Sep 19, 2018
Messages
5,730
Location
NJ suburb of Philadelphia
SL Rez
2003
SLU Posts
4494
A few technique notes about using files that this script generates:

1. The files are MASSIVE!
True, because the output jpegs are too big to be useful generally for larger values of across and down. There are a couple of ways to deal with that. In the url beginning with
https://map.secondlife.com/map-1- , the 1 is the zoom level between 1 and 8, so you could increase the number, but then you will probably have to change the increments for fetching the adjacent tiles. I haven't tried that. Or (probably the better option) you could use the wand resize method to reduce the image size after fetching from the web and before adding to the sequence.
 
Last edited:
  • 1Interesting
Reactions: bubblesort

bubblesort

Well-known member
Joined
Nov 16, 2018
Messages
1,993
True, because the output jpegs are too big to be useful generally for larger values of across and down. There are a couple of ways to deal with that. In the url beginning with
https://map.secondlife.com/map-1- , the 1 is the zoom level between 1 and 8, so you could increase the number, but then you will probably have to change the increments for fetching the adjacent tiles. I haven't tried that. Or (probably the better option) you could use the wand resize method to reduce the image size after fetching from the web and before adding to the sequence.
Oh yeah, I'm not complaining about the file size, exactly... just making a few notes here about it. I haven't seen SL cartography techniques discussed anywhere in detail, so I just want to document what I can, while I'm tinkering with SL cartography.

I really do want to work with these ultra high resolution files, though, because my cartography technique is all about getting as much detail as possible, and then going through and vectoring out the details that actually matter. I mean, I don't care about every shrubbery and tree when I'm looking at a map. I want a map to show navigable waters, geographic shapes to help lost travellers, rez zones, things like that. My maps are for explorers. I can't actually make out most of the navigable streams and rivers without high resolution maps to work from, though. Some really important waterways are like one pixel wide if you zoom out at all.

It is really cool that you can set the script to capture at lower resolution if you want to, though.