※当サイトはPRを含みます

【3D点群処理】Pythonで点群を3次元プロットして可視化する方法4選

2023年8月30日

はじめに

Pythonで3次元点群を表示する方法をいくつか紹介します。

今回使用するデータは、1000点からなる球の形をした点群です。
numpy配列でサイズ (1000,3) の test_dataを使って可視化していきます。

import numpy as np 
import random
def get_ball(num_points,r):
    point_cloud = []
    for i in range(num_points):
        t = random.random()
        t = np.arcsin(1-2*t)
        u= random.random() * 2 *np.pi-np.pi
        x = np.cos(t)*np.cos(u)*r
        y = np.cos(t)*np.sin(u)*r
        z= np.sin(t)*r
        point_cloud.append([x, y, z])
    return np.array(point_cloud)
#点群作成
num_points=1000
r=0.5
test_data=get_ball(num_points,r)

matplotlib

matplotlibの3次元散布図プロットを使用します。

matplotlib はすでにインストールしている方も多いと思うので、既存のライブラリでサクッと3次元点群を表示したい方におすすめ。

インストールしていない方は下記を実行してインストールしてください。

pip install matplotlib

コード

import matplotlib.pyplot as plt
 
#点群作成
num_points=1000
r=0.5
test_data=get_ball(num_points,r)

# matplotlibで可視化
fig = plt.figure(figsize = (8, 8))
ax= fig.add_subplot(111, projection='3d')
ax.scatter(test_data[:,0],test_data[:,1],test_data[:,2], s = 1, c = "blue")
plt.show()

plotly

plotlyはJupyter notebookで実行するとインタラクティブに可視化することができます。
カーソル位置の座標を表示してくれたり、グラフィックがきれいで見やすいです。
基本的にサクサク動きますが、 大きいサイズ(10万点規模)の点群を表示しようとすると表示までに若干時間がかかります。

インストールしていない方は下記を実行してインストールしてください。

pip install plotly

ploty: https://plotly.com/python/line-and-scatter

コード

import plotly.express as px

#点群作成
num_points=1000
r=0.5
test_data=get_ball(num_points,r)

# plotlyで可視化
fig=px.scatter_3d( x=test_data[:,0],y=test_data[:,1], z=test_data[:,2])
fig.update_traces (marker={ 'size': 1})
fig.show()

Open3D

Open3Dを使って点群を表示します。Open3Dでは、numpy配列をOpen3Dのデータ構造に変換してから可視化します。
マウス操作で拡大や縮小、キーボード操作で色やマーカーのサイズを変えることもできます。
'h’キーを押すとヘルプが出てきます。

Open3dのドキュメント: http://www.open3d.org/docs/release/tutorial/geometry/file_io.html#Point-cloud

インストールしていない方は下記を実行してインストールしてくだい。

pip install open3d

コード

import open3d as o3d

#点群作成
num_points=1000
r=0.5
test_data=get_ball(num_points,r)

#numpy open3d に変換 
pcd=o3d.geometry.PointCloud()
pcd.points = o3d. utility.Vector3dVector(test_data)

# Open3dで可視化
o3d.visualization.draw_geometries([pcd])

GoogleColabやJupyter noteookで可視化したい人は以下のように可視化。
Open3Dでplotlyの点群表示機能が使えるようになっています。

o3d.visualization.draw_plotly([pcd])

K3D

K3Dを使って点群を表示します。

K3DはJupyter notebook を拡張した3Dデータ可視化ライブラリです。

Jupyter notebookを使って大きいサイズの点群を解析する人におすすめです。

K3Dのドキュメント: https://k3d-jupyter.org

インストールしていない方は下記を実行してインストールしてください。

pip install k3d

コード

import k3d
#k3dで可視化
plot=k3d.plot(camera_auto_fit=True)
point_size=0.01
plot+=k3d.points(test_data[:,:3],point_size=point_size,shader="3d",color=0x0000ff)
plot.display()

おすすめ参考書