Point clouds come in two flavors: some capture only the surface (LiDAR scans, photogrammetry), while others fill the entire volume (sampled from volumetric meshes, medical imaging). When you have a volumetric point cloud but only care about the surface, you need a way to extract just the outer shell.
This post describes a simple three-step technique that identifies surface points without requiring mesh reconstruction.
The Idea
The key insight is geometric: a point lies on the surface if there’s “empty space” on one side of it. Interior points have neighbors in all directions. Surface points have neighbors only on the interior side.
We can detect this asymmetry by estimating the local normal vector and checking whether points exist in the direction the normal points.
The figure above shows the idea in 2D. For a surface point, the normal vector points outward into empty space. For an interior point, neighbors exist on both sides.
The Algorithm
The method processes each point independently in three steps.
Step 1: Estimate Local Normal
Find all neighbors within radius $r$ and compute the normal vector via PCA. The eigenvector corresponding to the smallest eigenvalue of the covariance matrix gives the normal direction.

Step 2: Position Test Balls
Place a test ball of radius $r/2$ centered at distance $r/2$ along the normal direction.

Step 3: Check for Empty Space
If the test ball is empty, the point lies on the surface as there’s nothing but empty space in that direction.
Since PCA doesn’t determine normal orientation (it could point inward or outward), we check both directions. If the normal happens to point inward, the test ball on that side will contain points, but the opposite direction will be empty.

For interior points, test balls in both directions contain neighbors. This confirms the point is not on the surface.

Choosing the Radius
The radius $r$ controls the scale of analysis:
- Too small: Not enough neighbors for reliable normal estimation; noise dominates
- Too large: Surface details get blurred; thin structures may be missed
For dense point clouds, smaller radii work well. For sparser data, increase $r$ until the normal estimates stabilize. Visual validation on a subset helps find the right balance.
Why This Works
The technique exploits a fundamental property of surfaces: they separate interior from exterior. By probing the local geometry with a simple emptiness test, we can classify points without expensive mesh reconstruction or learned models.
This is particularly useful for:
- Reducing data size — Keep only the points that matter for surface analysis
- Preprocessing for meshing — Clean volumetric data before surface reconstruction
- Feature extraction — Focus geometric features on the actual surface
Read More
This post covers the intuition. For implementation details and code, see the full article on Medium:
A Simple Technique for Extracting Points on the Surface of 3D Models
The implementation is available in the point-cloud-central repository in the surface points extraction notebook.