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 作为输入)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.