cad_defect_to_cad — CADMAP defect op

• 数据种类:mesh × labels → table

• 调用: import fullseye as fs; fs.ledger.cad_defect_to_cad(mesh, labels, K=None, R=None, t=None, cull_backfaces=True, min_pixels=1, background=0, strict=False)(要直接调用实现,import cadmap; cadmap.cad_defect_to_cad(mesh, labels, K=None, R=None, t=None, cull_backfaces=True, min_pixels=1, background=0, strict=False);从台账取用则 opscadmap.get("cad_defect_to_cad"))

用法

2-D 缺陷标签图 → CAD 面上的表(面 ID / 面上面积 / 3-D 重心)。

labels 是 (H, W) 的整数标签图像(忽略 background,bool 掩模也可以)。对每个标签发射所有像素的视线,累计命中的面以及这些像素在面上所占的实际面积。面积不是像素数,而是

dA = Z^2 * cosα / (fx * fy * |cosθ|)

其中 cosα 是相对光轴的倾斜,cosθ 是视线与面法线的夹角。越是斜着看的面,1 个像素覆盖的面积越大,这正是透视投影的雅可比行列式, 若这里保持 Z^2/(fx*fy),倾斜面上的缺陷就会显得偏小(60 度时正好减半)。

返回值是每个标签一个 dict 的 list(table sort):

• label 标签值。

• n_pixels 该标签的像素数。

• n_hit 命中 CAD 的像素数。hit_fraction = 其比例。

• area 面上的实际面积(mesh 长度单位的 2 次方)。只是命中像素部分的和,未命中的像素不计入。

• area_naive 仅 Z^2/(fx*fy) 的和(= 忽略倾斜的值)。两者都返回,是为了让使用者能自己确认倾斜校正是否生效。

• face_ids 命中面的升序唯一列表(int64 数组)。

• face_areas 与 face_ids 同顺序的各面面积。

• centroid 面积加权的 3-D 质心(世界坐标)。命中为 0 时为 NaN。

• depth_mean 命中像素的平均 Z。命中为 0 时为 NaN。

• winding_fixed bool — 是否检测到向内绕的闭合网格(mesh)并修正。所有记录都填入相同的值(因为这是以 mesh 为单位的性质)。

小于 min_pixels 的区域会被丢弃。命中为 0 的区域不删除,以 area = 0.0, hit_fraction = 0.0 保留 —— 若删除,“位于 CAD 之外的缺陷”就会从表中悄悄消失。

绕向的处理与其他 op 相同(cull_backfaces=True 时检测闭合的向内网格 → 默认自动修正 + winding_fixed,strict=True 时 ValueError)。坦白的局限: 由于返回的是记录的 list,若 labels 全是背景或所有区域都小于 min_pixels,导致 list 为空, 就没有地方记载修正的事实。这种情况下本来就连 1 个缺陷都没有拍到(不可能返回错误的数)。若需要记载之处,请设为 strict=True, 或在同一 mesh 上用 cad_pixel_to_surface 只查询 1 个像素。

参考(示例数据、文献)

• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。

• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。

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

可运行的示例(实际调用该算子并已验证的样例)

• defect_to_cad — py -3.11 examples/defect_to_cad.py

类型可衔接的下一个算子(可接受 table 作为输入)

—

同类别(defect)

—


*Provenance: cadmap.py — CADMAP 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*

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