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.