sensor_fingerprint — IMGFORENSICS sensor op

• Datenarten: images → fingerprint

• Aufruf: import fullseye as fs; fs.ledger.sensor_fingerprint(images, denoiser: 'str' = 'wiener', sigma: 'float' = 0.02, zero_mean: 'bool' = True) -> 'np.ndarray' (die Implementierung direkt: import imgforensics; imgforensics.sensor_fingerprint(images, denoiser: 'str' = 'wiener', sigma: 'float' = 0.02, zero_mean: 'bool' = True) -> 'np.ndarray'; aus dem Register: opsimgforensics.get("sensor_fingerprint"))

Verwendung

Maximum-Likelihood-Schätzung des PRNU-Sensorfingerabdrucks K aus mehreren Bildern (Chen et al. 2008).

K = Σ_i W_i I_i / Σ_i I_i² (W_i = I_i - denoise(I_i)). Unter dem Abbildungsmodell I = I⁰ + I⁰·K + Θ ist dies der Maximum-Likelihood-Schätzer von K —— PRNU tritt in helleren Pixeln stärker hervor (weil es ein multiplikativer Defekt ist), daher ist es ein mit der Helligkeit gewichteter Mittelwert.

Die Rückgabe ist (H, W) float64; bei zero_mean=True (Default) werden Zeilen- und Spaltenmittel entfernt und es ist auf Standardabweichung 1 normiert. Die Normierung macht die PCE von fingerprint_correlate skaleninvariant; die absolute Stärke des Fingerabdrucks liefert separat fingerprint_strength_map.

images sind 2 oder mehr Bilder gleicher shape. Nicht durch Skalieren angleichen —— PRNU ist die physische Position des Pixels selbst, daher verschwindet der Fingerabdruck im Moment der Interpolation (eine shape-Abweichung ergibt ValueError).

Gemessen: Bildanzahl vs. Trennung (tests/test_imgforensics.py::test_prnu_separates_two_sensors, 128x128, PRNU-Stärke 3%, Ausleserauschen σ=0.01, Default denoiser="wiener"):

====== ======================== ================= =================

Bilder Korr. mit wahrem K PCE selber Sensor PCE anderer Sensor

====== ======================== ================= =================

2 +0.727 5295 16.5

4 +0.809 6472 14.5

8 +0.859 7246 13.1

16 +0.892 7755 -12.3

====== ======================== ================= =================

Entscheidend ist, "die Korrelation mit dem wahren K" zu messen. Wer nur auf die PCE schaut, dem kann es "getrennt erscheinen", selbst wenn der Fingerabdruck das Sensormuster überhaupt nicht erfasst —— tatsächlich war diese Implementierung einmal in diesem Zustand (docstring von _wiener_denoise). Die PCE misst "etwas, das beim selben Sensor durchgängig auftritt"; dass es PRNU ist, garantiert die PCE selbst nicht.

denoiser="wavelet" (PyWavelets erforderlich) ist unter denselben Bedingungen durchweg stärker: Korrelation +0.745 bis +0.901, PCE selber Sensor 6068 bis 8852. Der Default ist "wiener", um eine optionale Abhängigkeit nicht zur Pflicht zu machen, nicht wegen der Genauigkeit.

Dies sind Werte auf synthetischem Rauschen; bei realen Kameras leckt der Bildinhalt in das Residuum, sodass sie um Größenordnungen kleiner werden. Diese Tabelle fixiert, dass "die Implementierung korrekt arbeitet"; sie ist kein Schwellwert für den realen Betrieb.

Referenzen (Beispieldaten, Literatur)

• 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.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• image_forensics_audit — py -3.11 examples/image_forensics_audit.py

• poc_prnu_camera_fingerprint — py -3.11 examples/poc_prnu_camera_fingerprint.py

Typkompatible Folge-Operatoren (nehmen fingerprint als Eingabe)

fingerprint_correlate · fingerprint_strength_map

Gleiche Kategorie (sensor)

fingerprint_correlate · 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.