Risto Ojala

Captain’s log

01 Oct 2023

Basic point cloud filtering with Open3D

In my previous post, I created some point clouds with OpenSfM. Some of them ended up featuring quite a bit of noise, to which I commented that basic filtering operations should take care of most of the noise. So, to test this hypothesis, I whipped out Open3D and tried to denoise the most noisy point cloud: the one with the excavator. I pretty much utilised the examples provided in Open3D documentation. As always, code is provided in my Github.

Filtering methods and results

/ The point cloud I started with is shown below, with quite a lot of points all over the place.

“Original point cloud”

Since I was mostly focusing on analysing the excavator, I started by cropping the point cloud with a bounding box. This way the excavator details were much better visible in the visualisation.

“Point cloud after crop”

Next, I applied a voxel grid filter to downsample the point cloud. This effectively removes duplicate points, by allowing only a single point to exist within a voxel. The visual change is not drastic, but the point cloud size was reduced from 1.6 million points to 0.8 million points. So, the resulting point cloud was cleaner and the size was reduced by half!

“Point cloud after voxel grid filter”

As the final step, which was the actual filtering part, I applied the radius outlier removal (ROR) method. ROR removes points based on their vicinity to their neighbors. If a point is “far” from other points, it is filtered away. Definition of “far” is given as a parameter to the algorithm.

“Point cloud after radius outlier removal”

Looking at the final result, we can see that the excavator is quite a bit clearer in the point cloud. ROR did quite a good job of filtering away the noise from above the excavator. This was expected, since ROR is exactly designed for this, removing outlier points with no close neighbors. Some more dense areas of noise around the excavator were not removed. This is a natural consequence of the parameter selection of ROR. If more strict parameters were given to the algorithm, parts of the excavator would have also been filtered away.

Overall, the result was not as good as I would have expected. The point cloud remained quite noisy even after filtering, so more advanced methods would be needed for a proper result. However, the point cloud may appear more noisy due to the fact that some parts on the ground were clearly falsely registered by OpenSfM to the point cloud. Since these areas are dense entities, they cannot be expected to be removed by basic filtering operations.