match_localize op• 数据种类:voxel × voxel → position
• 调用: import fullseye as fs; fs.ledger.match_chamfer_3d(scene, template, device='cpu', thr=0.3, edt='scipy')(要直接调用实现,import match3d; match3d.match_chamfer_3d(scene, template, device='cpu', thr=0.3, edt='scipy');从台账取用则 ops3d.get("match_chamfer_3d"))
• 经台账调用的返回值: fullseye.ledger.match_chamfer_3d(...) 只返回声明的 out 类型 position 的值(底层函数还会返回辅助信息)。需要被丢弃的部分时,使用 fullseye.ledger.match_chamfer_3d.raw(...),或直接调用 match3d.match_chamfer_3d。
• GPU:无(仅 CPU 参考实现)
chamfer / 距离场匹配(对部分可见与遮挡稳健)。voxel × chamfer 列。
将模板的边缘点放置在场景边缘的 EDT 上(每个体素到最近边缘的距离)。最小化距离之和。得分(pos)=Σ_{模板边缘}DT_scene(pos+边缘)/n。 越低匹配越好。即使某些边缘点缺失,它也能工作(比 NCC 更能抵抗遮挡)。相关性 (conv3d) 始终是 GPU。距离场为 edt="scipy"(CPU,默认)或 edt="jfa"(edt_jfa,所有 GPU,无 CPU 往返,与 scipy 完全匹配)。返回值[倒角距离,d,h,w]。
步骤:用|∇| 边缘体素> thr·max|∇| 在两卷中(thr 是最大值 与斜率的相对比率,其中斜率是“sobel3d”)。为场景边缘创建距离变换DT并使用模板将边二进制值体积 Conv3d 到内核,并将其除以边数“n”。返回值“[dist,z,y,x]”的“dist”是“模板的每个体素边缘,直到最近的场景边缘”。“平均距离(以体素为单位)”和 0 是完美匹配。位置为模板中心(T//2)的场景坐标 Integer(subvoxel 没有细化。如果需要,请转到refine_translation_lk。由于它是角约定减去 T//2)。模板不完全适合的位置用最大值+1填充并排除。如果模板没有边缘(“thr”太高等),则分数将全为0,并返回索引(0,0,0)。如果场景中没有边缘,则距离场没有意义(较低的“thr”)。edt="jfa" 使用edt_jfa 并在device 上完成,否则在 scipy (CPU) 上完成。如果模板中没有边,则分数将全为 0,并返回有效范围(pd, ph, pw) 的开头。
空输入(带有 0 个元素的“scene”)会导致 ValueError。
• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。
• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。
• matching_localize — py -3.11 examples_3d/matching_localize.py
position 作为输入)refine_peak_newton · refine_translation_lk · refine_lm · fuse_to_voxel
match_localize)match_shape_3d · match_curvature_3d · match_hough_3d · match_mip_2d · match_points_ncc
*Provenance: match3d.py — 3D 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.