Main Content


Median filtering 3-D point cloud data

Since R2020b



ptCloudOut = pcmedian(ptCloudIn) performs median filtering of 3-D point cloud data. The function filters each channel of the point cloud individually. The output is a filtered point cloud. Each output location property value is the median of neighborhood around the corresponding input location property value. The pcmedian function doesn't pad zeros on the edges. Rather, it operates only on the available neighborhood values.

If the input point cloud is an organized point cloud, the pcmedian function uses N-by-N neighborhood method. If the point cloud is unorganized, the function uses radial neighborhood method.


ptCloudOut = pcmedian(___,Name,Value) specifies options using one or more name-value pair arguments. For example, 'FilterSize',3 sets the size of the median filter for organized point clouds to 3.


collapse all

Use the median filter to remove noise from a point cloud. First, add random noise to a point cloud. Then, use the pcmedian function to filter the noise.

Create a point cloud.

gv = 0:0.01:1;
[X,Y] = meshgrid(gv,gv);
Z = X.^2 + Y.^2;
ptCloud = pointCloud(cat(3,X,Y,Z));

Add random noise along the z-axis.

temp = ptCloud.Location;
count = numel(temp(:,:,3));
temp((2*count) + randperm(count,100)) = rand(1,100);
temp(count + randperm(count,100)) = rand(1,100);
temp(randperm(count,100)) = rand(1,100);
ptCloudA = pointCloud(temp);

Apply the median filter and display the three point clouds (original, noisy, and filtered).

ptCloudB = pcmedian(ptCloudA);

title('Original Data')
title('Noisy Data')
title('Filtered Data')

Load point cloud data into the workspace.

ptCloud = pcread('highwayScene.pcd');
roi = [0 20 0 20 -5 15];
indices = findPointsInROI(ptCloud,roi);
ptCloud = select(ptCloud,indices);
ptCloud = pcdownsample(ptCloud,'gridAverage',0.2);

Display the point cloud data. Each point is color-coded based on its x-coordinate.

title('Original Point Cloud')

Add noise along the z-channel in the interval (a,b). Values of a and b are chosen to make the noise appear close to the ground.

temp = ptCloud.Location;
count = numel(temp(:,3));
a = -2.5;
b = -2;
temp((2*count)+randperm(count,200)) = a+(b-a).*rand(1,200);
ptCloudA = pointCloud(temp);

Display the noisy point cloud. Each point is color-coded based on its x-coordinate.

title('Noisy Point Cloud')

Apply median filter on the point cloud.

ptCloudB = pcmedian(ptCloudA,'Dimensions',3,'Radius',1);

Display the filtered point cloud. Each point is color-coded based on its x-coordinate.

pcshow(ptCloudB.Location, ptCloudB.Location(:,1))
title('Filtered Point Cloud')

Input Arguments

collapse all

Point cloud, specified as a pointCloud object with at least one valid point. If the input point cloud is organized, the size of the point cloud must be at least 3-by-3-by-3.

Name-Value Arguments

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

Example: 'FilterSize',3 specifies a median filter size of 3.

Point cloud dimensions of interest, specified as a vector of integers in the range [1 3]. The values 1, 2, and 3 correspond to the x-, y-, and z-axis respectively. You must specify dimensions in ascending order.

Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Size of the median filter for an organized point cloud, specified as an odd integer in the range [3, N]. N is the smallest of channel dimensions in the point cloud.

Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Radius of the neighborhood for unorganized point cloud, specified as a positive scalar. The computation time increases when there are a lot of points inside the specified radius. So, large radius values for dense point clouds can cause high computation time and impact performance.

Data Types: single | double

Output Arguments

collapse all

Filtered point cloud, returned as a pointCloud object.

Extended Capabilities

C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.

Version History

Introduced in R2020b