Suite

Effectuer un calcul de bande dans un tableau numpy

Effectuer un calcul de bande dans un tableau numpy


J'aimerais effectuer un calc de bande dans certaines bandes raster. Ce que j'essaie de faire, c'est d'importer le raster (format ENVI) comme un tableau avec gdal, puis je fais le calcul, mais lorsque j'essaie d'enregistrer le raster, j'obtiens une erreur :

L'objet 'NoneType' n'a pas d'attribut 'SetMetadata'

Ceci est mon code que je prends de http://geoexamples.blogspot.com.es/2012/12/raster-calculations-with-gdal-and-numpy.html

depuis osgeo import gdal depuis osgeo.gdalnumeric import * depuis osgeo.gdalconst import * import numpy as np slope = 1.35 intercept = -26.82 fileName = r'mypath1.img' outFile = r'mypath1_out.img' #Ouvrir le dataset ds1 = gdal.Open(fileName, GA_ReadOnly) band1 = ds1.GetRasterBand(1) data1 = BandReadAsArray(band1) #Le calcul réel dataOut = data1*slope + intercept #Écrire le fichier de sortie driver = gdal.GetDriverByName("ENVI" ) dsOut = driver.Create(outFile, ds1.RasterXSize, ds1.RasterYSize, 1, band1.DataType) CopyDatasetInfo(ds1,dsOut) bandOut=dsOut.GetRasterBand(1) BandWriteArray(bandOut, dataOut)

Un autre grand doute est que les données d'origine sont des octets (0-255), mais lorsque j'effectue le calcul, j'obtiens des valeurs de données supérieures et inférieures à 0 et 255. Je ne suis donc pas très sûr de pouvoir enregistrer le résultat comme l'octet de devrais-je enregistrez-le dans leur format, puis exécutez un gdal_translate ?


Vraisemblablement, l'un des paramètres de CopyDatasetInfo est None, alors vérifiez que dsOut n'est pas None.

Vous pouvez enregistrer vos résultats en tant que Float32, ou vous pouvez les réduire à 0-255 pour les enregistrer en tant qu'octet, ou les mettre à l'échelle dans une autre plage d'entiers. Cela dépend de ce que vous voulez faire avec le résultat et de la quantité d'informations que vous pouvez vous permettre de perdre.


Finalement, j'utilise ce code à partir d'exemples rasterio :

import numpy as np import rasterio import subprocess # Enregistrez les pilotes au format GDAL et les options de configuration avec un # gestionnaire de contexte. with rasterio.drivers() : # Lire les bandes raster directement dans les tableaux Numpy. # avec rasterio.open(r'mypathand1.img') comme src : rs = src.read() NoData_rs = np.ma.masked_where(rs==255,rs) total = NoData_rs*slope + intercept min_msk = ( total<0) max_msk = (total>255) total[min_msk] = 0 total[max_msk] = 254 profile = src.profile profile.update(type=rasterio.uint8, NoData = 255) avec rasterio.open(r'my_path ex_nd.img', 'w', **profile) comme dst : dst.write(total.astype(rasterio.uint8))

Je trouve cela un peu bizarre, car j'ai pensé que je devrais utiliser 'gdal_translate' pour obtenir à nouveau mon raster en octets. Lorsque j'effectue le calcul, j'obtiens des valeurs supérieures et inférieures à 0 et 255, et si j'exécute ce script sans les masques min et max, il envoie ces valeurs à NoData (255), ce qui n'est pas correct. Quoi qu'il en soit, maintenant avec ces scripts et ces masques min/max, j'obtiens les mêmes valeurs que lors de l'étape gdal_translate et que celles que j'ai obtenues en exécutant la normalisation dans Idrisi (ce qui est mon objectif ici, de faire la même chose que Idrisi Regress dans python). Alors je crois que j'en ai fini avec ça !

Merci pour votre réponse