¿Cómo filtrar valores atípicos de la nube de puntos en lidr?
Tengo una nube de puntos de ELA. He podido normalizar con éxito la altura, pero me pregunto si hay alguna forma de eliminar / filtrar algunos puntos que obviamente son errores / valores atípicos (puntos por debajo de 0 y un puñado que están 30-50 mo incluso 100 m por encima de los árboles más altos). Los datos que estoy usando se descargaron del Mapa Nacional de USGS con solo puntos terrestres ya clasificados.
Si normalizo con el tin()
algoritmo y creo mi chm directamente desde la nube de puntos de normalización, mis valores chm min / max son:
values : -5.23, 129.98 (min, max)
y si normalizo con un dtm:
values : -14.65, 129.91 (min, max)
En última instancia, estoy tratando de segmentar árboles y generar productos de alturas de árboles, cobertura de copas, densidad de árboles, etc. Pero no puedo ejecutar mi análisis cuando sé que la altura máxima del árbol será <30 m en mi sitio de estudio.
Si trato de reclasificar el suelo, ¿ayudará eso con los puntos por debajo de 0? Pero eso no abordará el máximo de 129 m ...
Estaba pensando que tal vez sería mejor suavizar mi chm y usar las copas de chm / tree para segmentar árboles, ya que estaba teniendo problemas para encontrar una buena manera de utilizar el li2012()
algoritmo.
Respuestas
No hay una 'avanzada' valor atípico en el filtrado lidR
sin embargo . Pero para casos simples, usted mismo puede crear un método simple. Aquí hay algunas sugerencias y puede modificar los ejemplos para que se ajusten a sus necesidades.
Filtrar puntos de interés mediante umbrales
las <- filter_poi(las, Z >= 0, Z <= 30)
Filtrar valores atípicos altos utilizando CHM del percentil 95
Este es un ejemplo tomado de esta viñeta . Construye un ráster del percentil 95 y elimina lo que es demasiado alto en relación con este mapa de altura.
filter_noise = function(las, sensitivity)
{
p95 <- grid_metrics(las, ~quantile(Z, probs = 0.95), 10)
las <- merge_spatial(las, p95, "p95")
las <- filter_poi(las, Z < p95*sensitivity)
las$p95 <- NULL
return(las)
}
las <- filter_noise(las, sensitivity = 1.2)
Filtrar valores atípicos mediante métricas basadas en puntos
No se proporciona ningún ejemplo, pero al final de este capítulo hay una sección que explica cómo crear un método de filtro de valores atípicos bastante avanzado conpoint_metrics()
classify_noise () en v3.1.0
Pongo esta información aquí para futuros lectores. A partir de v3.1.0
lidR
tendrá (o 'ya tiene' dependiendo de cuándo esté leyendo) una función classify_noise()
con varios algoritmos posibles.