compression op• 数据种类:image2d → table
• 调用: import fullseye as fs; fs.ledger.jpeg_quality_estimate(image, max_step: 'int' = 64, n_coeff: 'int' = 21) -> 'dict'(要直接调用实现,import imgforensics; imgforensics.jpeg_quality_estimate(image, max_step: 'int' = 64, n_coeff: 'int' = 21) -> 'dict';从台账取用则 opsimgforensics.get("jpeg_quality_estimate"))
由已解码图像盲估量化表与 JPEG 质量。table。
不读取文件的 DQT,而是只从像素来估计(要点就在这里,即使是重新保存为 PNG / 被粘贴的图像,也能看出“原本是 JPEG 质量 N”)。取 8x8 块 DCT,对每个系数估计梳状间隔(Fan & de Queiroz 2003),再从按 IJG 公开的缩放规则生成的标准表族中选出最吻合的质量。
返回(dict):
jpeg_compressed 根据 n_coeff 个系数中出现梳状的有几个来判断的
bool。并不是“是 JPEG”的证明(见下方 caveats)
quality 估计质量 1..100(没有梳状时为 None)
table 估计出的 (8, 8) 量化步长(0 = 无法估计)
n_quantized 出现梳状的系数数 / n_coeff
fit_error 与所选质量的标准表的平均绝对差
caveats 此数值无法断言的事
实测(tests/test_imgforensics.py::test_jpeg_quality_estimate_recovers_quality,将 256x256 的 1/f^1.6 图像用 Pillow 编码 → 解码后估计):
======= ========= =============== ============
真 Q 估计 Q 出现梳状的系数 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 —
======= ========= =============== ============
在低质量一侧崩溃是原理上的极限。质量越低,高频系数越多地被量化为 0,读取梳状的材料本身就从图像中消失了(“出现梳状的系数”一列就是它消失的过程)。质量 30 时材料不足,不返回估计(quality=None)。不在这里勉强给出答案,是本 op 的设计方针。
而且在无压缩 PNG 上为 jpeg_compressed=False / quality=None (用 4 个 seed 确认,并在同一测试中固定)。关键在于此处不默默回答“质量 100”,否则“无压缩”与“几乎无损的 JPEG”会得到相同的答案。
• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。
• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。
• 算法的正典(作者、年份)与用途见上面的族使用指南。
• image_forensics_audit — py -3.11 examples/image_forensics_audit.py
table 作为输入)compression)error_level_map · jpeg_ghost_map · jpeg_ghost_quality
*Provenance: imgforensics.py — IMGFORENSICS 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.