Skip to content

change

occulus.change

Multi-epoch change detection for point clouds.

Available algorithms
  • :func:m3c2 — M3C2 signed distance with uncertainty (Lague et al. 2013)

All implementations use pure NumPy and SciPy. No optional dependencies required.

M3C2Result dataclass

Container for M3C2 change detection results.

Attributes:

Name Type Description
distances NDArray[float64]

Signed M3C2 distances for each core point. Shape (N,). Positive values indicate epoch2 surface is farther along the normal direction; NaN where computation was not possible.

uncertainties NDArray[float64]

Level of Detection (LoD) at the requested confidence level for each core point. Shape (N,). NaN where computation was not possible.

normals NDArray[float64]

Unit surface normals at core points. Shape (N, 3).

core_points NDArray[float64]

Coordinates of the core points used for comparison. Shape (N, 3).

significant_change NDArray[bool_]

Boolean mask of length N where True indicates the absolute distance exceeds the LoD (i.e., statistically significant change was detected).

Source code in src/occulus/change/m3c2.py
@dataclass
class M3C2Result:
    """Container for M3C2 change detection results.

    Attributes
    ----------
    distances : NDArray[np.float64]
        Signed M3C2 distances for each core point.  Shape ``(N,)``.
        Positive values indicate epoch2 surface is farther along the
        normal direction; ``NaN`` where computation was not possible.
    uncertainties : NDArray[np.float64]
        Level of Detection (LoD) at the requested confidence level for
        each core point.  Shape ``(N,)``.  ``NaN`` where computation
        was not possible.
    normals : NDArray[np.float64]
        Unit surface normals at core points.  Shape ``(N, 3)``.
    core_points : NDArray[np.float64]
        Coordinates of the core points used for comparison.  Shape ``(N, 3)``.
    significant_change : NDArray[np.bool_]
        Boolean mask of length ``N`` where ``True`` indicates the
        absolute distance exceeds the LoD (i.e., statistically
        significant change was detected).
    """

    distances: NDArray[np.float64]
    uncertainties: NDArray[np.float64]
    normals: NDArray[np.float64]
    core_points: NDArray[np.float64]
    significant_change: NDArray[np.bool_]