Maneira de filtrar outliers da nuvem de pontos em lidr?

Aug 18 2020

Eu tenho uma nuvem de pontos ALS. Consegui normalizar a altura com sucesso, mas estou me perguntando se há alguma maneira de remover / filtrar alguns pontos que são obviamente erros / outliers (pontos abaixo de 0 e alguns que estão 30-50m ou mesmo 100m acima das árvores mais altas). Os dados que estou usando foram baixados do Mapa Nacional do USGS com apenas pontos de solo já classificados.

Se eu normalizar com o tin()algoritmo e criar meu chm direto da nuvem de pontos de normalização, meus valores de chm mín / máx serão:

values     : -5.23, 129.98  (min, max)

e se eu normalizar com um dtm:

values     : -14.65, 129.91  (min, max)

No final das contas, estou tentando segmentar árvores e gerar produtos de alturas de árvores, cobertura de dossel, densidade de árvores, etc. Mas não posso executar minha análise quando sei que a altura máxima da árvore será <30m em meu local de estudo.

Se eu tentar reclassificar o solo, isso ajudará com os pontos abaixo de 0? Mas isso não vai resolver o maximo 129m ...

Eu estava pensando que talvez fosse melhor suavizar meu chm e usar o chm / tree tops para segmentar árvores, pois estava tendo problemas para encontrar uma boa maneira de utilizar o li2012()algoritmo.

Respostas

3 JRR Aug 18 2020 at 19:55

Não há 'avançado' outlier filtragem no lidR entanto . Mas, para casos simples, você mesmo pode construir um método simples. Aqui estão algumas dicas e você pode modificar os exemplos para atender às suas necessidades.

Filtrar ponto de interesse usando limites

las <- filter_poi(las, Z >= 0, Z <= 30)

Filtrar valores discrepantes usando CHM de 95º percentil

Este é um exemplo retirado desta vinheta . Ele cria um raster de 95º percentil e remove o que é muito alto em relação a 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 outliers usando métricas baseadas em pontos

Não há exemplo dado, mas no final deste capítulo há uma seção que explica como construir um método de filtro de outlier bastante avançado compoint_metrics()

classify_noise () na v3.1.0

Eu coloco essas informações aqui para futuros leitores. Começando por v3.1.0 lidRterá (ou 'já tem' dependendo de quando você estiver lendo) uma função classify_noise()com vários algoritmos possíveis.