Voxel downsampling

코드를 살펴보기 전 down-sampling과 up-sampling 에 대한 정의를 알아보자

[데이터 전처리/Data Science] 업샘플링(upsampling)과 다운샘플링(downsampling)

Voxel downsampling은 포인트 클라우드를 일정 크기의 3D 격자(복셀)로 묶어 대표점만 남겨, 연산량을 줄이면서 노이즈를 완화하는 기법입니다.

voxel_size가 작을수록 디테일 유지, 클수록 속도·메모리 이점을 가지게 됩니다.

직접 코드로 구현해 보겠습니다.

import open3d as o3d

print("Load a ply point cloud")
ply_point_cloud = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)

print("downsample the point cloud with a voxel of 0.05")
### 바꿀부분 ###
downpcd = pcd.voxel_down_sample(voxel_size=0.05) 
###
o3d.visualization.draw_geometries(
    [downpcd],
    zoom=0.3412,
    front=[0.4257, -0.2125, -0.8795],
    lookat=[2.6172, 2.0475, 1.532],
    up=[-0.0694, -0.9768, 0.2024]
	)

image.png

여기서 voxel_size 매개변수 값을 0.05보다 작은 값인 0.01로 설정하였더니 형체를 더욱 뚜렷하게 알아볼 수 있게 되었습니다.

voxel_size를 작게 할 경우 더 높은 해상도를 유지하여 세밀한 디테일이 보존되지만, 많은 포인트 클라우드들이 유지되는 것이다 보니 처리시간과 메모리 사용량이 증가할 수 있습니다.

	downpcd = pcd.voxel_down_sample(voxel_size=0.01)

image.png

반대로 voxel_size를 0.05보다 더 높은 1로 설정할 경우는 아래와 같습니다.

디테일이 거의 없어졌다고 볼 수 있는데, 포인트 클라우드를 간략화하여 전체적인 형상만 유지하고 작은 디테일은 사라지게 됩니다.

이 경우에는 남아있는 포인트 클라우드가 거의 없다 보니 세부 정보가 손실되지만, 메모리 사용량과 처리 시간은 줄어드는 특징을 가집니다.

downpcd = pcd.voxel_down_sample(voxel_size=1)