compression op• Datenarten: image2d → table
• Aufruf: import fullseye as fs; fs.ledger.jpeg_quality_estimate(image, max_step: 'int' = 64, n_coeff: 'int' = 21) -> 'dict' (die Implementierung direkt: import imgforensics; imgforensics.jpeg_quality_estimate(image, max_step: 'int' = 64, n_coeff: 'int' = 21) -> 'dict'; aus dem Register: opsimgforensics.get("jpeg_quality_estimate"))
• GPU: nein (nur CPU-Referenzimplementierung)
Blinde Schätzung der Quantisierungstabelle und der JPEG-Qualität aus einem decodierten Bild. table.
Anstatt den DQT der Datei zu lesen, schätzen Sie ihn anhand von nur Pixeln (darum geht es, Auch wenn das Bild erneut gespeichert/in PNG eingefügt wird, wird die „ursprüngliche JPEG-Qualität N“ angezeigt. sichtbar). Nehmen Sie eine 8x8-Block-DCT und schätzen Sie den Kammabstand für jeden Koeffizienten ab (Fan & de Queiroz 2003), aus einer Familie von Standardtabellen, die unter Verwendung der öffentlichen Skalierungsregeln von IJG erstellt wurden. Wählen Sie die Qualität, die am besten zu Ihnen passt.
Rückgabe (Dikt):
„jpeg_compressed“ Gemessen daran, wie viele „n_coeff“-Koeffizienten gekämmt wurden
bool. Dies ist kein Beweis dafür, dass es sich um ein JPEG handelt (Vorbehalte unten)
„Qualität“ Geschätzte Qualität 1..100 („Keine“, wenn kein Kamm vorhanden ist) „Tabelle“ Geschätzter Quantisierungsschritt von „(8, 8)“ (0 = nicht geschätzt) „n_quantized“ Rohzahl der gekämmten Koeffizienten ohne DC „n_tested = n_coeff - 1“. „fit_error“ Mittlerer absoluter Unterschied zur ausgewählten Qualitätsstandardtabelle „Vorbehalte“ Was diese Nummer nicht sagen kann
Tatsächliche Messung („tests/test_imgforensics.py::test_jpeg_quality_estimate_recovers_quality“, 256x256 1/f^1,6-Bild mit Pillow kodieren → dekodieren und schätzen):
======= ========= =============== ============ Wahre Q-Schätzung Q-Kammkoeffizient fit_error ======= ========= =============== ============ 95 95 11/20 0,091 90 90 19/20 0,579 80 80 13/20 1.308 70 71 12/20 2.083 60 60 9/20 2.111 50 52 7/20 1.857 40 40 6/20 3.333 30 Keine 4/20 — ======= ========= =============== ============
Es ist eine theoretische Grenze, dass es auf der Seite geringer Qualität zusammenbricht. Mit abnehmender Qualität wird der Hochfrequenzkoeffizient 0. quantisiert, und das Kamm-Lesematerial selbst verschwindet aus dem Bild (die Spalte mit den „gekämmten Koeffizienten“ verschwindet). Wie es verschwindet). Bei Qualität 30 ist nicht genügend Material vorhanden und gibt keine Schätzung zurück(Qualität=Keine). Die Designpolitik dieser Operation besteht nicht darin, hier eine Antwort zu erzwingen.
und „jpeg_compressed=False“ / „quality=None“ für unkomprimiertes PNG. (Bestätigt mit 4 Samen, fixiert im selben Test). Das Beste, was Sie tun können, ist, nicht einfach „Qualität 100“ zu sagen. In diesem Fall sind „unkomprimiertes“ und „praktisch unverfälschtes JPEG“ die gleiche Antwort.
• 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
table als Eingabe)compression)error_level_map · jpeg_ghost_map · jpeg_ghost_quality
*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.