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


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.