Définition de NoData pour un raster multibande?

10

J'ai une orthoimage RVB qui a une zone noire au lieu de NoData, comme illustré ici: entrez la description de l'image ici

Lorsque j'utilise l'outil SetNull, il supprime la zone noire, mais il la transforme ensuite en une orthoimage en niveaux de gris, ce qui n'est pas ce que je veux.

entrez la description de l'image ici

Je sais qu'il existe un moyen de contourner cela en utilisant l'outil Couper (Gestion des données) pour couper le raster sur lui-même et là-dedans, vous pouvez définir la valeur NoData comme étant la valeur des cellules noires (0). Cependant, je crée un atelier pour les étudiants et j'aimerais utiliser une méthode moins contre-intuitive.

Il y a bien sûr la possibilité d'exécuter l'outil NoData sur chaque bande individuellement, puis de combiner les trois bandes ensemble, mais je dois avoir une condition où band1, band2 et band3 sont tous égaux à 0 pour définir cela comme NoData. Être capable de le faire dans ModelBuilder serait idéal, mais l'écrire à l'aide d'ArcPy serait également bon.

J'utilise ArcGIS 10.2 Desktop avec une licence avancée.

Alex McVittie
la source
Vous dites que vous utilisez "ArcGIS 10.2 Pro" mais l'application ArcGIS Pro n'est sortie qu'avec ArcGIS 10.3 for Desktop. Pouvez-vous modifier votre question pour clarifier ce que vous utilisez, s'il vous plaît?
PolyGeo
Mes excuses. J'utilise ArcGIS 10.2 for Desktop avec la licence avancée.
Alex McVittie
Merci d'avoir posé cette question. J'ai des clients qui me reviennent tout le temps en pensant qu'il y a un problème avec leur imagerie.
Wes

Réponses:

12

Ce que vous voulez faire, c'est définir les propriétés du raster dans un script ou le modifier manuellement dans ArcCatalog. Cela ne créera pas de nouveau raster ni ne prendra même très longtemps.

En python, c'est un peu délicat:

import sys, os, arcpy

InFolder = sys.argv[1]
arcpy.env.workspace = InFolder

for Ras in arcpy.ListRasters():
    arcpy.AddMessage("Processing " + Ras)
    arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0")

Parce que les nodata sont en bas de la liste, je trouve plus facile de spécifier cela; les paramètres sont Valeur de bande; Valeur de bande; ... jusqu'à ce que toutes les bandes soient adressées. Si vous êtes susceptible d'avoir plus de bandes (ou moins) dans le même dossier, vous devrez utiliser arcpy.Describe et la propriété bandCount pour définir la valeur null pour le nombre correct de bandes:

import sys, os, arcpy

InFolder = sys.argv[1]
arcpy.env.workspace = InFolder

for Ras in arcpy.ListRasters():
    arcpy.AddMessage("Processing " + Ras)
    desc = arcpy.Describe(Ras)
    if desc.bandCount == 3:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0")
    elif desc.bandCount == 4:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0;4 0")
    elif desc.bandCount == 1:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0")

Dans ArcCatalog, cliquez avec le bouton droit sur la couche et accédez aux propriétés: entrez la description de l'image ici

appuyez sur le bouton d'édition:

entrez la description de l'image ici

Entrez les valeurs, puis appuyez sur OK pour fermer l'éditeur NoData et sur OK pour appliquer la modification.

Le raster n'affichera plus rien dans ArcMap où la valeur de la cellule est 0,0,0.

Michael Stimson
la source
3

Si vous accédez aux propriétés du raster et si la symbologie est définie comme composite RVB (ce qui semble être le cas), vous pouvez cocher la case Afficher les valeurs d'arrière-plan (RVB) et définir ce que vous voulez comme arrière-plan creux. Il vous suffit donc de définir 0 0 0 comme valeur d'arrière-plan et vous devriez être en affaires.

mr.adam
la source
2

Je pense que la manière la plus simple d'y parvenir serait de créer d'abord un raster de condition nulle, puis d'utiliser ce raster pour affecter séparément les valeurs NoData à chaque bande.

Essayez d'exécuter la fonction Con pour créer le raster de condition nulle.

nullCondition = Con(((band1 == 0) & (band2 == 0) & (band3 == 0)), 1, 0)

Utilisez ensuite le raster de condition nulle pour affecter des valeurs NoData à chaque bande avec la fonction Null définie . Vous devriez pouvoir le faire avec le générateur de modèles ou python.

Ben Gosack
la source
2

Je crois que vous pouvez utiliser des procédures d'arbre différentes que théoriques devraient fonctionner. Calculatrice raster où vous pouvez utiliser cette expression SETNULL([raster] == value, [raster]) Reclasser où vous ne devez reclasser que la valeur souhaitée. Et en utilisant ArcPy, vous pouvez utiliser ce script que j'ai trouvé ici https://gis.stackexchange.com/a/24578/47790

import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
outSetNull = SetNull("elevation", "elevation", "VALUE = 9999")
outSetNull.save("C:/sapyexamples/output/outsetnull")
Diogo Matos
la source