Creazione di un'immagine multispettrale da zero


10

Voglio fare un'immagine multispettrale da Cero per fare alcuni test su di essa. Qualcosa di veramente semplice come 5 fasce completamente uniformi con rumore di sale e pepe su di esse o un quadrato di valori diversi al centro. Chiaramente questo sarebbe solo uno stack di matrici, un array multidimensionale, che è piuttosto semplice da generare. Voglio raggiungere questo obiettivo usando Python e Gdal, ma Gdal è piuttosto ermetico, non capisco affatto. Idealmente, vorrei creare un file geotiff. Qualcuno potrebbe aiutarmi in questo? alcuni suggerimenti o qualche tutorial gdal che è molto gentile? Grazie a tutti.

Risposte:


15

Si desidera il metodo gdal.band.WriteArray. C'è un esempio nel tutorial API GDAL (riprodotto di seguito):

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

Per generare i dati casuali, guarda il modulo numpy.random .

Ecco un esempio di lavoro più completo:

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

Grazie mille, dove posso leggere cosa fanno queste cose? SetUTM (ok, so cosa fa) SetWellKnown GeogCS, vedi proiezione, imposta geo-trasformazione, ecc ... ma sembra esattamente ciò di cui ho bisogno. Molte grazie!
JEquihua

Per maggiori informazioni sulle parti di georeferenziazione del codice, consultare il Tutorial sulle proiezioni - gdal.org/ogr/osr_tutorial.html
user2856

2

So che non è quello che hai chiesto, ma se tutto ciò che desideri sono dati campione multispettrali o iperspettrali, questi dati di test per il progetto Opticks potrebbero funzionare. In alternativa, puoi ottenere i dati LANDSAT direttamente da Earth Explorer .

Questo sito ha un codice di esempio per convertire un array numpy 2D in un geoTIFF a banda singola e un geoTIFF multibanda in un array numpy 3D.

MODIFICARE:

Ulteriori ricerche trovano una pagina di codice di esempio con l '"esempio mancante", matrice numpy 3D -> geoTIFF multi-banda.


No, ho davvero bisogno di creare la mia immagine. La pagina è interessante, grazie, ciò di cui avrei davvero bisogno è l'esempio mancante, come salvare un array numpy 3d come geoTIFF multi-banda. Ma grazie mille!
JEquihua,

Modificato con maggiori informazioni
MappingDomani
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.