¿Reducir la extensión del procesamiento ráster en ArcPy o ArcGIS Desktop?

8

Necesito reducir la extensión de procesamiento de mi ráster mediante algún tipo de procedimiento automático en Python. Actualmente, los bordes del conjunto de datos que he estado usando tienen anomalías (debido a la clasificación de las líneas de escaneo de Landsat).

ScanLines Classified

Me gustaría reducir la extensión del procesamiento de ráster para que cuando recupere la información anterior mediante una función SetNull no se procesen los bordes. Algo como Zona

Ahora esto se puede hacer fácilmente con un extracto por función de máscara (es decir, figura 2), aunque eso requeriría la selección manual de la región de enmascaramiento. ¿Hay algún método que pueda utilizar para calcular la región de extensión (ignorando los valores de nodata) menos el ancho del borde en la dirección x e y de cada fila / columna y luego utilizar arcpy.env.extenten Python?

BJEBN
fuente
¿Podría obtener la extensión de la trama completa y luego restar una distancia estándar de cada lado? ¿O es eso demasiado simplista?
Radar
Eso funcionaría suponiendo que la extensión se deriva de aquellas áreas con valores en lugar de toda el área (es decir, valores de nodata)
BJEBN
1
Tengo problemas para entender lo que constituye una "frontera". ¿Desea detectar automáticamente las anomalías de escaneo y luego recortarlas? Si es así, ¿está buscando un método que le permita detectar estas anomalías?
Radar
El borde es el área del ráster que contiene valores; tal vez la segunda imagen de arriba es un poco confusa, ya que ahora veo que son valores periféricos (debe haber una capa adicional activa cuando tomé una captura de pantalla). El área sólida de arriba es el borde de la trama: el cuadrado rojo es la extensión de la trama deseada, mientras que la extensión de la trama actual es la imagen completa (incluidos los valores blancos * nodata)
BJEBN

Respuestas:

9

Este flujo de trabajo trata primero con la basura que flota alrededor de los bordes y luego resuelve el problema.

  1. Crear un indicador binario del área "borde", que considero que incluye todas las celdas NoData circundantes. Es conveniente usar cualquier valor para indicar el borde y NoData para el resto, como en SetNull(Not(IsNull('X')), 1):

    Frontera

  2. Agrupe el resultado y seleccione el componente de borde. (Esto generalmente puede automatizarse seleccionando el componente con el mayor valor de [Count]). La imagen se verá casi igual; aquí solo se excluyen unos pocos píxeles perdidos en el centro, pero deben excluirse para que el siguiente paso funcione.

    (Un enfoque alternativo es usar operaciones morfológicas primero para reducir el borde y luego volver a expandirlo: esto borra los bits aislados en el medio).

  3. Calcule la cuadrícula de distancia euclidiana al componente de borde.

    Distancias

  4. Enmascara todas las distancias pequeñas en la imagen original, como en SetNull(([Distance to Border component] < 30),X ):

    Resultado

(La imagen final muestra el borde original en verde superpuesto, como referencia, en el resultado).

whuber
fuente