miércoles, 6 de junio de 2012

Clasificación No Supervisa gvSIG y Condicional en la Calculadora Raster

En este ejemplo se hace una clasificación No-Supervisada con gvSIG y Sextante y después solo se extrae la cobertura de interés por ejemplo los cuerpos de agua.
Un poco de teoría. Existen diferentes métodos o técnicas que permiten extraer los elementos presentes en una imagen. Para nuestro caso hablo de las cobertura en una imagen de satélite. Esos métodos de clasificación se agrupan en dos: supervisados y no supervisados, a nivel general.

Clasificación supervisada[1]
Este tipo de clasificación supone que se tiene un conocimiento de la zona, osea somos capaces de proporcionar o indicar cuales son la muestras (pixeles en diferentes bandas) para entrenar el algoritmo. Luego del entrenamiento el clasificador es capaz de determinar a que grupo o clase pertenecen el resto de elementos (pixeles), y así generar una capa que representa, por ejemplos las coberturas de una zona.

Clasificación no supervisada[1]
A diferencia de la supervisada se supone que no contamos con conocimiento de la zona, por lo que no podríamos entrenar los algoritmos para la clasificación supervisada. En general en este tipo de clasificación parte de la propiedades estadísticas y de vecindad que tiene la información (pixeles en diferentes bandas) y se van agrupando formando clases de manera iterativa. La clasificación no supervisada se la suele llamar también clustering(agrupamiento).

Veamos los pasos.

1- Abrimos gvSIG y cargamos nuestra imagen de satélite. Para este ejercicio utilizo una imagen Landsat, realizo una composición RGB(432).

2- Abrimos Sextante y buscamos Herramientas de análisis para capas raster/Clasificación no supervisada(clustering)...

3- La configuramos así, en la pestaña Parámetros recomiendo seleccionar tres bandas, para este ejercicio la 4, la 3 y la 2. En numero de clases tomo 10 pero dependiendo de la imagen pueden ser menos o mas. Solo tener en cuenta que es mejor que el clasificador agrupe lo mas acertado posible y esto se logra con un buen trio de bandas y suficientes clases. En otras palabras si mi me interesan tres clases de la imagen es mejor clasificarla en 7 y después escoger la clases que me forma mis elementos de interés.

4- en la pestaña Parámetros Región de Análisis la opción que mejor resultado me  proporcionado es  utilizar la extensión de otra capa, después de esto pulsamos el botón aceptar.
5- Una muestra del resultado.

Entendiendo un poco, los que tenemos es una capa resultado que agrupa en 10 clases los pixeles de las bandas 4,3 y 2 que participan en el proceso. A cada clase le asigna un numero como identificador y sobre los cuales podemos hacer diferentes operaciones.
Hagamos el ejercicio de extraer los cuerpos de agua con ayuda de la calculadora raster. procedemos así,
1- Teniendo nuestra capa resultado activa, seleccionamos el botón de información (botón con letra i de color blanco sobre un circulo azul) y picamos lo que consideramos como cuerpo de agua. así podremos saber cual es el valor del pixel asignado a esta clase. Para nuestro ejemplo ahora sabemos que los cuerpos de agua tiene el valor 1

2- En Sextante buscamos Herramientas de calculo para capas raster/calculadora de mapas...

3- Escribimos la sintaxis para extraer el valor. Esto realmente se puede hacer de otras formas pero quiero que veas la alternativa con el condicional if(), básicamente funciona así, if(condición, proceso 1, proceso 2), el proceso 1 se ejecuta si la condición es verdadera de lo contrario (osea si la condición es falsa) se ejecuta el proceso 2. Nuestro condicional quedaría como , if(Agregados Band 1 == 1, 1, 0). Puedes anidar varios condicionales.

4- Podemos observar el resultado. De una forma muy rápida se extrajo el cuerpo de agua, aunque en el resultado muestra otras zona que seguramente no lo son, esto se puede mejorar con otra combinación de bandas, o aumentando el numero de clases, también puedes vectorizar y eliminar los polígonos que no necesitas.

Saludos y espero que les sirva...
Tarea: Trata de hacerlo con mas coberturas anidando por ejemplo dos condicionales, te explico como.
if(condición1, proceso 1, if(condición2, proceso 3, proceso 4)proceso 2), el proceso 1 se ejecuta si la condición1 es verdadera de lo contrario (osea si la condición1 es falsa) se  evalúa la condición2, si esta es verdadera se ejecuta el proceso 3 y si la condición 2 es falsa se ejecuta el proceso 4.
Dejo un vídeo para mayor facilidad


[1] http://es.wikipedia.org/wiki/Reconocimiento_de_patrones