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) (implementation को सीधे call करना हो तो import deform3d; deform3d.register_nonrigid(src, dst, iters=20, lam=1.0, k_smooth=None), registry से लेना हो तो ops3d.get("register_nonrigid"))
• Ledger के ज़रिए return value: fullseye.ledger.register_nonrigid(...) केवल घोषित out type points का value लौटाता है (मूल function सहायक जानकारी भी लौटाता है)। जो हिस्सा छोड़ दिया गया है उसकी ज़रूरत हो तो fullseye.ledger.register_nonrigid.raw(...) का उपयोग करें, या deform3d.register_nonrigid को सीधे call करें।
• मूल function का return: (warped, info, info)
non-rigid ICP से src को dst की ओर लाता है।
हर iteration में "वर्तमान warped src" से dst तक nearest neighbour correspondence फिर से बनाए जाते हैं, उन correspondence को control-point correspondence (control centre = मूल src) मानकर TPS को regularisation के साथ फिर से fit किया जाता है, और src को warp किया जाता है। correspondence पहले से ज्ञात न हों तब भी smooth nonlinear deformation वापस पाया जा सकता है।
Implementation की मुख्य बातें (robustness):
• Scale invariance: λ को dst के centroid के आसपास RMS radius के सापेक्ष मान के रूप में लिया जाता है (अंदर λ_eff = λ·scale)। coordinate 100 गुना होने पर भी वही λ वही behaviour देता है।
• Divergence guard: correspondence अस्पष्ट हों तो साधारण NN iteration positive feedback से diverge हो सकता है। हर iteration का correspondence RMS देखा जाता है, और best iteration (न्यूनतम RMS) का warp और model लौटाया जाता है। इसलिए खराब λ पर भी "शुरुआत से खराब" परिणाम नहीं लौटता।
• λ जितना बड़ा, उतना rigid (deformation छोटा)। default λ=1.0 conservative (लगभग rigid) है, इसलिए बड़ा nonlinear deformation वापस पाना हो तो λ छोटा (जैसे 0.01 से 0.05) रखें।
Arguments:
src: (N,3) moving point cloud।
dst: (M,3) fixed (reference) point cloud।
iters: iteration की अधिकतम संख्या।
lam: TPS regularisation λ (scale के सापेक्ष)। बड़ा होने पर warp अधिक smooth (गलत correspondence के प्रति robust,
fit ढीला)। छोटा होने पर fit कसा हुआ (बारीक deformation वापस मिलता है)।
k_smooth: None हो तो 1 nearest neighbour target होता है (hard correspondence)। integer देने पर
dst की ओर k nearest neighbours का mean target बनता है और correspondence smooth होते हैं (noise के प्रति robust)।
Returns:
warped_src: (N,3) best iteration पर warped src।
model: संबंधित TPS model (control centre = मूल src, मूल coordinate system में सीधे
tps_warp को दिया जा सकता है)। एक भी (1) fit सफल न हो तो None।
info: dict। "rms" (best correspondence RMS), "rms_init" (शुरुआत = identity पर correspondence RMS),
"rms_history" (list), "iters" (वास्तव में चले iterations), "best_iter", "converged" (bool)।
Exceptions:
ValueError: गलत shape, बहुत कम points, गलत k_smooth।
• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।
• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।
• nonrigid_deform — py -3.11 examples_3d/nonrigid_deform.py
points को 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. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.