Sıfırdan çokbantlı bir görüntü oluşturma


10

Üzerinde bazı testler yapmak için cero'dan çokbantlı bir görüntü yapmak istiyorum. Üzerinde tuz ve karabiber gürültüsü olan 5 adet tamamen üniforma bant veya merkezde farklı değerlerden oluşan bir kare gibi gerçekten basit bir şey. Açıkçası bu sadece bir matris yığını, çok boyutlu bir dizi, bu da üretilmesi oldukça basittir. Bunu python ve gdal kullanarak başarmak istiyorum ama gdal oldukça hermetik oluyor, hiç asamıyorum. İdeal olarak bir geotiff dosyası oluşturmak istiyorum. Biri bana bu konuda yardımcı olabilir mi? bazı işaretçiler veya çok nazik bazı gdal öğretici? Hepinize teşekkür ederim.

Yanıtlar:


15

Gdal.band.WriteArray yöntemini istiyorsunuz. GDAL API eğitiminde bir örnek var (aşağıda çoğaltılmıştır):

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

Rasgele veri üretmek için numpy.random modülüne bakın.

İşte daha eksiksiz bir çalışma örneği:

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

Çok teşekkürler, bu şeylerin ne yaptığını nereden okuyabilirsiniz? SetUTM (tamam ne işe yaradığını biliyorum) SetWellKnown GeogCS, se projeksiyon, coğrafi dönüşüm, vb ayarlayın ... ama tam olarak ihtiyacım gibi görünüyor. Çok teşekkürler!
JEquihua

Kodun coğrafi referans bölümleri hakkında daha fazla bilgi için, Projeksiyon Eğitimi - gdal.org/ogr/osr_tutorial.html
user2856

2

İstediğiniz şey olmadığını biliyorum, ancak istediğiniz tek şey çok spektrumlu veya hiperspektral örnek veri ise - Opticks projesi için bu test verileri işe yarayabilir. Alternatif olarak, LANDSAT verilerini doğrudan Earth Explorer'dan alabilirsiniz .

Bu site , 2B bir numpy dizisini tek bantlı bir geoTIFF'ye ve çok bantlı bir geoTIFF'yi 3B bir numpy dizisine dönüştürmek için örnek kod içerir.

DÜZENLE:

Daha fazla araştırma , 'eksik örnek', 3D numpy dizisi -> çok bantlı geoTIFF ile bir örnek kod sayfası bulur .


Hayır, gerçekten kendi imajımı oluşturmam gerekiyor. Sayfa ilginç, teşekkür ederim, gerçekten ihtiyacım olan şey eksik bir örnek, bir 3d numpy dizisinin çok bantlı bir geoTIFF olarak nasıl kaydedileceği. Ama çok teşekkürler!
JEquihua

Daha fazla bilgi ile düzenlendi
MappingTomorrow
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.