Как отфильтровать выбросы из облака точек в lidr?

Aug 18 2020

У меня есть облако точек ALS. Мне удалось успешно нормализовать высоту, но мне интересно, есть ли способ удалить / отфильтровать некоторые точки, которые явно являются ошибками / выбросами (точки ниже 0 и несколько точек на 30-50 м или даже 100 м выше самых высоких деревьев). Данные, которые я использую, были загружены с национальной карты USGS, и только наземные точки уже классифицированы.

Если я нормализую с помощью tin()алгоритма и создаю свой chm прямо из облака точек нормализации, мои минимальные / максимальные значения chm будут:

values     : -5.23, 129.98  (min, max)

и если я нормализую с помощью dtm:

values     : -14.65, 129.91  (min, max)

В конечном итоге я пытаюсь сегментировать деревья и генерировать продукты высоты деревьев, покрытия кроны, плотности деревьев и т. Д. Но я не могу провести свой анализ, когда знаю, что максимальная высота дерева будет <30 м на моем участке исследования.

Если я попытаюсь изменить классификацию земли, поможет ли это с баллами ниже 0? Но это не касается максимума 129 м ...

Я подумал, может быть, мне лучше сгладить мой chm и использовать вершины chm / tree для сегментации деревьев, поскольку у меня возникли проблемы с поиском хорошего способа использования li2012()алгоритма.

Ответы

3 JRR Aug 18 2020 at 19:55

«Продвинутой» фильтрации выбросов lidR пока нет . Но для простых случаев вы можете построить простой метод самостоятельно. Вот несколько советов, и вы можете изменить примеры в соответствии со своими потребностями.

Отфильтруйте достопримечательности с помощью пороговых значений

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

Отфильтруйте высокие выбросы с помощью 95-го процентиля CHM

Это пример из этой виньетки . Он строит растр 95-го процентиля и удаляет то, что является слишком высоким относительно этой карты высот.

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)

Фильтрация выбросов с помощью точечных показателей

Примеров не приводится, но в конце этой главы есть раздел, в котором объясняется, как создать довольно продвинутый метод фильтрации выбросов с помощьюpoint_metrics()

classify_noise () в версии 3.1.0

Я поместил эту информацию здесь для будущих читателей. Начиная с v3.1.0 lidRбудет иметь (или «уже есть» в зависимости от того, когда вы читаете) функцию classify_noise()с несколькими возможными алгоритмами.