cad_defect_to_cad — CADMAP defect op

• Data kinds: mesh × labels → table

• Call: 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) (implementation को सीधे call करना हो तो 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), registry से लेना हो तो opscadmap.get("cad_defect_to_cad"))

उपयोग

2-D defect label image → CAD सतह पर table (face ID / face पर क्षेत्रफल / 3-D centroid)।

labels एक (H, W) integer label image है (background अनदेखा किया जाता है, bool mask भी चलता है)। हर label के लिए सभी pixels की rays भेजता है, और hit हुए faces तथा उन pixels के face पर घेरे गए वास्तविक क्षेत्रफल को जोड़ता है। क्षेत्रफल pixel count नहीं बल्कि

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

है, जहाँ cosα optical axis से झुकाव है और cosθ ray और face normal के बीच का कोण है। face जितना तिरछा दिखता है, 1 pixel उतना बड़ा क्षेत्रफल ढकता है -- यह perspective projection का Jacobian ही है, और यहाँ Z^2/(fx*fy) ही रहने देने पर झुके हुए face के defect छोटे दिखते हैं (60 degree पर ठीक आधे)।

return हर label के लिए एक dict की list है (table sort):

• label label मान।

• n_pixels उस label के pixels की संख्या।

• n_hit CAD से टकराए pixels की संख्या। hit_fraction = उनका अनुपात।

• area surface पर वास्तविक क्षेत्रफल (mesh की length unit की घात 2)। केवल hit हुए pixels का योग; जो pixels नहीं टकराए वे नहीं जोड़े जाते।

• area_naive केवल Z^2/(fx*fy) का योग (= झुकाव को अनदेखा करने वाला मान)। दोनों इसलिए लौटाए जाते हैं ताकि user स्वयं जाँच सके कि tilt correction काम कर रहा है या नहीं।

• face_ids hit हुए faces की बढ़ते क्रम में unique list (int64 array)।

• face_areas face_ids के समान क्रम में हर face का क्षेत्रफल।

• centroid क्षेत्रफल-weighted 3-D centroid (world coordinates)। 0 hits हों तो NaN।

• depth_mean hit हुए pixels का औसत Z। 0 hits हों तो NaN।

• winding_fixed bool -- क्या अंदर की ओर wound closed mesh पहचानकर ठीक किया गया। हर record में एक ही मान होता है (क्योंकि यह प्रति mesh का गुण है)।

min_pixels से छोटे regions हटा दिए जाते हैं। 0 hits वाले regions हटाए नहीं जाते बल्कि area = 0.0, hit_fraction = 0.0 के साथ रखे जाते हैं -- हटाने पर "CAD के बाहर के defects" table से चुपचाप गायब हो जाते।

winding का व्यवहार अन्य ops जैसा ही है (cull_backfaces=True पर closed अंदर की ओर wound mesh पहचाना जाता है → default में auto-fix + winding_fixed, strict=True पर ValueError)। ईमानदार सीमा: क्योंकि records की list लौटती है, यदि labels पूरा background हो या सभी regions min_pixels से छोटे हों और list खाली हो जाए, तो fix के तथ्य को दर्ज करने की कोई जगह नहीं रहती। उस स्थिति में असल में 1 भी defect image में आया ही नहीं (गलत संख्या लौटने की कोई संभावना नहीं)। दर्ज करने की जगह चाहिए तो strict=True करें, या उसी mesh पर cad_pixel_to_surface से केवल 1 pixel query करें।

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• defect_to_cad — py -3.11 examples/defect_to_cad.py

वे अगले ops जिनसे type जुड़ता है (table को input के रूप में लेते हैं)

—

इसी category के (defect)

—


*Provenance: cadmap.py — CADMAP operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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