Main Content

pc2dem

点群データの数値標高モデル (DEM) の作成

R2021b 以降

説明

elevModel = pc2dem(ptCloudIn) は、入力点群の数値標高モデル (DEM) elevModel を作成して返します。出力行列には、入力点群の一般化された標高情報が含まれます。詳細については、アルゴリズムを参照してください。

elevModel = pc2dem(ptCloudIn,gridResolution) は、グリッド要素の次元を追加で指定します。

[elevModel,xlimits,ylimits] = pc2dem(___) は、前述した構文の任意の入力引数を組み合わせて使用して、DEM の x および y の範囲を追加で返します。

[___] = pc2dem(___,Name,Value) は、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、'CornerFillMethod','min' は、関数が DEM 内のグリッド コーナーの一般化された標高値を、各グリッド コーナーの既定の探索半径内の最小標高として計算するように指定します。

すべて折りたたむ

aerialLidarData.laz ファイルに格納されている点群データを読み取るlasFileReaderオブジェクトを作成します。

fileName = fullfile(toolboxdir("lidar"),"lidardata","las", ...
            "aerialLidarData.laz");
lasReader = lasFileReader(fileName);

関数readPointCloudを使用して、ファイルから点群データを読み取ります。

ptCloud = readPointCloud(lasReader);

点群データを可視化します。

figure
pcshow(ptCloud.Location)
title("Point Cloud")

Figure contains an axes object. The axes object with title Point Cloud contains an object of type scatter.

点群データから地面の点をセグメント化します。

groundPtsIdx = segmentGroundSMRF(ptCloud);

地面の点を抽出します。

ptCloudWithGround = select(ptCloud,groundPtsIdx);

地面の点を可視化します。

figure
pcshow(ptCloudWithGround.Location)
title("Ground Points")

Figure contains an axes object. The axes object with title Ground Points contains an object of type scatter.

セグメント化された地面の点から数値地形モデル (DTM) を作成します。

terrainModel = pc2dem(ptCloudWithGround);

DTM を可視化します。

figure
imagesc(terrainModel)
colormap(gray)
title("Digital Terrain Model")

Figure contains an axes object. The axes object with title Digital Terrain Model contains an object of type image.

"aerialLidarData.laz" ファイルから航空点群データを読み取るlasFileReaderオブジェクトを作成します。

fileName = fullfile(toolboxdir("lidar"),"lidardata","las", ...
          "aerialLidarData.laz");
lasReader = lasFileReader(fileName);

関数readPointCloudを使用して、LiDAR センサーの最初に返される点群データを LAS ファイルから読み取ります。

ptCloud = readPointCloud(lasReader,"LaserReturn",1);

グリッド要素分解能を 1.1 メートルとして、点群の数値表面モデル (DSM) を作成します。

gridRes = 1.1;
surfaceModel = pc2dem(ptCloud,gridRes,"CornerFillMethod","max");

照明光源の位置を定義します。

azimuthAng = 135;
zenithAng = 45;

関数imgradientxyを使用して DSM の方向勾配を計算します。

[gx,gy] = imgradientxy(surfaceModel,"sobel");

グリッド要素分解能を使用して勾配を正規化します。

gx = gx/(8*gridRes);
gy = gy/(8*gridRes);

DSM の傾きとアスペクトを計算します。

slopeAngle = atand(sqrt(gx.^2 + gy.^2));
aspectAngle = atan2d(gy,-gx);
aspectAngle(aspectAngle < 0) = aspectAngle(aspectAngle < 0) + 360;

Esri® のアルゴリズムを使用して陰影起伏を計算します。陰影起伏は、イメージをシェーディングするときの照明光源の位置を考慮に入れて、表面を 3 次元のグレースケールで表現したものです。

h = 255.0*((cosd(zenithAng).*cosd(slopeAngle)) ...
    + (sind(zenithAng).*sind(slopeAngle).*cosd(azimuthAng - aspectAngle)));
h(h < 0) = 0;

DSM の陰影起伏を可視化します。

figure
imagesc(h)
colormap(gray)

Figure contains an axes object. The axes object contains an object of type image.

入力引数

すべて折りたたむ

入力点群。pointCloud オブジェクトとして指定します。

xy 軸に沿ったグリッド要素の分解能。[x y] 形式の 2 要素ベクトル、または正方形要素のスカラーとして指定します。この引数の値は正の実数でなければなりません。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前は、名前と値をそれぞれコンマを使って区切り、Name引用符で囲みます。

例: 'CornerFillMethod','min' は、DEM 内の各グリッド コーナーの一般化された標高値を計算するメソッドのタイプを選択します。

グリッド コーナーの一般化された標高値計算のメソッド。文字ベクトルまたは string スカラーとして指定します。サポートされているメソッドのリストと、それらの指定方法は次のとおりです。

  • 'min' — 探索半径内のすべての点の最小標高

  • 'max' — 探索半径内のすべての点の最大標高

  • 'mean' — 探索半径内のすべての点の平均標高

  • 'idw' — 探索半径内のすべての点の逆距離加重 (IDW) 平均標高

データ型: char | string

各グリッド コーナー周辺の探索領域の半径。正のスカラーとして指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

塗りつぶされていないグリッド コーナーを塗りつぶす IDW 内挿のフィルター サイズ。正の奇数の整数として指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

出力引数

すべて折りたたむ

数値標高モデル。MN 列の実数値の行列として返されます。MN の値は、xy 軸に沿った点群の範囲と gridResolution に基づいて計算されます。

標高モデルの x 軸の範囲。2 要素の実数値ベクトルとして返されます。

標高モデルの y 軸の範囲。2 要素の実数値ベクトルとして返されます。

アルゴリズム

関数は、ローカルのビン化アルゴリズムを使用して点群データの数値標高モデル (DEM) を作成します。アルゴリズムでは、点の標高が z 軸に沿っていると仮定します。

ローカルのビン化アルゴリズム:

  • 点群を xy- 次元 (鳥瞰ビュー) に沿ってグリッドに分割します。gridResolution 引数を使用してグリッドの次元を指定します。

  • 各グリッド コーナー周辺の円形領域内にあるすべての点の標高情報を利用して、一般化されたグリッドの値を計算します。'SearchRadius' および 'CornerFillMethod' の名前と値の引数をそれぞれ使用して、探索半径と計算法を指定できます。

  • 円形領域内に点がない場合、アルゴリズムは値を計算せず、それらのグリッド コーナーは塗りつぶされないままとなります。関数では、それらを NaN として表現します。アルゴリズムは、逆距離加重 (IDW) 内挿を使用して、塗りつぶされていないグリッド コーナーを塗りつぶします。IDW 内挿法のフィルター サイズを指定するには、'FilterSize' の名前と値の引数を使用します。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。

バージョン履歴

R2021b で導入

すべて展開する