Skip to content

Conversation

@TsofnatMaman
Copy link

@TsofnatMaman TsofnatMaman commented Jan 27, 2026

Type

Motivation and Context

Open3D currently lacks point cloud smoothing operations similar to those available in PCL.
This PR adds several point cloud smoothing algorithms, enabling denoising and improved
downstream processing such as surface reconstruction and registration.

Checklist:

  • I have run python util/check_style.py --apply to apply Open3D code style
    to my code.
  • This PR changes Open3D behavior or adds new functionality.
    • Both C++ (Doxygen) and Python (Sphinx / Google style) documentation is
      updated accordingly.
    • I have added or updated C++ and / or Python unit tests OR included test
      results
      (e.g. screenshots or numbers) here.
  • I will follow up and update the code if CI fails.
  • For fork PRs, I have selected Allow edits from maintainers.

Description

This PR introduces multiple point cloud smoothing methods to Open3D:

Added smoothing methods

  • PointCloud::SmoothMLS (Moving Least Squares)
  • PointCloud::SmoothLaplacian
  • PointCloud::SmoothTaubin
  • PointCloud::SmoothBilateral

Implementation details

  • MLS: Uses KDTree neighborhood search (radius/knn/hybrid) and PCA to compute a local tangent plane, then projects points onto the plane.
  • Laplacian: Iteratively updates points towards the centroid of k-nearest neighbors.
  • Taubin: Applies a lambda pass followed by a mu pass per iteration (feature-preserving smoothing).
  • Bilateral: Uses spatial and range weights; requires normals and estimates them if missing.

Tests

  • Added unit tests covering all smoothing methods.
  • All tests pass locally.
Screenshot 2026-01-27 211239

Usage examples (Python)

import open3d as o3d

pcd = o3d.io.read_point_cloud("cloud.ply")

# MLS smoothing
smoothed_mls = pcd.smooth_mls(o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))

# Laplacian smoothing
smoothed_lap = pcd.smooth_laplacian(iterations=5, lambda=0.5, knn=30)

# Taubin smoothing
smoothed_taubin = pcd.smooth_taubin(iterations=5, lambda=0.5, mu=-0.53, knn=30)

# Bilateral smoothing
smoothed_bilateral = pcd.smooth_bilateral(
    o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30),
    sigma_s=0.1,
    sigma_r=0.05,
)
o3d.io.write_point_cloud("cloud_smoothed.ply", smoothed_mls)
Screenshot 2026-01-25 004113 Screenshot 2026-01-25 003843 Screenshot 2026-01-21 170849 Screenshot 2026-01-21 170709

@update-docs
Copy link

update-docs bot commented Jan 27, 2026

Thanks for submitting this pull request! The maintainers of this repository would appreciate if you could update the CHANGELOG.md based on your changes.

@TsofnatMaman TsofnatMaman force-pushed the feature/pointcloud-smoothing branch from 059e7bb to ba4158d Compare January 27, 2026 21:33
- Removed unused variables in SmoothBilateral method
- Fixes Codacy issue: 'Unused code' warning
- All tests pass (23/23)
- Added cppcheck-suppress missingIncludeSystem for <Eigen/Eigenvalues>
- Added cppcheck-suppress missingIncludeSystem for <random>
- These are valid system headers, Cppcheck false positive
- All 23 tests pass
- Added clarification for helper functions purpose
- Triggers Codacy re-analysis with all previous fixes
- Added entry under [Main] section describing new smoothing methods
- Lists MLS, Laplacian, Taubin, and bilateral smoothing algorithms
- Follows Open3D changelog conventions with user-facing language
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Possible to add point cloud smoothing, like the one in PCL?

1 participant