sensor op• Datenarten: image2d × fingerprint → table
• Aufruf: import fullseye as fs; fs.ledger.fingerprint_correlate(image, fingerprint, denoiser: 'str' = 'wiener', sigma: 'float' = 0.02, exclude: 'int' = 11) -> 'dict' (die Implementierung direkt: import imgforensics; imgforensics.fingerprint_correlate(image, fingerprint, denoiser: 'str' = 'wiener', sigma: 'float' = 0.02, exclude: 'int' = 11) -> 'dict'; aus dem Register: opsimgforensics.get("fingerprint_correlate"))
Vergleicht ein Bild mit einem Fingerabdruck. Kein Urteil — eine Beweisstatistik und ihre Vorbehalte.
Bildet per FFT die zyklische Kreuzkorrelation des Residuums W = I - denoise(I) mit dem Referenzsignal I·K und gibt den Peak der normierten Kreuzkorrelation sowie die PCE (peak-to-correlation energy) zurück.
Rückgabe (ein dict des table-Vokabulars):
pce PCE. Es wird kein Schwellwert mitgeliefert (siehe caveats unten)
ncc_peak Peakwert der normierten Kreuzkorrelation ([-1, 1])
peak_shift Position des Peaks (dy, dx). Ist sie nicht (0, 0), ist die Position verschoben
= ein Hinweis, Zuschnitt / Bildstabilisierung / Skalierung zu vermuten
n_pixels Anzahl verwendeter Pixel
caveats Liste (Strings) dessen, was diese Zahl nicht aussagen kann
Dass peak_shift zurückgegeben wird, ist wichtig: Ein Peak außerhalb von (0, 0) ist entweder "derselbe Sensor, aber zugeschnitten" oder "eine zufällige Korrelation". Welches von beiden, kann dieses op nicht entscheiden. In Messungen liegt beim Abgleich mit einem anderen Sensor der Peak immer außerhalb von (0, 0) ((-51, -60) (31, -8) usw., jedes Mal anders), beim selben Sensor immer bei (0, 0).
Rekompression löscht PRNU (tests/test_imgforensics.py::test_prnu_dies_under_recompression, Fingerabdruck aus 8 Bildern, 128x128):
========== ========== ==========
Rekompr. PCE Verh. zu unkompr.
========== ========== ==========
keine 7246 1.00
Q 95 6174 0.85
Q 90 4214 0.58
Q 75 1412 0.19
Q 50 530 0.07
Q 30 207 0.03
========== ========== ==========
Eine niedrige PCE kann also statt "einer anderen Kamera" auch "keine Information mehr vorhanden" bedeuten. Ein hier mitgelieferter Schwellwert würde es zu einem Werkzeug machen, das komprimierte Bilder mechanisch als "andere Kamera" einstuft.
Ein Pfad, der stillschweigend falsch ist (gemessen): Übergibt man fingerprint statt eines Fingerabdrucks ein gewöhnliches Bild, passt die shape, daher gibt es keine Ausnahme, und auch die PCE wird als endlicher Wert geliefert. Ein Fingerabdruck ist (H, W) float64, erfüllt also das vorhandene image2d-Prädikat vollständig und ist zur Laufzeit nicht unterscheidbar. Daher wird am Eingang alles, was "nicht mittelwertfrei" ist, mit ValueError abgewiesen (|mean| > 0.05 * std). Gemessen (tests/test_imgforensics.py::test_fingerprint_gate_rejects_plain_images):
============================== ==============
Übergeben |mean|/std
============================== ============== sensor_fingerprint-Rückgabe 4.8e-18 Gewöhnliches natürliches Bild 4.626
Dunkles Bild (Mittel 0.015) 4.626
Kontrastreiches Bild 1.801
============================== ==============
Das Verhältnis ist skaleninvariant, sodass dunkle wie helle Bilder gleichermaßen abgewiesen werden (mehr als 1.5 Größenordnungen vom Schwellwert 0.05 entfernt).
Trotzdem nicht vollständig: Ein selbst mittelwertfrei gemachtes Bild passiert das Gate, und es wird ein endlicher Wert PCE = -5.97 geliefert (gemessen). Die Laufzeitprüfung kann also nur eine Seite schützen. Das ist die Grundlage der Entscheidung, "den Fingerabdruck nicht auf image2d mitfahren zu lassen, sondern ein eigenes Vokabular zu bilden"; Details im docstring von opsimgforensics.
• 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_forensics_audit — py -3.11 examples/image_forensics_audit.py
• poc_prnu_camera_fingerprint — py -3.11 examples/poc_prnu_camera_fingerprint.py
table als Eingabe)sensor)sensor_fingerprint · fingerprint_strength_map
*Provenance: imgforensics.py — IMGFORENSICS 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.