はじめに
この記事は、FOSS4G Advent Calendar 2024の19日目の記事です。
昨今、色々な自治体の3次元点群データがオープンデータとして公開され始めています。公開された3次元点群データで遊んでいると、RGBのカラー情報が含まれてないものもあり、オルソ画像を用いて着色できないかなと思ったので、試してみました。
この記事では、3次元点群データを変換・処理するライブラリであるPDALを用いて、着色を行っていきます。
使用するデータ
- 点群データ 「神奈川県 横浜北部、川崎3次元点群データ」
(カラー情報は含まれていないため、Intensityの情報をもとに可視化しています。)
- オルソ画像
上の点群データと一緒に公開されていたオルソ画像を使用しました。
着色方法
基本的には、PDALのExercisesページの通り行えば問題ありません。
1. パイプラインの定義
PDALでは、複雑な操作を行うときにJSON形式でパイプラインを定義し、実行できます。ここでは、着色処理を行うパイプラインを定義していきます。
実際に使用したパイプラインは以下の通りです。
{
"pipeline": [
"./data/point_cloud/09MD0512_epsg6677.las",
{
"type": "filters.colorization",
"raster": "./data/ortho/09MD0512_ortho_segment_building.tif"
},
{
"type": "writers.las",
"minor_version": "2",
"dataformat_id": "3",
"filename":"./data/point_cloud/09MD0512_epsg6677_segment_building.las"
}
]
}
パイプラインの解説
3行目:
"./data/point_cloud/09MD0512_epsg6677.las"
着色したい3次元点群データのパスを指定しています。
4行目~7行目:
{
"type": "filters.colorization",
"raster": "../data/ortho/09MD0512_ortho.tif"
},
この部分では、点群データへの着色を行う処理を記載しています。
tpye
: 実施する処理を指定するところです。今回は点群データの着色を行うためにfilters.colorization
を指定しています。
raster
: 着色処理に使用する画像のパスを指定するところです。
8行目~13行目:
{
"type": "writers.las",
"minor_version": "2",
"dataformat_id": "3",
"filename":"../data/point_cloud/09MD0512_epsg6677_color_test.las"
}
この部分では、着色した点群データを出力する処理を記載しています。
type
: 処理した点群データをLAS形式などにて出力するwriters.las
を指定しています。
minor_version
: LASのバージョンを指定するところです。今回は多くのソフトウェアで使用できる1.2にしました。
dataformat_id
: Point Data Format IDを指定するところです。今回は時間と色情報の両方をサポートしている3にしました。
filename
: 出力先のパスを指定するところです。
2. パイプラインの実行
先ほど定義したパイプラインをcolorize_pipeline.json
として保存しています。
以下のコマンドを実行することで、パイプラインで定義した処理を実行できます。
$ pdal pipeline ./colorize_pipeline.json
実行した結果、以下の画像のようになりました。オルソ画像の色を用いて3次元点群データが着色されていることが分かります。
応用編
ここまではオルソ画像を用いて着色していましたが、当然他の画像を用いて着色もできます。
オルソ画像をセグメンテーション(領域分割)した結果を用いて着色することで、簡易的に3次元点群データをセグメンテーションすることができるかなと思いました。
そこで、オルソ画像からGrounding DINOとSAM 2.1(Segment Anything Model 2.1)という2つのAIモデルを用いて、建物を抽出してみました。具体的には、segment-geospatialというライブラリを用いて行っています。このライブラリ自体の説明に関しては、公式ドキュメントやFOSS4G 2023 Japan@FUKUIで発表した資料、こちらの記事などをご覧ください。
text promptにeach building
と指定してセグメンテーションを行った結果、以下の画像のようになりました。
先ほど紹介した着色処理を行うと以下のようになり、建物部分が赤色に着色され簡易的ではありますが、3次元点群データに対してセグメンテーションを行ったようになります。
おわりに
PDALを用いた3次元点群データの着色方法について紹介しました。PDALを用いると、3次元点群データについて様々な処理が行えるなと改めて実感しました。まだまだ知らない処理があるので、これからも遊んでいきたいと思います。