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 個像素覆蓋的面積越大,這正是透視投影的 Jacobian, 若這裡維持 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.