ncd — IMGMETRICS compression op

• Data kinds: image2d × image2d → scalar

• Call: import fullseye as fs; fs.ledger.ncd(a, b, compressor='lzma', levels=None, data_range=None, symmetric=True) (implementation को सीधे call करना हो तो import imgmetrics; imgmetrics.ncd(a, b, compressor='lzma', levels=None, data_range=None, symmetric=True), registry से लेना हो तो opsimgmetrics.get("ncd"))

उपयोग

normalised compression distance (Li, Chen, Li, Ma & Vitányi, IEEE TIT 50(12), 2004)।

NCD(x,y) = (C(xy) - min(C(x),C(y))) / max(C(x),C(y))। समान input पर यह 0 के क़रीब और असंबंधित पर 1 के क़रीब जाता है -- लेकिन असली compressor आदर्श Kolmogorov complexity नहीं है, इसलिए समान input पर भी ठीक 0 नहीं आता (header के कारण एक offset रहता है)। उस offset का मापा गया मान tests में दर्ज है।

कच्चे float arrays स्वीकार नहीं होते। compressor byte sequences की पुनरावृत्ति देखता है, इसलिए मानों में बहुत थोड़ा अंतर होने पर भी float के mantissa पूरी तरह बदल जाते हैं, और मिलती-जुलती 2 images में भी साझा byte sequences गायब हो जाते हैं। मापा गया (2026-09-02, linspace का gradient और उसमें +0.02 जोड़ी गई तस्वीर, PSNR 34.0 dB = बहुत मिलती-जुलती):

• float64 जैसा ही: 8-byte words की साझेदारी 0.02 % → NCD 1.0959 (ऐसा मान जो "बिल्कुल असंबंधित" पढ़ा जाता है, और ऊपर से 1 से अधिक)

• 256 स्तरों पर quantise करने पर: NCD 0.1290 (सही रूप से "बहुत मिलती-जुलती")

• सचमुच असंबंधित 2 images: NCD 0.9981

यानी float को जैसा का तैसा मापने पर बिना अपवाद उल्टा निष्कर्ष निकलता है। इसलिए float के लिए levels स्पष्ट देना आवश्यक है (levels=256 हो तो data_range को 256 स्तरों में quantise करके मापा जाता है)। integer dtype सीधे मापे जा सकते हैं।

symmetric=True (default) दोनों दिशाओं में मापकर औसत लेता है। compressor आगे से क्रम से dictionary बनाता है, इसलिए C(xy) != C(yx) होता है, और सीधा-सादा implementation ख़ुद को "दूरी" कहते हुए भी arguments के क्रम से मान बदल देता है (मापा गया: खड़ी और आड़ी धारियों पर 0.571429 बनाम 0.595238, सापेक्ष 4 %)। एकसमान random data के बीच अंतर 0.000e+00 आता है, इसलिए जब तक random data से test करते रहें, पता नहीं चलता -- यह ऐसा defect है जो structure वाले असली data पर ही टूटता है।

उपयोग की विस्तृत guide

• image_difference_metrics family guide

संदर्भ (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 करते हैं)

• image_quality_metrics — py -3.11 examples/image_quality_metrics.py

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

luma_limited_u8 · rank_data · tid2013_index

इसी category के (compression)

compressed_size


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

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