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

【Python点群処理】3次元点群の正規化

正規化

3次元点群データの正規化をしてみます。

ディープラーニングを用いた推論や前処理時に使用します。

今回は、データの平均値からの偏差をデータ範囲(=最大値-最小値)で割ることで、データの最小値を-1、最大値を1に変換します。

def Normalize(pointcloud):
  norm_pointcloud = pointcloud - np.mean(pointcloud, axis=0) 
  norm_pointcloud /= np.max(np.linalg.norm(norm_pointcloud, axis=1))
  return  norm_pointcloud

半径2の球を正規化してみます。

import open3d as o3d
import get_ball 


#半径2の点群作成
num_points=1000
r=2
test_data=get_ball(num_points,r)


# numpy open3d に変換 
pcd=o3d.geometry.PointCloud()
pcd.points = o3d. utility.Vector3dVector(test_data)
# 色の設定
color = np.zeros([len(test_data),3])
color[:,2]=1
pcd.colors = o3d.utility.Vector3dVector(color[:, :3])

# 正規化する点群をnumpy open3d に変換 
pcd_normal=o3d.geometry.PointCloud()

# Normalize(test_data)で正規化
pcd_normal.points = o3d. utility.Vector3dVector(Normalize(test_data))
# 色の設定
color_normal = np.zeros([len(test_data),3])
color_normal [:,0]=1
pcd_normal.color_normal = o3d.utility.Vector3dVector(color_normal [:, :3])


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

青色の点群が正規化前、赤色の点群が正規化後の点群です。

正規化された点群は最大1、最小-1の範囲になっていることが分かります。

テストデータ(青)と正規化された点群(赤)
正規化された点群

おすすめ参考書