Створення мультиспектрального зображення з нуля


10

Я хочу зробити багатоспектральне зображення з cero, щоб зробити кілька тестів на ньому. Щось по-справжньому просто, як 5 повністю рівномірних смуг із соленим та перцевим шумом на них або квадрат різних значень у центрі. Зрозуміло, що це був би просто матриця, багатовимірний масив, який можна створити досить прямо. Я хочу досягти цього за допомогою python та gdal, але gdal є досить герметичним, я взагалі не розумію цього. Я в ідеалі хотів би створити файл геотифу. Хтось міг мені допомогти з цього приводу? якісь вказівники чи якийсь навчальний посібник gdal, який дуже ніжний? Дякую всім.

Відповіді:


15

Вам потрібен метод gdal.band.WriteArray. Приклад у навчальному посібнику API GDAL (відтворений нижче):

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

Для генерації випадкових даних дивіться модуль numpy.random .

Ось більш повний робочий приклад:

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

Велике спасибі, де можна прочитати, що ці речі роблять? SetUTM (добре, я знаю, що це робить) SetWellK известний GeogCS, се проекція, встановлення геоперетворення тощо, але виглядає саме те, що мені потрібно. Дуже дякую!
JEquihua

Більш детальну інформацію про геореференційні частини коду див. У навчальному посібнику з проекцій - gdal.org/ogr/osr_tutorial.html
user2856

2

Я знаю, що це не те, про що ви просили, але якщо все, що ви хочете, це мультиспектральні або гіперспектральні вибіркові дані - ці тестові дані для проекту Opticks можуть працювати. Крім того, ви можете отримувати дані LANDSAT безпосередньо з Провідника Землі .

Цей веб-сайт має приклад коду для перетворення двовимірного масиву numpy в однодіапазонний geoTIFF, а багатодіапазонний geoTIFF в тривимірний масив.

Редагувати:

Подальше дослідження виявляє сторінку з прикладом коду з 'відсутнім прикладом', 3D numpy масивом -> багатодіапазонним geoTIFF.


Ні, мені справді потрібно зробити власний образ. Сторінка цікава, дякую, що мені дійсно би знадобився приклад про те, як зберегти тривимірний масив як багатодіапазонний geoTIFF. Але велике спасибі!
JEquihua

Відредаговано більше інформації
MappingTomorrow
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.