compression op• Datenarten: image2d × image2d → scalar
• Aufruf: import fullseye as fs; fs.ledger.ncd(a, b, compressor='lzma', levels=None, data_range=None, symmetric=True) (die Implementierung direkt: import imgmetrics; imgmetrics.ncd(a, b, compressor='lzma', levels=None, data_range=None, symmetric=True); aus dem Register: opsimgmetrics.get("ncd"))
Normalisierte Kompressionsdistanz (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)). Für Gleiches nähert es sich 0, für Unabhängiges 1 -- aber ein realer Kompressor ist nicht die ideale Kolmogorov-Komplexität, daher ergibt selbst identische Eingabe nicht exakt 0 (es gibt einen Sockel durch den Header). Der gemessene Wert dieses Sockels ist in den Tests festgehalten.
Rohe float-Arrays werden nicht angenommen. Ein Kompressor sucht nach wiederholten Bytefolgen, daher werden bei nur minimal verschiedenen Werten die float-Mantissen komplett ausgetauscht, und selbst bei 2 ähnlichen Bildern verschwinden die gemeinsamen Bytefolgen. Gemessen (2026-09-02, ein linspace-Verlauf und derselbe plus 0.02, PSNR 34.0 dB = sehr ähnlich):
• Als float64: Anteil gemeinsamer 8-Byte-Wörter 0.02 % → NCD 1.0959 (ein Wert, der als "völlig unabhängig" gelesen wird, und obendrein über 1)
• Auf 256 Stufen quantisiert: NCD 0.1290 (korrekt "sehr ähnlich")
• 2 wirklich unabhängige Bilder: NCD 0.9981
Misst man also als float, ergibt sich ausnahmslos die gegenteilige Schlussfolgerung. Daher verlangt float die explizite Angabe von levels (levels=256 quantisiert data_range auf 256 Stufen vor dem Messen). Integer-dtypes lassen sich direkt messen.
symmetric=True (Standard) misst beide Richtungen und mittelt. Ein Kompressor baut sein Wörterbuch von vorn nach hinten auf, daher gilt C(xy) != C(yx), und eine naive Implementierung nennt sich "Abstand", während sich der Wert mit der Argumentreihenfolge ändert (gemessen: senkrechte vs. waagerechte Streifen 0.571429 gegen 0.595238, relativ 4 %). Zwischen gleichverteilten Zufallsdaten ist die Differenz 0.000e+00, solange man also mit Zufallsdaten testet, merkt man es nicht -- ein Defekttyp, der erst bei echten Daten mit Struktur bricht.
• Leitfaden zur Familie image_difference_metrics
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.
• image_quality_metrics — py -3.11 examples/image_quality_metrics.py
scalar als Eingabe)luma_limited_u8 · rank_data · tid2013_index
compression)*Provenance: imgmetrics.py — IMGMETRICS Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.