fullseye

入口 op(img_to_*、category=bridge) — 使い方ガイド

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

fullseye の 2-D レジストリには、画像以外の「種」を受ける op が 161 本ある —— 点群 (points)、1-D 信号(signal)、動画(video)、体積(volume)、4-D ライトフィールド (lightfield)、複素場(cimage)、光子カウント列(counts)、FMCW レーダーのビート立方体 (beatcube)、行列(matrix)、像面上の点(keypoints)、四元数画像(qimage)、RGB 画像 (rgbimage)。ところが 2026-09-06 までは 画像からそれらの種を作る登録 op が無かった。 Studio の「1 枚の画像 + つまみ 2 つ」のプログラムからは一度も呼べず、op ノートには 「図なし: 型が届かない」としか書けなかった。

img_to_* はその入口。画像を、各 sort の意味のある値として読み替える:

op 画像をどう読むか 出力
img_to_points 高さ場(一辺 10 の箱、z = 値 × 10 × s) (N,3) の (x, y, z)
img_to_keypoints 局所極大 (N,2) の (u, v) = (列, 行)
img_to_signal 1 行 / 1 列の濃度プロファイル 1-D
img_to_counts プロファイルを光子の期待値と見て Poisson 標本 1-D int64
img_to_matrix そのまま H×W 行列(純粋なキャスト) (H,W)
img_to_video 一定速度でパンする T フレーム (T,H,W)
img_to_volume 高さ場を押し出した固体 (D,H,W)(z 先頭)
img_to_lightfield 前景/背景 2 層に視差 (V,U,H,W)
img_to_rgb 色相・彩度を与える(明部 0.75 超は白の鏡面に戻す二色性モデル) (H,W,3)
img_to_cimage 振幅 = 値、位相 = 値に比例 + 傾き (H,W) complex
img_to_beatcube 明点を標的(距離 = 列、速度 = 行) (A,C,S) complex
img_to_monogenic 単一スケールのモノジェニック信号 (H,W,4)

進化には見えないのがこの族の要点。ops._candidates は category bridge を候補から 除く —— 入れると image の候補リストが伸び、既存のゲノムが別の op に写ってしまう (docs/WAVE0_STABLE_SLOTS.md)。名前で呼ぶ経路(fullseye.apply / Studio のプログラム / op ごとの図)にだけ見える。

契約の根拠: 検証済みサンプル examples/gallery2d_bridge.py が全 12 op を叩き、(1) 宣言 out_sort の形(backends_typed._SHAPE_OK)(2) 有限性(3) 決定性(2 回でビット一致)(4) ノブ の効き、に加えて op ごとの閉形式(z = 値×10×s、フレーム t の変位 = t·step、体積の 最上段 = floor(値·s·(D−1))、中央視点 = 入力、|field| = 入力、距離ビン = 2SR/c/f_s·N …) を突き合わせる。

代表的なパイプライン(op の繋がり)

flowchart LR
    IMG[image<br/>入力画像]
    P[points<br/>img_to_points]
    S[signal<br/>img_to_signal]
    V[video<br/>img_to_video]
    VOL[volume<br/>img_to_volume]
    LF[lightfield<br/>img_to_lightfield]
    RGB[rgbimage<br/>img_to_rgb]
    Q[qimage<br/>tb_rgb_to_quaternion]
    M[qimage<br/>img_to_monogenic]
    IMG --> P --> P2[tb_estimate_point_normals<br/>tb_alpha_shape_boundary]
    IMG --> S --> S2[tb_smooth_funct_1d_gauss<br/>tb_bandpass]
    IMG --> V --> V2[tb_frame_difference_causal<br/>tb_motion_energy_image]
    IMG --> VOL --> VOL2[vol_erode / vol_dilate<br/>macro_vol_denoise]
    IMG --> LF --> LF2[tb_lf_epi / tb_lf_refocus<br/>tb_lf_depth_from_focus]
    IMG --> RGB --> Q --> Q2[tb_qft2 / tb_quat_color_filter]
    IMG --> M --> M2[tb_monogenic_amplitude<br/>tb_monogenic_phase]

使い方(op グループ別)

A. 幾何の種を作る(points / keypoints)

B. 1-D の種を作る(signal / counts / matrix)

C. 時間・空間の種を作る(video / volume / lightfield)

D. 色・複素・レーダーの種を作る(rgbimage / qimage / cimage / beatcube)

動く最小例(検証済み gallery2d_bridge から)

# repo 直下で: py -3.11 this_file.py
import numpy as np
import fullseye as fs

img = np.clip(np.random.default_rng(0).random((64, 64)), 0, 1)
pts = fs.apply(img, "img_to_points", 0.5, 0.5, on_error="raise")     # (1024, 3)
assert pts.shape == (32 * 32, 3)
assert np.allclose(pts[:, 2], (img[::2, ::2] * 10 * (0.25 + 1.75 * 0.5)).ravel())

vid = fs.apply(img, "img_to_video", 0.5, 0.0, on_error="raise")      # (8, 64, 64)、2 px/frame で +x
assert np.array_equal(vid[0], img)

lf = fs.apply(img, "img_to_lightfield", 0.5, 0.5, on_error="raise")  # (5, 5, 64, 64)
assert np.array_equal(lf[2, 2], img)                                 # 中央視点は入力そのもの
print("PASS")

Studio では次のプログラムがそのまま走る(op ノートの sample: ボタンと同じ):

img_to_points 0.50 0.50
tb_estimate_point_normals 0.50 0.50

数式(必要な op のみ)

サンプルデータ

合成のみ(examples/gallery2d_bridge.py_image())。自分の画像で試すなら fullseye.read_image の結果をそのまま渡せばよい(値域 [0,1] の 2-D)。

参考文献(正典)