Segment point cloud into clusters based on Euclidean distance


labels = pcsegdist(ptCloud,minDistance) segments a point cloud into clusters, with a minimum Euclidean distance of minDistance between points from different clusters. pcsegdist assigns an integer cluster label to each point in the point cloud, and returns the labels of all points.


[labels,numClusters] = pcsegdist(ptCloud,minDistance) also returns the number of clusters.


collapse all

Create two concentric spheres and combine them into a point cloud.

[X,Y,Z] = sphere(100);
loc1 = [X(:),Y(:),Z(:)];
loc2 = 2*loc1;
ptCloud = pointCloud([loc1;loc2]);
title('Point Cloud')

Set the minimum Euclidean distance between clusters.

minDistance = 0.5;

Segment the point cloud.

[labels,numClusters] = pcsegdist(ptCloud,minDistance);

Plot the labeled results. The points are grouped into two clusters.

title('Point Cloud Clusters')

Load an organized lidar point cloud named ptCloud.

title('Unclustered Point Cloud')

Detect the ground plane and store the points in inliers. Distance is measured in meters.

maxDistance = 0.3;
referenceVector = [0,0,1];
[~,inliers,outliers] = pcfitplane(ptCloud,maxDistance,referenceVector);

Cluster the points, ignoring the ground plane points. Specify a minimum Euclidean distance of 0.5 meters between clusters.

ptCloudWithoutGround = select(ptCloud,outliers,'OutputSize','full');
distThreshold = 0.5;
[labels,numClusters] = pcsegdist(ptCloudWithoutGround,distThreshold);

Add an additional label for the ground plane.

numClusters = numClusters+1;
labels(inliers) = numClusters;

Plot the labeled results. Display the ground plane in black.

labelColorIndex = labels+1;
colormap([hsv(numClusters);[0 0 0]])
title('Point Cloud Clusters')

Input Arguments

collapse all

Point cloud, specified as a pointCloud object.

Minimum Euclidean distance between points from two different clusters, specified as a positive scalar.

Data Types: single | double

Output Arguments

collapse all

Cluster labels, returned as one of the following.

  • If the point cloud, ptCloud, stores point locations as an unorganized M-by-3 matrix, then labels is an M-by-1 vector.

  • If the point cloud, ptCloud, stores point locations as an organized M-by-N-by-3 array, then labels is an M-by-N matrix.

Each point in the point cloud has a cluster label, specified by the corresponding element in labels. The value of each label is an integer from 0 to the number of clusters of valid points, numClusters. The value 0 is reserved for invalid points, such as points with Inf or NaN coordinates.

Number of clusters, returned as a positive integer. The number of clusters does not include the cluster corresponding to invalid points.

Extended Capabilities

Introduced in R2018a