compression op• Data kinds: image2d → table
• Call: import fullseye as fs; fs.ledger.jpeg_quality_estimate(image, max_step: 'int' = 64, n_coeff: 'int' = 21) -> 'dict' (implementation को सीधे call करना हो तो import imgforensics; imgforensics.jpeg_quality_estimate(image, max_step: 'int' = 64, n_coeff: 'int' = 21) -> 'dict', registry से लेना हो तो opsimgforensics.get("jpeg_quality_estimate"))
decode की गई image से quantisation table और JPEG quality का blind अनुमान लगाता है। table।
यह file का DQT नहीं पढ़ता बल्कि केवल pixels से अनुमान लगाता है (यही मुख्य बात है:
PNG के रूप में दोबारा save की गई / चिपकाई गई image के लिए भी "यह मूल रूप से JPEG quality N थी" दिखाई देता है)। यह 8x8 block DCT लेता है, हर coefficient के लिए comb spacing का अनुमान लगाता है (Fan & de Queiroz 2003), और IJG के सार्वजनिक scaling rule से बनी standard tables की family में से सबसे अच्छा मेल खाने वाली quality चुनता है।
Returns (dict):
jpeg_compressed bool, इस आधार पर तय कि n_coeff coefficients में से कितनों में comb दिखा।
"यह JPEG है" का प्रमाण नहीं (नीचे caveats देखें)
quality अनुमानित quality 1..100 (comb न होने पर None)
table अनुमानित (8, 8) quantization steps (0 = अनुमान नहीं लग सका)
n_quantized comb दिखाने वाले coefficients की संख्या / n_coeff
fit_error चुनी गई quality की standard table से औसत निरपेक्ष अंतर
caveats वह जो यह संख्या नहीं बता सकती
मापा गया (tests/test_imgforensics.py::test_jpeg_quality_estimate_recovers_quality, 256x256 1/f^1.6 images को Pillow से encode → decode किया, फिर अनुमान लगाया):
======= ========= =============== ============
सही Q अनुमा. Q Comb coeffs 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 None 4/20 —
======= ========= =============== ============
कम quality वाली ओर की विफलता एक सैद्धांतिक सीमा है। quality जितनी कम होती है, उतने अधिक high-frequency coefficients 0 पर quantize होते हैं, और comb पढ़ने की सामग्री ही image से गायब हो जाती है ("comb coefficients" column दिखाता है कि यह कैसे गायब होती है)। quality 30 पर पर्याप्त सामग्री नहीं है, और यह कोई अनुमान नहीं लौटाता (quality=None)। यहाँ ज़बरदस्ती उत्तर न देना इस op की design नीति है।
और uncompressed PNG पर, jpeg_compressed=False / quality=None (4 seeds से पुष्टि की गई, उसी test में पक्का किया गया)। यहाँ चुपचाप "quality 100" उत्तर न देना बहुत ज़रूरी है; अन्यथा "uncompressed" और "लगभग lossless JPEG" एक ही उत्तर देंगे।
• 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 में दिए गए हैं।
• image_forensics_audit — py -3.11 examples/image_forensics_audit.py
table को input के रूप में लेते हैं)compression)error_level_map · jpeg_ghost_map · jpeg_ghost_quality
*Provenance: imgforensics.py — IMGFORENSICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.