gaussians_to_voxel — REPRCONV gaussians op

• 資料種類:gaussians → voxel

• 呼叫: import fullseye as fs; fs.ledger.gaussians_to_voxel(gaussians, shape=(32, 32, 32), origin=(0.0, 0.0, 0.0), spacing=(1.0, 1.0, 1.0), truncate=3.0)(要直接呼叫實作,import reprconv; reprconv.gaussians_to_voxel(gaussians, shape=(32, 32, 32), origin=(0.0, 0.0, 0.0), spacing=(1.0, 1.0, 1.0), truncate=3.0);從台帳取用則 opsreprconv.get("gaussians_to_voxel"))

用法

gaussians → 密度 voxel (D,H,W)。gaussians 的第二個出口。

將各高斯在 truncate * sigma 處截斷後累加。重點是網格的原點與步長都作為明確引數,若直接使用預設的 spacing=(1,1,1), 就等於「把世界座標直接當作索引」,對真實資料幾乎必錯 —— 而且不會拋出例外,密度只是出現在別處,所以察覺不到。tests/test_reprconv.py 明確地量測了這種混淆。

不可逆。損失有 3 種,每種都能以數字量測:

• 截斷 —— 截斷是軸平行的盒子(各軸 ±truncate*sigma),因此剩餘質量為 erf(t/sqrt(2))**3。t = 3 時為 99.194%。

★這裡曾經寫錯: 最初寫成「3 sigma 球的質量 97.07%」,但

實作是盒子,所以值不同。把步長從 1.0 → 0.125 細化取極限,

會由 99.30% → 99.19% 收斂,而不會接近球的 97.07%,由此得以反證

(tests/test_reprconv.py::test_gaussians_to_voxel_mass_matches_box_truncation)。

既不拋出例外也不出 NaN,正是「悄悄回傳錯誤數字」那一類錯誤。

• 網格求積 —— 由於是中點法則,步長相對 sigma 較粗時會偏高 (實測: sigma = 1.5 時步長 1.0 為 99.94%,0.125 為 99.30%)。

• 邊界截掉 —— 盒子超出 volume 的部分會被丟掉。中心靠近邊緣的高斯,這部分損失遠大於截斷。

Args:

gaussians: 含 mu / sigma / w 的 dict。mu 為 (z, y, x)。

shape: (D, H, W)。

origin: 網格的 (z, y, x) 原點(世界座標)。

spacing: 網格的 (dz, dy, dx) 步長(世界單位 / voxel)。

truncate: 在幾個 sigma 處截斷(預設 3)。

Returns:

(D, H, W) float64 的密度(值為「每個 voxel 的權重和」,體積積分

趨近 sum(w))。

Raises:

ValueError: shape/spacing 不正確 / truncate <= 0 / gaussians 不正確。

參考(範例資料、文獻)

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

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

• 演算法的正典(作者、年份)與用途見上面的族使用指南。

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

• representation_roundtrip — py -3.11 examples/representation_roundtrip.py

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

correlation_score

同類別(gaussians)

points_to_gaussians · gaussians_to_points


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

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