LIDRのポイントクラウドから外れ値をフィルタリングする方法は?

Aug 18 2020

ALSポイントクラウドがあります。高さを正常に正規化することはできましたが、明らかにエラー/外れ値であるいくつかのポイント(0未満のポイントと、最も高い木から30〜50 mまたは100m上にある少​​数のポイント)を削除/フィルタリングする方法があるかどうか疑問に思っています。私が使用しているデータは、USGS National Mapからダウンロードされたもので、地上地点のみがすでに分類されています。

tin()アルゴリズムで正規化し、正規化点群から直接chmを作成すると、chmの最小/最大値は次のようになります。

values     : -5.23, 129.98  (min, max)

そして、dtmで正規化した場合:

values     : -14.65, 129.91  (min, max)

最終的には、樹木をセグメント化し、樹高、樹冠被覆、樹密度などの積を生成しようとしています。しかし、調査サイト全体で最大樹高が30m未満になることがわかっている場合、分析を実行できません。

地面を再分類しようとすると、0未満のポイントに役立ちますか?しかし、それは最大129mには対応しません...

li2012()アルゴリズムを利用する良い方法を見つけるのに苦労していたので、chmをスムーズにし、chm / treetopsを使用してツリーをセグメント化したほうがよいのではないかと考えていました。

回答

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()

v3.1.0のclassify_noise()

私は将来の読者のためにこの情報をここに置きます。から始めると、いくつかの可能なアルゴリズムをv3.1.0 lidR備えた関数があります(または、読んでいる時期によっては「すでにあります」)classify_noise()