1 votos

Imagen de la varianza local en python usando gdal y un enfoque de ventana corrida

Quiero una imagen de varianza local con un 3x3 de una imagen raster geoespacial usando python. Mi enfoque hasta ahora era leer en la banda raster como una matriz, a continuación, utilizando la notación matricial para ejecutar una ventana móvil y escribir la matriz en una nueva imagen raster. Este enfoque funcionó bien para un filtro de paso alto como se describe en este tutorial: http://www.gis.usu.edu/~chrisg/python/2009/lectures/ospy_slides6.pdf

Luego intenté calcular la varianza con varias aproximaciones, la última usando numpy (como np), pero sólo obtengo una imagen gris con el mismo valor en todas partes. Estoy abierto a cualquier tipo de solución. Si al final me da la varianza local media, sería aún mejor Gracias, Mace

  rows = srcDS.RasterYSize
  #read in as array
  data = srcBand.ReadAsArray(0,0, cols, rows).astype(np.int)

  #calculate the variance for a 3x3 window
  outVariance = np.zeros((rows, cols), np.float)
  outVariance[1:rows-1,1:cols-1] = np.var([(data[0:rows-2,0:cols-2]),
    (data[0:rows-2,1:cols-1]),
    (data[0:rows-2,2:cols]  ),
    (data[1:rows-1,0:cols-2]),
    (data[1:rows-1,1:cols-1]),
    (data[1:rows-1,2:cols]  ),
    (data[2:rows,0:cols-2]  ),
    (data[2:rows,1:cols-1]  ),
    (data[2:rows,2:cols]    )])
  #output 
  outDS = driver.Create(outFN, cols, rows, 1, GDT_Float32)
  outDS.SetGeoTransform(srcDS.GetGeoTransform())
  outDS.SetProjection(srcDS.GetProjection())
  outBand = outDS.GetRasterBand(1)
  outBand.WriteArray(outVariance,0,0)
  ...

2voto

palako Puntos 163

Este truco de otro usuario en Stackoverflow solucionó el problema:

from scipy import ndimage
outVariance = ndimage.generic_filter(data, np.var, size=3)

Ver aquí para una descripción detallada de la respuesta:

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X