¿Establecer NoData para un ráster multibanda?

10

Tengo una ortoimagen RGB que tiene área negra en lugar de NoData, como se muestra aquí: ingrese la descripción de la imagen aquí

Cuando uso la herramienta SetNull, elimina el área negra, sin embargo, luego la convierte en una ortoimagen en escala de grises, que no es lo que quiero.

ingrese la descripción de la imagen aquí

Sé que hay una forma de evitar esto mediante el uso de la herramienta Clip (Administración de datos) para recortar el ráster en sí mismo y allí puede establecer el valor NoData para que sea el valor de las celdas negras (0). Sin embargo, estoy creando un taller para estudiantes y me gustaría utilizar un método menos intuitivo.

Por supuesto, existe la opción de ejecutar la herramienta NoData en cada banda individualmente y luego combinar las tres bandas juntas, sin embargo, necesito tener una condición en la que band1, band2 y band3 sean iguales a 0 para establecer eso como NoData. Ser ideal para hacer esto en ModelBuilder sería ideal, pero crear secuencias de comandos con ArcPy también sería bueno.

Estoy usando ArcGIS 10.2 Desktop con licencia avanzada.

Alex McVittie
fuente
Dice que está utilizando "ArcGIS 10.2 Pro", pero la aplicación ArcGIS Pro solo se lanzó con ArcGIS 10.3 para escritorio. ¿Puede editar su pregunta para aclarar lo que está utilizando, por favor?
PolyGeo
Mis disculpas. Estoy usando ArcGIS 10.2 for Desktop con la licencia avanzada.
Alex McVittie
Gracias por hacer esta pregunta. Tengo clientes que vuelven a mí todo el tiempo pensando que hay algo mal con sus imágenes.
Wes

Respuestas:

12

Lo que desea hacer es establecer las propiedades de ráster en un script o cambiarlo manualmente en ArcCatalog. Esto no creará una nueva trama o incluso tomará mucho tiempo.

En python es un poco complicado:

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")

Debido a que los nodatos están muy abajo en la lista, me resulta más fácil especificar eso; los parámetros son Band Value; Band Value; ... hasta que se aborden todas las bandas. Si es probable que tenga más bandas (o menos) en la misma carpeta, deberá usar arcpy.Describe y la propiedad bandCount para establecer el valor nulo para el número correcto de bandas:

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")

En ArcCatalog, haga clic derecho en la capa y vaya a propiedades: ingrese la descripción de la imagen aquí

presione el botón editar:

ingrese la descripción de la imagen aquí

Ingrese los valores y luego presione OK para descartar el editor NoData y OK para aplicar el cambio.

Ahora el ráster no mostrará nada en ArcMap donde el valor de la celda sea 0,0,0.

Michael Stimson
fuente
3

Si va a las propiedades de ráster, y si la simbología se establece como compuesto RGB (que parece ser), puede marcar el cuadro Mostrar valores de fondo (RGB) y establecer lo que desee como fondo hueco. Así que simplemente establezca 0 0 0 como el valor de fondo y debería estar en el negocio.

Sr. Adam
fuente
2

Creo que la forma más fácil de lograr esto sería crear primero un ráster de condición nula, luego usar ese ráster para asignar los valores NoData a cada banda por separado.

Intente ejecutar la función Con para crear el ráster de condición nula.

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

Luego use el ráster de condición nula para asignar valores NoData a cada banda con la función Nulo establecida . Debería poder hacer esto con el generador de modelos o Python.

Ben Gosack
fuente
2

Creo que puede utilizar diferentes procedimientos de árbol que teóricamente deberían funcionar. Calculadora ráster donde puede usar esta expresión SETNULL([raster] == value, [raster]) Reclasifique donde solo debe reclasificar el valor que desea. Y usando ArcPy puede usar este script que he encontrado aquí 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
fuente