Máscara de nubes empleando C++

Después de ensayar varias condiciones de ensanchamiento de contraste para discernir cuáles eran las que segregaban los patrones de nubes en la imagen b1/b6, me propuse a generar la máscara tratando de manipular los píxeles de la imagen original. Debido a que aquella en la cual trabajé inicialmente era muy grande (4105×3981), me dispuse a seleccionar un subset (1074×903) de la región para la cual precisamente se presentaba el patrón de nubes. A continuación, la imagen b1/b6 desplegada en QGIS (desde ASCII) con un realce de contraste que representa un estiramiento MinMax y una desviación estándar (SD) de 2:

Para manipular los píxeles tenía primero que desarrollar un programa en C++ que leyera los datos originales y los volcara en un archivo con el mismo formato para ver si QGIS era capaz de leerlo de la misma manera que la imagen original en ASCII. Efectivamente, el programa desarrollado en C++ fue capaz de leer los datos de la imagen original, volcarlo en un archivo con nombre diferente y desplegarlo adecuadamente en QGIS si éste venía acompañado del imprescindible “nombre_archivo.asc.aux.xml” (no hace falta incluir la imagen porque es idéntica a la anterior).

Para generar la “máscara” me propuse, de forma arbitraria (a ver si funcionaba), a asumir un valor de la propiedad (recordar que las nubes presentan la relación b1/b6 muy elevada) por encima del cual correspondería a nubes (colocaría un 1) y, en caso contrario, colocaría un 0. Después de observar las estadísticas, vi que el máximo correspondía a 0.001024138298817 y decidí, como prueba, arbitrariamente dividirlo por 10 para asumir un umbral para nubes de 0.0001024138298817. Después de correr el programa, el archivo generado, cargado en QGIS (ensanchamiento de contraste MinMax con SD=2) lució así:

Este es un extracto del archivo ASCII leído por QGIS y generado por mi programa codificado en C++:

ncols 1074
nrows 903
xllcorner 718095.000000000000
yllcorner 1001625.000000000000
cellsize 30.000000000000
NODATA_value -3.402823466385288598e+38
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 1 ...

Para ser una asunción arbitraria funcionó bastante bien. Por otra parte, si se despliega el archivo original (usé la copia generada como prueba) con mejora de contraste “Unir a MinMax” y SD = 2, el patrón de nubes es idéntico al de la imagen original (donde las nubes son totalmente transparentes en esta imagen):

Si se coloca la máscara por detrás de la imagen en QGIS se visualiza, en negro, lo que de nubes faltó por incluir en ésta:

Esto significa que el umbral es algo menor y el paso siguiente es averiguar como se estima a partir de la data. Para ello, ya que tengo los valores de la media y de la SD en el archivo auxiliar xml, obtuve la “máscara” para la media, la media + SD y la media + 2*SD. El que arroja el archivo con la máscara de nubes es la última de ellas, es decir, la media +2*SD. Aquí está la imagen original, con mejora de contraste “Unir a MinMax” y SD = 2, y por detrás la máscara (mejora de contraste “Estirar a MinMax” y SD = 0) donde el umbral es la media + 2*SD. Ya no se observan zonas negras en el área de nubes.

Esta es la máscara, exportada como *.tif desde la desplegada en QGIS como ASCII, con nodata=0:

Cargada en R con:

nubes<-rgdal::readGDAL("nubes.tif")

Sus estadísticas ahora no arrojan error:

Data summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
      1       1       1       1       1       1  819381 

y se puede desplegar la máscara de manera similar a la que se obtiene como con los datos de Goslee (2011):

Ahora sólo falta “pulir” el programa en C++ para usarlo como herramienta de trabajo.

Esta entrada fue publicada en SIG, Teledetección. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s