Crear una imagen multiespectral desde cero

10

Quiero hacer una imagen multiespectral desde cero para hacer algunas pruebas al respecto. Algo realmente simple como 5 bandas completamente uniformes con ruido de sal y pimienta o un cuadrado de valores diferentes en el centro. Claramente, esto sería solo una pila de matrices, una matriz multidimensional, que es bastante sencilla de generar. Quiero lograr esto usando python y gdal, pero gdal está siendo bastante hermético, no lo entiendo en absoluto. Idealmente, me gustaría crear un archivo geotiff. ¿Alguien podría ayudarme con esto? algunos consejos o algún tutorial de gdal que es muy suave? Gracias a todos.

JEquihua
fuente

Respuestas:

15

Desea el método gdal.band.WriteArray. Hay un ejemplo en el tutorial API de GDAL (reproducido a continuación):

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

Para generar los datos aleatorios, mire el módulo numpy.random .

Aquí hay un ejemplo de trabajo más 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
usuario2856
fuente
Muchas gracias, ¿dónde puedes leer lo que hacen estas cosas? SetUTM (ok, sé lo que hace) SetWellKnown GeogCS, se sejection, set geo transform, etc ... pero parece exactamente lo que necesito. ¡Muchas gracias!
JEquihua
Para obtener más información sobre las partes de georreferenciación del código, consulte el Tutorial de proyecciones - gdal.org/ogr/osr_tutorial.html
user2856
2

Sé que no es lo que pediste, pero si todo lo que quieres son datos de muestra multiespectrales o hiperespectrales, estos datos de prueba para el proyecto Opticks podrían funcionar. Alternativamente, puede obtener datos de LANDSAT directamente desde Earth Explorer .

Este sitio tiene un código de ejemplo para convertir una matriz numpy 2D en un geoTIFF de banda única, y un geoTIFF multibanda en una matriz numpy 3D.

EDITAR:

Investigaciones adicionales encuentran una página de código de ejemplo con el 'ejemplo faltante', matriz numpy 3D -> geoTIFF multibanda.

Mapeo Mañana
fuente
No, realmente necesito hacer mi propia imagen. La página es interesante, gracias, lo que realmente necesitaría es el ejemplo que falta, cómo guardar una matriz numpy en 3D como un geoTIFF multibanda. Pero muchas gracias!
JEquihua
Editado con más información
MappingTomorrow