register_nonrigid — 3D deform op

• 資料種類:points × points → points

• 呼叫: import fullseye as fs; fs.ledger.register_nonrigid(src, dst, iters=20, lam=1.0, k_smooth=None)(要直接呼叫實作,import deform3d; deform3d.register_nonrigid(src, dst, iters=20, lam=1.0, k_smooth=None);從台帳取用則 ops3d.get("register_nonrigid"))

• 經台帳呼叫的回傳值: fullseye.ledger.register_nonrigid(...) 只回傳宣告的 out 型別 points 的值(底層函式還會回傳輔助資訊)。需要被捨棄的部分時,請用 fullseye.ledger.register_nonrigid.raw(...),或直接呼叫 deform3d.register_nonrigid。

• 底層回傳: (warped, info, info)

用法

用非剛體 ICP 把 src 靠向 dst。

每次迭代都從「目前變形後的 src」向 dst 重新建立最近鄰對應,把這些對應作為控制點對應(控制中心 = 原始 src),帶正則化地重新擬合 TPS,並對 src 進行變形。即使對應關係未知,也能恢復平滑的非線性變形。

實作要點(穩健性):

• 尺度不變: λ 視為相對於 dst 繞質心的 RMS 半徑的相對值(內部為 λ_eff = λ·scale)。即使座標放大 100 倍,同一個 λ 也給出相同的行為。

• 發散防護: 對應關係含糊時,單純的 NN 迭代可能因正回饋而發散。監看每次迭代的對應 RMS,回傳最佳迭代(RMS 最小)的變形與模型。因此即使 λ 選得不好,也不會回傳「比初始更差」的結果。

• λ 越大越剛性(變形越小)。預設 λ=1.0 偏保守(幾乎剛性),因此想恢復較大的非線性變形時,應把 λ 調小(例如 0.01~0.05)。

引數:

src: (N,3) 移動側點雲。

dst: (M,3) 固定側(參考)點雲。

iters: 最大迭代次數。

lam: TPS 正則化 λ(相對尺度)。越大變形越平滑(對錯誤對應穩健,

擬合較鬆)。越小貼合越緊(能恢復細小變形)。

k_smooth: 為 None 時以最近的 1 個點為目標(硬對應)。給定整數時,

以 dst 側 k 個近鄰的平均為目標,使對應平滑化(對雜訊穩健)。

回傳值:

warped_src: (N,3) 最佳迭代時變形後的 src。

model: 對應的 TPS 模型(控制中心 = 原始 src,可在原座標系中直接

傳給 tps_warp)。如果 1 次擬合都沒有成功則為 None。

info: dict。"rms"(最佳對應 RMS)、"rms_init"(初始=恆等時的對應 RMS)、

"rms_history"(list)、"iters"(實際迭代次數)、"best_iter"、"converged"(bool)。

例外:

ValueError: 形狀不正確、點數不足、k_smooth 不正確。

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。

• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。

可執行的範例(實際呼叫該運算子並已驗證的樣例)

• nonrigid_deform — py -3.11 examples_3d/nonrigid_deform.py

型別可銜接的下一個運算子(可接受 points 作為輸入)

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 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.