scene_flow_lk — 3D motion op

• Datenarten: voxel × voxel → flow_dense

• Aufruf: import fullseye as fs; fs.ledger.scene_flow_lk(vol0, vol1, device='cpu', win=3, levels=3, iters=3, reg=0.001) (die Implementierung direkt: import match3d; match3d.scene_flow_lk(vol0, vol1, device='cpu', win=3, levels=3, iters=3, reg=0.001); aus dem Register: ops3d.get("scene_flow_lk"))

• GPU: Dieser Operator hat einen GPU-Pfad (device="cuda")

Verwendung

Lucas-Kanade-Szenenfluss (die 3-D-Version des 2-D-optischen Flusses). Ein Bewegungsfeld d = (dz, dy, dx) je Voxel.

Anders als Template-Matching schätzt dies dichte Bewegung/Deformation. Die Helligkeitskonstanz ∇I·d + I_t = 0 wird per kleinsten Quadraten im Fenster pro Voxel gelöst (3x3-Strukturtensor A=Σ∇I∇Iᵀ, b=-Σ∇I·I_t über Fenstersummen mit conv3d). Coarse-to-fine mit pyramid + warp bewältigt große Verschiebungen (auf jedem Level wird I1 mit dem aktuellen flow zurückgewarpt und das Residuum iterativ korrigiert = Gauss-Newton). vol1(x) ≈ vol0(x - d). Rückgabewert flow (3,D,H,W). Erfasst Translations-, Expansions- (Divergenz) und Rotationsfelder (Wirbel).

Gemessen: eine gleichförmige Translation [1.5,-2,1] hat gemittelt über den zentralen Bereich einen Fehler von 0.044 voxel; im Expansionsfeld wird die nach außen gerichtete Divergenz korrekt erkannt. grad_scale=32 ist die gemessene Skala von sobel3d (deriv[-1,0,1]×smooth[1,2,1]²). GPU-fähig (alles conv3d).

Argumente: vol0, vol1 sind 3-D-Arrays gleicher Form (sonst ValueError; NaN/Inf oder float32-Überlauf ergeben ebenfalls ValueError). win ist die halbe Fensterbreite (Seitenlänge des Fensters 2·win+1), levels die Anzahl der Pyramidenstufen (jede Stufe wird mit avg_pool3d um den Faktor 2 verkleinert; bei größeren Verschiebungen mehr Stufen), iters die warp-Iterationen pro Stufe, reg die Regularisierung auf der Diagonale des Strukturtensors (vermeidet Division durch 0 in ebenen Bereichen; je größer, desto mehr wird der flow in ebenen Bereichen gegen 0 gezogen). Das Update von 1 Iteration wird pro Achse auf ±2 voxel begrenzt (clamp). Rückgabewert (3, D, H, W) float32 numpy, flow[0]=dz, flow[1]=dy, flow[2]=dx (in Voxeln). vol1(x) ≈ vol0(x − d), d. h. die Struktur von vol0 bewegt sich um +d und wird zu vol1. Ränder werden per border-Interpolation gefüllt, daher den Werten in 1-2 voxel Randabstand nicht trauen. Wer R,t einer Starrkörperbewegung braucht, wandelt in Punktwolken um und nutzt icp_point2point_3d / fit_rigid.

Referenzen (Beispieldaten, Literatur)

• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).

• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• motion_scene — py -3.11 examples_3d/motion_scene.py

Typkompatible Folge-Operatoren (nehmen flow_dense als Eingabe)

fuse_to_voxel

Gleiche Kategorie (motion)

—


*Provenance: match3d.py — 3D Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*

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