Extracción de tejados a partir de fotografía oblicua

Al hilo de las entradas anteriores, en la siguiente entrada os voy a mostrar otra de las muchas aplicaciones que puede desempeñar un topógrafo. Si he resaltado la palabra topógrafo, entendiendo topógrafo como técnico cualificado. Sin entrar al trapo en si otro técnico puede realizar este tipo de tareas (que en mi opinión la respuesta sería un NO rotundo) os voy a mostrar lo que fue una parte de mi Trabajo Fin de Máster presentado.

Como dice el título, la finalidad es extraer aquellos puntos pertenecientes a cubiertas a partir de fotogrametría oblicua. Para ello partimos de un vuelo empleando una cámara Pictometry Penta View N5 16MP con 5 sensores (1 ortogonal y 4 oblicuos a 45º) con un GSD promedio de 0.106 m. La dirección del vuelo es este-oeste con un recubrimiento 60/40


En una primera fase de trabajo, con el software Agisoft PhotoScan, procesamos las imágenes y generamos una nube de puntos, siguiendo el siguiente flujo de trabajo; 


Al no ser el objetivo del post hablar como funciona la herramienta o que variables se han ingresado para cada fase, me remito únicamente a mostraros el resultado de la nube generada. No obstante, si alguien estuviera interesado, no dude en contactar conmigo. (Sólo muestro la nube generada para el área de estudio)



Una vez tenemos la nube de puntos (georreferenciada), el procesado para la extracción de cubiertas lo realizaremos utilizando la aplicación gratuita CloudCompare. Si no la conocéis, os dejo el enlace para que podáis descargar esta potentísima aplicación.

CloudCompare

El flujo de trabajo seguido es el siguiente;



COMPUTACIÓN DE NORMALES

Para futuros pasos, necesitaremos calcular las normales de la nube de puntos. La computación es totalmente automática. Los parámetros ingresados son los siguientes;

·         Modelo local de superficie: “Plano”

·        Vecino más próximo: Usando el cálculo automático, nos generará un octree R=12,62

·       Orientación: El método trata de reorientar todas las normales de una manera consistente, comenzando desde un punto aleatorio y propagando la orientación de la normal de un vecino a otro. La propagación se basa en el método minimum spanning tree). Para este caso, el número máximo de vecinos conectado a cada nodo se ha determinado tal que knn=6


      SEGMENTACIÓN MANUAL DE ZONAS VERDES


      En esta fase de trabajo, se optará por segmentar toda la zona correspondiente al monte Urgul, ya que tras una inspección visual, nos damos cuenta de que a partir de la cota 42 aproximadamente, no se encuentra ningún edificio, por lo que a fin de aligerar los cálculos posteriores decidimos segmentar manualmente esta zona.






SEGMENTACIÓN DE FACHADAS

A fin de eliminar los puntos correspondientes a fachadas de edificios, se procederá a un filtrado por pendientes. Suponiendo que las fachadas son verticales o casi verticales, eliminaremos todos aquellos puntos que tengan una pendiente inferior a 87 º. 




SEGMENTACIÓN DEL TERRENO

En esta fase, realizaremos una segmentación de terreno. De esta manera, se intentarán eliminar todos aquellos puntos que pertenezcan a aceras, viales, escolleras, etc. Para ello se utilizará el filtro CSF (Cloth Simulation Filter)  integrado en CloudCompare.

Para aplicar el filtro se introducirán los siguientes parámetros:

·         Scene: Se refiere a la topografía del terreno. En nuestro caso asumimos que el terreno es plano, o al menos que carece de grandes pendientes.
·         Cloth resolution: Referido al tamaño de la malla o la hipotética tela. El valor que ingresaremos será de 0,7.

·         Max iteraciones: Se proponen 1.000 iteraciones para el cálculo

·         Classification threshold: Umbral de clasificación para clasificar la nube de puntos en puntos terreno y no-terreno. Por defecto se estipula en 0,5.

Una vez aplicamos el filtro sobre nuestra nube de puntos, obtendremos dos nubes; Una primera en la que se mostrarán únicamente los puntos correspondientes al terreno, y una segunda nube con puntos no-terreno. Superponiendo ambas nubes, se aprecia la clasificación hecha;


SEGMENTACIÓN DE PUNTOS AISLADOS

Tras haber realizado satisfactoriamente la segmentación de terreno, procederemos a eliminar todos aquellos puntos dispersos que se encuentren en la nube. Para ello utilizaremos la herramienta “SOR” (Statistical Outlier Removal). En un primer paso, la herramienta calculará la distancia media de cada punto  a sus vecinos, considerando “k” vecinos más cercanos para cada punto. A continuación rechaza los puntos que están más lejos que la distancia más un número “n” de veces la desviación estándar. La herramienta nos pedirá que ingresemos el número de puntos a usar para el cálculo de la estimación de la distancia media (k) y el multiplicador de la desviación estándar (nSigma).
Para nuestro caso en concreto, previamente habiendo realizado diferentes experimentos con diferentes valores,  asumimos los siguientes valores;
·         K = 2.500

·         nSigma = 1


SEGMENTACIÓN DE TEJADOS

En esta última fase, tras haber dejado la nube lo más limpia posible, procederemos a extraer aquellos puntos que pertenecen a cubiertas. El procesado lo realizaremos con la herramienta qCANUPO (Brodu, Lague, 2012) en CloudCompare. En el siguiente enlace os dejo la documentación de esta herramienta

http://www.cloudcompare.org/doc/wiki/index.php?title=CANUPO_(plugin)



Obteniendo el siguiente resultado:



Como siempre pasa, a muy pesar de muchos "profesionales" no existe el botón mágico, y este caso no iba a ser menos, por lo que el proceso final de segmentación será manual, obteniendo el siguiente resultado


Me gustaría aclarar que cuando decimos que se ha hecho algún proceso automático, habría que decir que ha sido "semi-automático", ya que aunque tengamos herramientas que "nos hacen las cosas" hay que decirle como queremos que nos las haga.

Espero que os haya gustado lo que fue una parte de mi TFM y cualquier duda o comentario será bien recivido