fullseye

生きている組織の 3D+t を古典手法だけで「短い 3D 動画像」にする — 使い方ガイド

この族は何をする道具箱か

動画生成 AI は「もっともらしい動き」を発明します。この族は内容を発明しない代わりに、実在する動きを見える形にする 4 つの道を numpy + scipy だけで用意します。どれも説明可能で、真値つきの合成系列(この族が自分で作る)で数値検証できます。

14 op / 5 カテゴリ(台帳は opslive4d.py、実体は live4d.py)。型は 1 語だけ足します: volseq = 体積の時系列 (T, Z, Y, X)。

回した動画は videocube の video_write_gif でそのまま GIF になります。

連鎖

flowchart LR
    S[volseq_synth_beating / dividing] --> M[volseq_magnify_motion]
    R[実測の z-stack 時系列 volseq] --> M
    R --> I[volseq_interpolate_flow]
    M --> O[volseq_render_orbit]
    I --> O
    R --> F[vol_flow_3d] --> P[volseq_pathline_render / orbit]
    R --> V[volseq_mip_video] --> C[video_spacetime_cube / motion_magnify]
    Fo[焦点掃引の時系列] --> H[focus_sweep_height_video] --> Sf[focus_sweep_surface_video]
    O --> G[video_write_gif]
    P --> G
    Sf --> G

最短の使い方

import fullseye as fs
L = fs.ledger

# 真値つきの合成: 半径が 0.1 voxel だけ拍動する殻(目には見えない)
shell = L.volseq_synth_beating((28, 40, 40), n_frames=24, period=8.0, amplitude=0.1, radius=8.4)

# 帯域 [0.06, 0.19] Hz(fps = 1 なら周期 8 の基本波を含み倍音を含まない)の動きを 8 倍に
big = L.volseq_magnify_motion(shell, alpha=8.0, f_lo=0.5 / 8, f_hi=1.5 / 8, fps=1.0, sigma=0.0)

# 時間を進めながら回して GIF に(1 周で 2 拍)
frames = L.volseq_render_orbit(big, n_frames=36, loops=2, size=256)
L.video_write_gif(frames, "beating.gif", fps=8.0)

# 分かれる塊の流れと軌跡
div = L.volseq_synth_dividing((28, 40, 40), n_frames=24, split_frame=8, speed=0.75)
d = L.vol_flow_3d(div[20], div[21])          # (3, Z, Y, X)、成分 dz, dy, dx [voxel]
img = L.volseq_pathline_render(div, n_seeds=400, size=256)   # 軌跡は時刻の色(青 = 始め → 赤 = 終わり)

# 粗い時系列を 2 倍に
smooth = L.volseq_interpolate_flow(div[::2], factor=2)

読み方と限界(正直に)

実データ

Cell Tracking Challenge の 3D+t(Fluo-N3DH-CHO は training で 98 MB、Fluo-N3DH-CE は線虫胚、Fluo-N3DL-DRO はショウジョウバエ胚のライトシート)を FULLSEYE_CTC_DIR に置けば、PoC examples/poc_live4d.py が同じ経路で通します。生データは commit しません。

関連