リモートセンシングデータ(視覚画像とLiDAR)から樹冠領域を抽出する


12

リモートセンシング画像を処理し、画像から個々の木の冠領域を抽出する方法を探しています。

可視波長領域画像と、そのエリアのLIDARデータの両方があります。問題の場所は砂漠地帯であるため、樹木被覆は森林地帯ほど密ではありません。航空写真の解像度は0.5フィートx 0.5フィートです。LIDARの解像度は約1 x 1フィートです。視覚データとライダーの両方は、アリゾナ州ピマ郡のデータセットから取得されます。私が持っている航空写真の種類のサンプルは、この投稿の最後にあります。

この質問は、ArcMapでの単一ツリーの検出ですか?同じ問題のように見えますが、そこには良い答えがないようです。

ArcmapのIso Cluster分類を使用して、エリア内の植生タイプの合理的な分類(および全体の被覆率に関する情報)を取得できますが、個々のツリーに関する情報はほとんど提供されません。必要なものに最も近いのは、アイソクラスター分類の出力をArcmapのRaster to Polygon機能に渡した結果です。問題は、この方法が木の近くで単一のポリゴンにマージされることです。

編集:私はおそらく私が持っているものについて、さらに詳細を含めるべきでした。私が持っている生データセットは次のとおりです。

  • 完全なlasデータと、それから生成されたTIFFラスター。
  • 視覚画像(表示されているサンプル画像に似ていますが、はるかに広い領域をカバーしています)
  • エリア内の木のサブセットの手動直接測定。

これらから私は生成しました:

  1. 地上/植生の分類。
  2. DEM / DSMラスター。

航空写真のサンプル


リンクよりも多くのデータがあります。分類されたlasファイル、またはDEM / DSMラスタ(どちらですか?)がありますか?視覚の波長だけでこれをあらゆる精度で行うのは本当に簡単ではありません。
マイケルスティムソン14

私はおそらく、私が持っているものについてもっと詳細を含めるべきだったでしょう。私が持っている未加工のデータセットは次のとおりです。1.フルlasデータ、およびそれから生成されたTiffラスターエリア。これらのことから私は、生成されています。1.地上/植生分類2. DEM / DSMラスタ
セオドア・ジョーンズ

eCognitionにアクセスできますか?そうでない場合、どの画像処理ソフトウェアまたはプログラミング言語にアクセスできるか、または知っていますか?
アーロン

私はeCognitionのコピーを持っていませんが、このタイプのことで人気があるように見えるので、ラボ/大学で知っている人が持っているかどうかを確認します。私はPython、C、Javaに精通しています。私はMatlabのコピーを持っていますが、私はそれでかなり初心者です。このリストにあるソフトウェアのいずれかにアクセスできますsoftwarelicense.arizona.edu/students、そしてもちろんArcGIS。
セオドアジョーンズ14

私が持っている商用アプリケーションのもう少し詳細。リンクしたソフトウェアのリストには、Matlab、Mathematica、JMP、その他の統計ツール、およびVisual Studioなどのソフトウェア開発ツールが含まれています。
セオドアジョーンズ14

回答:


10

スペクトルおよびLIDARデータでの個々のクラウンの検出に関する多くの文献があります。賢明な方法は、おそらく以下で始まる:

Falkowski、MJ、AMS Smith、PE Gessler、AT Hudak、LA Vierling、JS Evans。(2008)。LIDARデータを使用した2つの個別の樹木測定アルゴリズムの精度に対する針葉樹林の天蓋カバーの影響。Canadian Journal of Remote Sensing 34(2):338-350。

スミスAMS、EKストランド、CMスティール、DBハン、SRギャリティ、MJファルコウスキー、JSエヴァンス(2008)多時期の航空写真におけるジュニパーの侵入のオブジェクトごとの分析による植生空間構造マップの作成。Canadian Journal Remote Sensing 34(2):268-285

Waveletメソッド(Smith et al。、2008)に興味があるなら、Pythonでコーディングしていますが、非常に遅いです。Matlabの経験がある場合、これが実稼働モードで実装される場所です。NAIP RGB-NIR画像を使用したウェーブレット法を使用してオレゴン州東部で約600万エーカーのジュニパー侵入を特定した2つの論文があるため、十分に証明されています。

Baruch-Mordo、S.、JS Evans、J。Severson、JD Naugle、J。Kiesecker、J。Maestas、およびMJ Falkowski(2013)木からのセイジライチョウの保存:候補者に対する主要な脅威を減らすための積極的なソリューション生物保護167:233-241

Poznanovic、AJ、MJ Falkowski、AL Maclean、およびJS Evans(2014)ジュニパーウッドランドのツリー検出アルゴリズムの精度評価。写真測量工学およびリモートセンシング80(5):627–637

一般的なオブジェクトの分解では、スケール全体でオブジェクトの特性を分解するために多重解像度ガウス過程を使用した応用数学状態空間文献から、いくつかの興味深いアプローチがあります。これらのタイプのモデルを使用して、生態学的モデルのマルチスケールプロセスを記述しますが、画像オブジェクトの特性を分解するように適合させることができます。楽しいですが、少し難解です。

Gramacy、RB、およびHKH Lee(2008)Bayesian treed Gaussianプロセスモデルとコンピューターモデリングへの応用。Journal of the American Statistical Association、103(483):1119-1130

Kim、HM、BK Mallick、およびCC Holmes(2005)区分的ガウス過程を使用した非定常空間データの分析。Journal of the American Statistical Association、100(470):653–668


+1特にオプション4の場合。OPにはLIDARデータがあるため、キャノピーサーフェスモデルでウェーブレットメソッドを実行する価値があります。ただし、ご存知のように、ウェーブレット法はまだ主流ではありません(またはこれまでにないかもしれません)。
アーロン

万能の理想への賛辞として、私は商用ソフトウェア(例えば、ESRI、ERDAS)をBig-boxソフトウェアと呼び始めます。多くの場合、「ビッグボックスソフトウェア」では最適なソリューションは利用できません。多くの場合、複雑な空間分析の問題に対する回答を得るために、開発コミュニティまたは学術コミュニティに目を向ける必要があります。これにより、大急ぎで主流から抜け出します。幸いなことに、これらのコミュニティは共有を好みます。これは、アナリストがプッシュボタンソリューションに依存しないことが重要である理由でもあります。
ジェフリーエヴァンス14

2
私は、複雑な空間問題の掲示板について同意する傾向があります。ただし、乾燥した環境で1種類の植生を抽出することは(特にLIDARデータにアクセスできる場合)、かなり主流です。この場合、単純なツリー識別への新しいアプローチを開発することにより、車輪を再発明する必要はありません。私の考えは、特に自動化に非常に適しているeCognitionのようなパッケージで、事前に確立されたプッシュボタンアプローチを使用しない理由です。
アーロン

1
eCognitionには個々のクラウンIDの容量があります。例として、eCogコミュニティで、種の成長アプローチを使用するサンプルルールセットを見つけることができます。「Oil Palm Tree Delineationサンプルルールセット」を検索してください。eCogの新しいテンプレートマッチングアルゴリズムとこのシード成長アプローチの統合は、非常に強力な方法になる可能性があります。
アーロン

1
Smith(2008)Waveletメソッドについて言及したPythonコードに興味があります。どこでも利用できますか?
アルフェウス

4

eCognitionはそのための最良のソフトウェアです。他のソフトウェアを使用してそれを行いましたが、eCognitionの方が優れています。このテーマに関する文献の参照先は次のとおりです。

カールソン、M。、リース、H。、およびオストワルド、M。(2014)。WorldView-2画像と地理オブジェクトベースの画像解析を使用した、半乾燥した西アフリカの管理されたウッドランド(パークランド)での樹冠マッピング。センサー、14(12)、22643-22669。

例:http : //www.mdpi.com/1424-8220/14/12/22643

さらに:

ザガリキス、G。、キャメロン、AD、およびミラー、DR(2005)。デジタル写真測量法と画像分析技術を応用して、樹木と林分の特性を導き出します。カナダの森林研究ジャーナル、35(5)、1224-1237。

例:http : //www.nrcresearchpress.com/doi/abs/10.1139/x05-030#.VJmMb14gAA


eCognitionが優れている理由を詳しく教えてください。リンクのみの回答は、リンクがなくなると無効になる傾向があります。
アーロン

1
eCognitionはオブジェクトベースの画像解析ソフトウェアであり、他のソフトウェアは今ではありません。同様のアプローチを使用しました。導出木のデジタル写真測量及び画像解析技術の適用および特性G Zagalikis、ADキャメロン、森林研究所のDRミラーカナディアン・ジャーナル、2005、35(5)スタンド:1224年から1237年、10.1139 / x05-030 nrcresearchpress.com/doiを/abs/10.1139/x05-030#.VJmMb14gAA
ジョルゴスザガリキス14

1
参照Giorgosをありがとう。これらのコメントは、回答の編集としてうまく機能すると思います。
アーロン

3

DEMを作成してDEMからDEMを減算するには、Esri Raster CalculatorまたはGDAL_CALCでこれを実行できます。これにより、すべての標高が「平等な競技場」に置かれます。

構文(DEM、DSMおよびDHMの代替フルパス):

GDAL_CALC.py -A DSM -B DEM --outfile=DHM --CALC "A-B"

DHMの大部分は0(または十分に近い)であり、これをnodata値にします。Raster CalculatorまたはGDAL_CALCを使用すると、DHMで観測されるノイズの量に基づいて、任意の値以上の値を抽出できます。この目的は、ノイズを減らし、植生の冠だけを強調することです。2つの「木」が隣接している場合、これは2つの別個の塊に分割する必要があります。

構文(バイナリおよびDHMの完全なパスと、値の観測値の置換):

GDAL_CALC.py -A DHM --outfile=Binary --calc "A*(A>Value)"

GDAL_CALCまたはEsri IsNullのいずれかでバイナリラスタを作成し、GDAL_PolygonizeまたはEsri Raster to Polygonでポリゴン化できます。

ポリゴンを改良するには、過度に小さいポリゴンを削除してから、シグネチャを探しているRGBバンドと比較し、Esriでゾーン統計ツールが役立ちます。その後、明らかに正しい統計情報を持たないポリゴンを破棄できます(実験とデータに基づいて、値を提供することはできません)。

これにより、個々のクラウンのプロットで約80%の精度が得られます。


ありがとう。この方法で良い結果が得られるかどうかを確認します。
セオドアジョーンズ14

適切な値を得るには、いくつかの実験を行う必要があります。データ内の最良/最悪の領域を示す(類似する)サンプルとして、小さな領域をクリッピングすることをお勧めします。パラメーターを取得するには、6回のサンプル実行が必要になる場合がありますが、それでも手動でプロットするよりも優れている必要があります。
マイケルスティムソン14

3

私は数年前に同じ問題を抱えていました。フィルター処理されたLASデータやその他の補助データを必要としないソリューションがあります。LiDARデータにアクセスでき、さまざまなリターンからDEM / DSM / DHM(DEM、以降、サーフェスモデルの命名法のセマンティクスについては議論していません)を生成できる場合、次のスクリプトが役立ちます。

arcpyスクリプトは3つのDEMを取り込み、フォレストポリゴンとツリーポイントシェープファイルを吐き出します。3つのDEMは、同じ空間解像度(つまり1メートル)と範囲を持ち、最初のリターン、最後のリターン、およびベアアースを表す必要があります。野菜抽出用の非常に特定のパラメーターがありましたが、他のニーズに合わせてパラメーターを変更できます。これは、Pythonスクリプト作成の最初の本格的な試みであったため、プロセスを改善できると確信しています。

# Name:         Veg_Extractor.py
# Date:         2013-07-16
# Usage:        ArcMap 10.0; Spatial Analyst
# Input:        1 meter DEMs for first returns (DEM1), last returns (DEM2), and bare earth (BE)
# Output:       forest polygon (veg with height > 4m) shapefile with holes > 500m removed;
#               tree point (veg with height > 4m, crown radius of 9 cells) shapefile
# Notes:        Raises error if input raster cell sizes differ

import arcpy, os
from arcpy import env
from arcpy.sa import *

# Check out any necessary licenses
arcpy.CheckOutExtension("spatial")

# Script arguments
dem1 = arcpy.GetParameterAsText(0) #input Raster Layer, First Return DEM
dem2 = arcpy.GetParameterAsText(1) #input Raster Layer, Last Return DEM
bare_earth = arcpy.GetParameterAsText(2) #input Raster Layer, Bare Earth DEM
outForest = arcpy.GetParameterAsText(3) #shapefile
outTree = arcpy.GetParameterAsText(4) #shapefile

# Make sure cell size of input rasters are same
arcpy.AddMessage("Checking cell sizes...")
dem1Xresult = arcpy.GetRasterProperties_management(dem1, "CELLSIZEX")
dem1Yresult = arcpy.GetRasterProperties_management(dem1, "CELLSIZEY")
dem2Xresult = arcpy.GetRasterProperties_management(dem2, "CELLSIZEX")
dem2Yresult = arcpy.GetRasterProperties_management(dem2, "CELLSIZEY")
beXresult = arcpy.GetRasterProperties_management(bare_earth, "CELLSIZEX")
beYresult = arcpy.GetRasterProperties_management(bare_earth, "CELLSIZEY")
dem1X = round(float(dem1Xresult.getOutput(0)),4)
dem1Y = round(float(dem1Yresult.getOutput(0)),4)
dem2X = round(float(dem2Xresult.getOutput(0)),4)
dem2Y = round(float(dem2Yresult.getOutput(0)),4)
beX = round(float(beXresult.getOutput(0)),4)
beY = round(float(beYresult.getOutput(0)),4)
if (dem1X == dem1Y == dem2X == dem2Y == beX == beY) == True:
    arcpy.AddMessage("Cell sizes match.")
else:
    arcpy.AddMessage("Input Raster Cell Sizes:")
    arcpy.AddMessage("DEM1: (" + str(dem1X) + "," + str(dem1Y) + ")")
    arcpy.AddMessage("DEM2: (" + str(dem2X) + "," + str(dem2Y) + ")")
    arcpy.AddMessage("  BE: (" + str(beX) + "," + str(beY) + ")")
    raise Exception("Cell sizes do not match.")

# Check map units
dem1_spatial_ref = arcpy.Describe(dem1).spatialReference
dem1_units = dem1_spatial_ref.linearUnitName
dem2_spatial_ref = arcpy.Describe(dem2).spatialReference
dem2_units = dem2_spatial_ref.linearUnitName
bare_earth_spatial_ref = arcpy.Describe(bare_earth).spatialReference
bare_earth_units = bare_earth_spatial_ref.linearUnitName
if (dem1_units == dem2_units == bare_earth_units) == True:
    if dem1_units == "Meter":
        area = "500 SquareMeters" #Area variable for meter
        unit = 1 #meter
    elif (dem1_units == "Foot_US") or (dem1_units == "Foot"):
        area = "5382 SquareFeet" #Area variable for feet
        unit = 3.28084 #feet in meter
    else:
        raise Exception("Units are not 'Meter', 'Foot_US', or 'Foot'.")
else:
    raise Exception("Linear units do not match.  Check spatial reference.")

# Local variables:
(workspace, filename) = os.path.split(outForest)
arcpy.env.workspace = workspace
arcpy.env.overwriteOutput = True
dem1 = Raster(dem1)
dem2 = Raster(dem2)
bare_earth = Raster(bare_earth)
nbr1 = NbrRectangle(3, 3, "CELL")
nbr2 = NbrRectangle(5, 5, "CELL")
nbr3 = NbrCircle(5, "CELL")

# Give units and multiplier
arcpy.AddMessage("Linear units are " + dem1_units + ". Using multiplier of " + str(unit) + "...")

arcpy.AddMessage("Processing DEMs...")
# Process: Raster Calculator (DEM1 - BE)
ndsm_dem1 = dem1 - bare_earth

# Process: Raster Calculator (DEM1 - DEM2)
d1_d2 = dem1 - dem2

# Process: Raster Calculator
threshold_d1d2 = (d1_d2 > (0.1 * unit))  &  (ndsm_dem1 >= (4.0 * unit))

# Process: Focal Statistics (max 3x3)
focal_max1 = FocalStatistics(threshold_d1d2, nbr1, "MAXIMUM", "DATA")

# Process: Focal Statistics (majority 5x5)
focal_majority = FocalStatistics(focal_max1, nbr2, "MAJORITY", "DATA")

# Process: Con
con_ndsm_dem1 = Con(ndsm_dem1 >= (4.0 * unit), focal_majority, focal_max1)
focal_majority = None
focal_max1 = None

# Process: Focal Statistics (min 3x3)
focal_min1 = FocalStatistics(con_ndsm_dem1, nbr1, "MINIMUM", "DATA")
con_ndsm_dem1 = None

# Process: Focal Statistics (min 3x3)
veg_mask = FocalStatistics(focal_min1, nbr1, "MINIMUM", "DATA")

# Process: Focal Statistics (max R5)
focal_max2 = FocalStatistics(ndsm_dem1, nbr3, "MAXIMUM", "DATA")

arcpy.AddMessage("Calculating tree points...")
# Process: Raster Calculator
tree_points = (veg_mask == 1) & (ndsm_dem1 == focal_max2) & (ndsm_dem1 >= (4.0 * unit))
ndsm_dem1 = None
focal_max2 = None

# Process: Raster Calculator
tree_pick = Pick(tree_points == 1, 1)
tree_points = None

# Process: Raster to Polygon
arcpy.RasterToPolygon_conversion(tree_pick, workspace + "\\tree_poly.shp", "SIMPLIFY", "Value")
tree_pick = None

# Process: Feature To Point
arcpy.AddMessage("Writing tree points...")
arcpy.env.workspace = workspace #reset workspace
arcpy.env.overwriteOutput = True #reset overwrite permission
arcpy.FeatureToPoint_management(workspace + "\\tree_poly.shp", outTree, "CENTROID")

arcpy.AddMessage("Calculating forest polygons...")
# Process: Focal Statistics (max 3x3)
forests = FocalStatistics(veg_mask, nbr1, "MAXIMUM", "DATA")
veg_mask = None

# Process: Raster Calculator
forest_pick = Pick(forests == 1, 1)

# Process: Raster to Polygon
arcpy.RasterToPolygon_conversion(forest_pick, workspace + "\\forest_poly.shp", "SIMPLIFY", "Value")

# Process: Eliminate Holes > 500 sq m (5382 sq ft)
arcpy.AddMessage("Writing forest polygons...")
arcpy.EliminatePolygonPart_management(workspace + "\\forest_poly.shp", outForest, "AREA", area, "0", "CONTAINED_ONLY")

# Clean up
arcpy.AddMessage("Cleaing up...")
arcpy.Delete_management(workspace + "\\tree_poly.shp")
arcpy.Delete_management(workspace + "\\forest_poly.shp")

2

コメントの長さの制限のため、これを回答として投稿しています。クレジットの希望はありません:)。DEMを提供する非常に幅広いブラシ。

  1. 個別のポリゴンのDEMを抽出してデムします。
  2. demの高度の極値を定義する
  3. zCur + =-zStepを設定します。事前に反復によって見つけられるステップ。たとえば、「ツリートップセル」の標高と隣接セルとの間の合理的なドロップ
  4. Below = Con(dem => zCur、int(1))
  5. 以下のグループ地域。十分に大きく数える、それが「木」です。ここで目視検査、予備調査で定義が必要ですか?
  6. zCur> zMinの場合は手順3に進み、それ以外の場合は手順1に進みます。

プロセス内のグループの最大数=個々のポリゴン内のツリーカウント。追加基準、たとえばポリゴン内の「ツリー」間の距離が役立つ場合があります...カーネルを使用したDEMスムージングもオプションです。


DEMではなくDSMを参照していると思います...通常、ツリー、構造、その他のジャンクはDEMにはなりませんが、DSMの機能(マイナスノイズクラス)になります。DSM-DEM = DHM(高さモデル)。これらのすべては、それが唯一の機密地上/ nongroundですが、DEMやないLASを持っている場合は、あなたが後にしている特長ので、あなたはパドルなしで小川アップしている場合でも、レーザー測量データから合理的に抽出することができませんそこに
マイケルスティムソン14

うん、あなたが説明したようにDHMが行います。私はLidarについてほとんど知らない。
FelixIP 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.