¿Qué herramientas de generalización / suavizado de ráster están disponibles?

42

Tengo un DEM que me gustaría suavizar o generalizar para eliminar los extremos topográficos (cortar picos y valles de relleno). Idealmente, también me gustaría tener control sobre el radio o el nivel de "desenfoque". Al final, necesitaré un conjunto de rásteres que van desde ligeramente borrosos a realmente borrosos. (En teoría, lo más borroso sería un ráster constante de la media aritmética de todos los valores).

¿Hay alguna herramienta o método que pueda usar (basado en Esri, GDAL, GRASS)? ¿Necesito preparar mi propia rutina desenfoque gaussiano ? ¿Podría usar un filtro de paso bajo (por ejemplo, filtro ) de ArcGIS, y si es así, ¿Debería ejecutarlo un montón de veces para obtener el efecto de un radio grande?

    
pregunta Mike T 09.05.2011 - 04:03

5 respuestas

27

El desenfoque gaussiano es solo una media focal ponderada. Puede recrearlo con alta precisión con una secuencia de vecindario circular de corta distancia (sin ponderar) significa: esta es una aplicación del Teorema del límite central .

Tienes muchas opciones. El "filtro" es demasiado limitado, solo para barrios de 3 x 3, así que no se moleste con él. La mejor opción para los DEM grandes es llevar el cálculo fuera de ArcGIS a un entorno que use transformadas rápidas de Fourier: hacen los mismos cálculos focales pero (en comparación) lo hacen increíblemente rápido. (GRASS tiene un módulo FFT . Está diseñado para el procesamiento de imágenes, pero es posible que pueda presionarlo en servicio para su DEM si puede volver a escalarlo con una precisión razonable en el rango de 0..255). Salvo que, dos soluciones al menos valen la pena considerarlas:

  1. Cree un conjunto de pesos de vecindario para aproximar un desenfoque gaussiano para un vecindario de tamaño considerable. Utilice pases sucesivos de este desenfoque para crear su secuencia de DEM cada vez más suaves.

    (Los pesos se calculan como exp (-d ^ 2 / (2r)) donde d es la distancia (en celdas si lo desea) y r es la radio efectivo (también en celdas). Deben calcularse dentro de un círculo que se extienda hasta al menos 3r . Después de hacerlo, divida cada peso por la suma de todos, de modo que al final sumen 1.)

  2. Alternativamente, olvida la ponderación; simplemente ejecuta un medio focal circular repetidamente. He hecho exactamente esto para estudiar cómo cambian las cuadrículas derivadas (como la pendiente y el aspecto) con la resolución de un DEM.

Ambos métodos funcionarán bien, y después de los primeros pasos habrá poco para elegir entre los dos, pero hay rendimientos decrecientes: el radio efectivo de n medios focales sucesivos (todos usando el el mismo tamaño de vecindario) es solo (aproximadamente) la raíz cuadrada de n multiplicada por el radio de la media focal. Por lo tanto, para grandes cantidades de desenfoque, deseará comenzar de nuevo con un vecindario de gran radio. Si utiliza una media focal no ponderada, ejecute 5-6 pases sobre el DEM. Si utiliza pesos que son aproximadamente gaussianos, solo necesita una pasada, pero debe crear la matriz de peso.

De hecho, este enfoque tiene la media aritmética de la DEM como valor limitante.

    
respondido por el whuber 09.05.2011 - 06:03
41

He estado explorando el signal.convolve de SciPy basado en este libro de cocina ), y estoy teniendo algo realmente bueno éxito con el siguiente fragmento de código:

import numpy as np
from scipy.signal import fftconvolve

def gaussian_blur(in_array, size):
    # expand in_array to fit edge of kernel
    padded_array = np.pad(in_array, size, 'symmetric')
    # build kernel
    x, y = np.mgrid[-size:size + 1, -size:size + 1]
    g = np.exp(-(x**2 / float(size) + y**2 / float(size)))
    g = (g / g.sum()).astype(in_array.dtype)
    # do the Gaussian blur
    return fftconvolve(padded_array, g, mode='valid')

Lo uso en otra función que lee / escribe GeoTIFFs de float32 a través de GDAL (no es necesario volver a escalar a 0-255 bytes para el procesamiento de imágenes), y he estado utilizando intentos de tamaños de píxeles (por ejemplo, 2, 5, 20) y tiene una salida realmente agradable (visualizada en ArcGIS con 1: 1 píxel y rango constante mínimo / máximo):

Nota:estarespuestaseactualizóparautilizaruna señal mucho más rápida basada en FFT. .fftconvolve función de procesamiento.

    
respondido por el Mike T 01.06.2011 - 02:45
3

Esto podría ser un comentario para la excelente respuesta de MikeT , si no fue demasiado larga y demasiado compleja. He jugado mucho con él e hice un complemento de QGIS llamado FFT Convolution Filters (en etapa "experimental" todavía) basada en su función. Además de suavizar, el complemento también puede afilar los bordes al restar la trama suavizada de la original.

He actualizado un poco la función de Mike en el proceso:

def __gaussian_blur1d(self, in_array, size):
        #check validity
        try:
            if 0 in in_array.shape:
                raise Exception("Null array can't be processed!")
        except TypeError:
            raise Exception("Null array can't be processed!")
        # expand in_array to fit edge of kernel
        padded_array = np.pad(in_array, size, 'symmetric').astype(float)
        # build kernel
        x, y = np.mgrid[-size:size + 1, -size:size + 1]
        g = np.exp(-(x**2 / float(size) + y**2 / float(size)))
        g = (g / g.sum()).astype(float)
        # do the Gaussian blur
        out_array = fftconvolve(padded_array, g, mode='valid')
        return out_array.astype(in_array.dtype)

Las comprobaciones de validez son bastante evidentes, pero lo importante es lanzar y flotar. Antes de esto, la función hacía que las matrices de enteros fueran negras (solo ceros), debido a la división por la suma de los valores ( g / g.sum() ).

    
respondido por el Pavel V. 14.09.2015 - 16:15
2

En QGIS, obtuve buenos resultados fácilmente al utilizar Orfeo Toolbox Filtro de imagen. Es razonablemente rápido y el modo por lotes funciona bien. Se dispone de difusiones gaussianas, medias o anisotrópicas.

Tenga en cuenta que Radius se refiere al número de celdas, no a la distancia.

Aquí hay un ejemplo que utiliza Smoothing (gaussian) :

  • Raw:

  • Filtered:

respondido por el Tactopoda 17.08.2017 - 06:02
1

Buena solución para el desenfoque gaussiano y la animación genial. Con respecto a la herramienta de filtro Esri mencionada anteriormente, eso es básicamente la herramienta de "Estadísticas Focales" de Esri codificada en un tamaño de 3x3. La herramienta Estadísticas Focales le ofrece muchas más opciones sobre la forma de su filtro móvil, el tamaño y la estadística que desea ejecutar. enlace

También puede hacer un filtro "irregular" donde pase su propio archivo de texto con pesos para usar en cada celda. El archivo de texto tiene tantas filas como desee en su área de filtro, con valores delimitados por espacios en blanco para las columnas. Supongo que siempre debe usar un número impar de filas y columnas, de modo que su celda objetivo esté en el medio.

Creé una hoja de cálculo de Excel para jugar con diferentes pesos que acabo de copiar / pegar en este archivo. Debería lograr los mismos resultados que arriba si ajusta las fórmulas.

    
respondido por el David A 25.11.2017 - 01:18

Lea otras preguntas en las etiquetas