Come filtrare i valori anomali dalla nuvola di punti in Lidr?

Aug 18 2020

Ho una nuvola di punti SLA. Sono stato in grado di normalizzare con successo l'altezza, ma mi chiedo se c'è un modo per rimuovere / filtrare alcuni punti che sono ovviamente errori / valori anomali (punti inferiori a 0 e una manciata che sono 30-50 mo addirittura 100 m sopra gli alberi più alti). I dati che sto utilizzando sono stati scaricati dalla USGS National Map con solo i punti di terra già classificati.

Se normalizzo con l' tin()algoritmo e creo il mio chm direttamente dalla nuvola di punti di normalizzazione, i miei valori chm min / max sono:

values     : -5.23, 129.98  (min, max)

e se normalizzo con un dtm:

values     : -14.65, 129.91  (min, max)

In definitiva, sto cercando di segmentare gli alberi e generare prodotti di altezza degli alberi, copertura della chioma, densità degli alberi, ecc. Ma non posso eseguire la mia analisi quando so che l'altezza massima degli alberi sarà <30 m nel mio sito di studio.

Se provo a riclassificare il terreno, sarà utile con i punti inferiori a 0? Ma questo non risolverà i 129 m max ...

Stavo pensando che forse sarebbe stato meglio smussare il mio chm e utilizzare le cime degli alberi / chm per segmentare gli alberi poiché avevo problemi a trovare un buon modo per utilizzare l' li2012()algoritmo.

Risposte

3 JRR Aug 18 2020 at 19:55

Non v'è alcun 'avanzata' outlier filtraggio in lidR ancora . Ma per casi semplici puoi costruire tu stesso un metodo semplice. Ecco alcuni suggerimenti e puoi modificare gli esempi in base alle tue esigenze.

Filtra i punti di interesse utilizzando le soglie

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

Filtra valori anomali elevati utilizzando CHM al 95 ° percentile

Questo è un esempio tratto da questa vignetta . Crea un raster del 95 ° percentile e rimuove ciò che è troppo alto rispetto a questa mappa di altezza.

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)

Filtra i valori anomali utilizzando metriche basate su punti

Non ci sono esempi forniti ma alla fine di questo capitolo c'è una sezione che spiega come costruire un metodo di filtro dei valori anomali piuttosto avanzato conpoint_metrics()

classify_noise () nella v3.1.0

Metto queste informazioni qui per i futuri lettori. A partire da v3.1.0 lidRavrà (o 'già ha' a seconda di quando stai leggendo) una funzione classify_noise()con diversi algoritmi possibili.