I have been working to display an image of a USGS 7.5 minute quad sheet. 
These are provided at various locations about the Web.  Since the 
range of colors on these maps is limited, the *.tif files appear to 
use an indexed color map wherein each pixel has a value 0 to 255 and 
the color is found from a table with 256 entries having triplets of
the RGB in the range of 0-255.    I have not been able to sort out
how to get the gdal package to give me the color map from within python, so I 
dumped it
from the image file using gdalinfo and then cut and pasted to get
the following script:
 
---------------------------------------------------------------------------------
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import ListedColormap

import osgeo.gdal as gdal
from osgeo.gdalconst import *

gd = gdal.Open('o37122d1.tif')

#Setup to compute the colormap from the RGB triplets from the geotif file
div = np.zeros( (256,3), np.float32)

div = 255.0
ctab = np.array([
            [ 255,255,255],
            [ 0,0,0],
            [ 255,255,255],
            [ 91,159,230],
            [ 230,45,30],
            [ 162,96,71],
            [ 210,255,177],
            [ 197,101,197],
            [ 255,240,0],
            [ 202,225,245],
            
            ...snip.... (deleted many lines:)
            [ 250,202,250],
            [ 230,230,230],
            [ 222,167,146],
            [ 255,255,255],
            [ 255,255,255] ], dtype=np.uint8)

#Compute colors in range 0.0 to 1.0. 
fctab= ctab/div

usgscm = ListedColormap(fctab, name='usgs',N=None)


doq = gd.ReadAsArray()
# doq proves to be a uint8 array: 8802 rows and 7066 columns

# Cut out a subset from the main array--to large to display and
# slow as 'molasses in January' to process:)
suba = doq[0:1101 ,0:1801 ]

fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(suba, cmap=usgscm, origin='upper')

plt.show()
---------------------------------------------------------------------------------
This script does give me an image--but in badly wrong colors:(  The script does 
properly display gray-scaled Digital Ortho-quadrangles using cm.gray as the 
color
map in imshow.  Consequently something is not quite correct with respect to the 
definition or the use of the color map.  It appears that each map, and there 
are about 56,000 of them available on one site, could have its own color map.
Thus my application must be able to compute a color map unique to each of the 
topographic maps. 

Questions:

1.  What am I missing to get imshow to pick out the correct colors from the 
    color map?

2. Should I be using the name, usgs, given in the ListedColormap instance 
someplace?
   Not clear to me what role that name plays. 

3. Is there a way to use ctab directly in the ListedColormap instance? Class 
Colormap
has a bytes argument, False by default, but I am not yet sure if it has any 
bearing
on my problem. 
 
I am using Matplotlib 0.98 with the latest numpy, and gdal.  I am not using 
Basemap, after some study, because it contains far more "horsepower" than my 
simple topographic-map viewer application requires.  Also, this is my first 
foray into "image processing".  I am finding the learning curve a bit steep,
as usual, with multiple names for the same thing popping up in descriptions
from various sources--business as usual in the computer business:) 

Thanks from a happy matplotlib user in California!

                                               Delbert


-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to