Créer une image multispectrale à partir de zéro

10

Je veux faire une image multispectrale de cero pour faire des tests dessus. Quelque chose de vraiment simple comme 5 bandes complètement uniformes avec du bruit de sel et de poivre dessus ou un carré de valeurs différentes au centre. De toute évidence, ce ne serait qu'une pile de matrices, un tableau multidimensionnel, qui est assez simple à générer. Je veux y arriver en utilisant python et gdal mais gdal est assez hermétique, je ne comprends pas du tout. Idéalement, je voudrais créer un fichier géotiff. Quelqu'un pourrait-il m'aider à ce sujet? quelques pointeurs ou un tutoriel gdal qui est très doux? Merci à tous.

JEquihua
la source

Réponses:

15

Vous voulez la méthode gdal.band.WriteArray. Il y a un exemple dans le tutoriel de l'API GDAL (reproduit ci-dessous):

format = "GTiff"
driver = gdal.GetDriverByName( format )
dst_ds = driver.Create( dst_filename, 512, 512, 1, gdal.GDT_Byte )
dst_ds.SetGeoTransform( [ 444720, 30, 0, 3751320, 0, -30 ] )

srs = osr.SpatialReference()
srs.SetUTM( 11, 1 )
srs.SetWellKnownGeogCS( 'NAD27' )
dst_ds.SetProjection( srs.ExportToWkt() )

raster = numpy.zeros( (512, 512), dtype=numpy.uint8 )    
dst_ds.GetRasterBand(1).WriteArray( raster )

# Once we're done, close properly the dataset
dst_ds = None

Pour générer les données aléatoires, regardez le module numpy.random .

Voici un exemple de travail plus complet:

from osgeo import gdal, osr
import numpy

dst_filename = '/tmp/test.tif'
#output to special GDAL "in memory" (/vsimem) path just for testing
#dst_filename = '/vsimem/test.tif'

#Raster size
nrows=1024
ncols=512
nbands=7

#min & max random values of the output raster
zmin=0
zmax=12345

## See http://gdal.org/python/osgeo.gdal_array-module.html#codes
## for mapping between gdal and numpy data types
gdal_datatype = gdal.GDT_UInt16
np_datatype = numpy.uint16

driver = gdal.GetDriverByName( "GTiff" )
dst_ds = driver.Create( dst_filename, ncols, nrows, nbands, gdal_datatype )

## These are only required if you wish to georeference (http://en.wikipedia.org/wiki/Georeference)
## your output geotiff, you need to know what values to input, don't just use the ones below
#Coordinates of the upper left corner of the image
#in same units as spatial reference
#xmin=147.2  
#ymax=-34.54

#Cellsize in same units as spatial reference
#cellsize=0.01

#dst_ds.SetGeoTransform( [ xmin, cellsize, 0, ymax, 0, -cellsize ] )
#srs = osr.SpatialReference()
#srs.SetWellKnownGeogCS("WGS84")
#dst_ds.SetProjection( srs.ExportToWkt() )

raster = numpy.random.randint(zmin,zmax, (nbands, nrows, ncols)).astype(np_datatype )  
for band in range(nbands):
    dst_ds.GetRasterBand(band+1).WriteArray( raster[band, :, :] )

# Once we're done, close properly the dataset
dst_ds = None
user2856
la source
Merci beaucoup, où pouvez-vous lire ce que ces choses font? SetUTM (ok je sais ce que ça fait) SetWellKnown GeogCS, se projection, set geo transform, etc ... mais ressemble exactement à ce dont j'ai besoin. Merci beaucoup!
JEquihua
Pour plus d'informations sur les parties de géoréférencement du code, voir le didacticiel sur les projections - gdal.org/ogr/osr_tutorial.html
user2856
2

Je sais que ce n'est pas ce que vous avez demandé, mais si tout ce que vous voulez, ce sont des échantillons de données multispectrales ou hyperspectrales - ces données de test pour le projet Opticks pourraient fonctionner. Alternativement, vous pouvez obtenir des données LANDSAT directement depuis Earth Explorer .

Ce site a un exemple de code pour convertir un tableau numpy 2D en un geoTIFF monobande, et un geoTIFF multibande en un tableau numpy 3D.

ÉDITER:

Des recherches supplémentaires trouvent une page d' exemple de code avec «l'exemple manquant», tableau numpy 3D -> multi-band geoTIFF.

MappingTomorrow
la source
Non, j'ai vraiment besoin de créer ma propre image. La page est intéressante, merci, ce dont j'aurais vraiment besoin est l'exemple manquant, comment enregistrer un tableau numpy 3d en tant que geoTIFF multi-bandes. Mais merci beaucoup!
JEquihua
Modifié avec plus d'informations
MappingTomorrow