scene_flow_lk — 3D motion op

• 資料種類:voxel × voxel → flow_dense

• 呼叫: import fullseye as fs; fs.ledger.scene_flow_lk(vol0, vol1, device='cpu', win=3, levels=3, iters=3, reg=0.001)(要直接呼叫實作,import match3d; match3d.scene_flow_lk(vol0, vol1, device='cpu', win=3, levels=3, iters=3, reg=0.001);從台帳取用則 ops3d.get("scene_flow_lk"))

• GPU:該運算子有 GPU 路徑(device="cuda")

用法

Lucas-Kanade scene flow(2D 光流的 3D 版)。逐體素的運動場 d=(dz,dy,dx)。

與樣板比對不同,估計 密集運動/形變。將亮度恆定 ∇I·d + I_t = 0 以視窗內最小平方逐 voxel 求解(3x3 結構張量 A=Σ∇I∇Iᵀ, b=-Σ∇I·I_t 以視窗和 conv3d 計算)。透過 pyramid + warp 的 coarse-to-fine 因應大位移(在各 level 以目前 flow 將 I1 拉回,迭代修正殘差=Gauss-Newton)。vol1(x) ≈ vol0(x - d)。回傳值 flow (3,D,H,W)。捕捉平移、擴張(散度)、旋轉(渦)場。

實測:均勻平移 [1.5,-2,1] 在中央區域平均的誤差為 0.044 voxel,在擴張場中正確偵測出向外散度。grad_scale=32 是 sobel3d(deriv[-1,0,1]×smooth[1,2,1]²)的實測尺度。支援 GPU(全部 conv3d)。

參數: vol0, vol1 為同形的 3-D(不同則 ValueError。NaN/Inf 或 float32 溢位也 ValueError)。win 為視窗半寬(視窗邊長 2·win+1),levels 為金字塔層數(各層以 avg_pool3d 縮小 2 倍。位移越大層數越多),iters 為各層的 warp 迭代,reg 為加在結構張量對角上的正則化(避免平坦部除以 0。越大平坦部的 flow 越趨近 0)。1 次迭代的更新在各軸上被 clamp 到 ±2 voxel。回傳值 (3, D, H, W) float32 numpy,flow[0]=dz, flow[1]=dy, flow[2]=dx (voxel 單位)。vol1(x) ≈ vol0(x − d),即 vol0 的結構移動 +d 成為 vol1。邊緣由 border 內插填補,因此邊緣 1〜2 voxel 的值不可信。若需要剛體運動的 R,t, 請轉為點雲後交給 icp_point2point_3d / fit_rigid。

參考(範例資料、文獻)

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

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

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

• motion_scene — py -3.11 examples_3d/motion_scene.py

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

fuse_to_voxel

同類別(motion)

—


*Provenance: match3d.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

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