deform op• Data kinds: points × points → points
• Call: import fullseye as fs; fs.ledger.register_nonrigid(src, dst, iters=20, lam=1.0, k_smooth=None) (to call the implementation directly, import deform3d; deform3d.register_nonrigid(src, dst, iters=20, lam=1.0, k_smooth=None); from the registry, ops3d.get("register_nonrigid"))
• Return value through the ledger: fullseye.ledger.register_nonrigid(...) returns only the declared out type points (the underlying function also returns auxiliary values). When you need what was dropped, use fullseye.ledger.register_nonrigid.raw(...) or call deform3d.register_nonrigid directly.
• Underlying return: (warped, info, info)
Bring src toward dst with non-rigid ICP.
At each iteration, re-establish nearest-neighbour correspondences from "the current warped src" to dst, use them as control-point correspondences (control centres = the original src) to refit a regularised TPS, and warp src. A smooth nonlinear deformation can be recovered even when correspondences are not known.
Implementation notes (robustness):
• Scale invariance: λ is treated as relative to the RMS radius of dst about its centroid (internally λ_eff = λ·scale). Even with coordinates 100 times larger, the same λ gives the same behaviour.
• Divergence guard: with ambiguous correspondences, plain NN iteration can diverge through positive feedback. The correspondence RMS is monitored per iteration, and the warp and model of the best iteration (minimum RMS) are returned. So even with a bad λ, no result "worse than the initial state" is returned.
• The larger λ, the more rigid (the smaller the deformation). The default λ=1.0 is conservative (almost rigid), so to recover large nonlinear deformations, make λ small (e.g. 0.01 to 0.05).
Args:
src: (N,3) moving point cloud.
dst: (M,3) fixed (reference) point cloud.
iters: maximum number of iterations.
lam: TPS regularisation λ (scale-relative). Larger makes the warp smoother (robust to outlier correspondences,
looser fit). Smaller fits more tightly (recovers fine deformation).
k_smooth: if None, the 1 nearest neighbour is the target (hard correspondence). Given an integer, the mean of
the k nearest neighbours on the dst side is the target, smoothing the correspondences (robust to noise).
Returns:
warped_src: (N,3) warped src at the best iteration.
model: the corresponding TPS model (control centres = original src; can be passed as-is to
tps_warp in the original coordinate system). None if not even 1 fit succeeded.
info: dict. "rms" (best correspondence RMS), "rms_init" (correspondence RMS at the start = identity),
"rms_history" (list), "iters" (iterations actually run), "best_iter", "converged" (bool).
Raises:
ValueError: invalid shape, too few points, invalid k_smooth.
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• nonrigid_deform — py -3.11 examples_3d/nonrigid_deform.py
points as input)points_to_voxel · gaussians_to_voxel · estimate_point_normals · to_points · match_points_ncc · match_pca · moment_axes · icp_point2point_3d
deform)tps_fit · tps_warp · register_cpd_rigid
*Provenance: deform3d.py — 3D operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.