compression opimage2d → image2dimport fullseye as fs; fs.ledger.error_level_map(image, quality: 'int' = 90, normalize: 'bool' = True) -> 'np.ndarray' (実装を直接呼ぶなら import imgforensics; imgforensics.error_level_map(image, quality: 'int' = 90, normalize: 'bool' = True) -> 'np.ndarray'、台帳から引くなら opsimgforensics.get("error_level_map"))ELA(誤差レベル解析)。指定品質で 再圧縮した差分の地図を返す。image2d。
Krawetz 2007。JPEG は 8x8 ブロックごとに量子化するので、一度圧縮された領域は 同じ品質で再圧縮しても誤差が小さく、後から貼られた / 描かれた領域は誤差が 大きく残る、という考え方に基づく。
normalize=True(既定)なら最大値で割って [0, 1] にする(見るため)。
False なら 8 bit 階調そのままの絶対誤差(数えるため)。
Pillow が無ければ :class:ImportError。近似には落ちない。 DCT の量子化だけを
numpy で真似ると、符号化器の丸め・色空間変換・チャネル間引きが消えた 別物 に
なる。それを ELA と名乗ると、この族が潰そうとしている「もっともらしく間違う」を
自分でやることになる。
この地図が言えないこと(tests/test_imgforensics.py が数で固定。
256x256 の 1/f^1.6 画像の中央 64x64 に別画像を貼ったもの):
==================================== =============== =============== ========= 元の画像 貼付部の ELA 背景の ELA 比 ==================================== =============== =============== ========= 無圧縮(一度も JPEG を通らない) 0.1966 0.1793 1.096 一度 JPEG 品質 75 を通した 0.1966 0.0401 4.898 ==================================== =============== =============== =========
py -3.11 examples/image_forensics_audit.pypy -3.11 examples/poc_forensics_roc.pyimage2d を入力に取れる)perceptual_hash · fingerprint_correlate · jpeg_quality_estimate · jpeg_ghost_map · noise_inconsistency_map · copy_move_regions · watermark_embed · watermark_extract
compression)jpeg_quality_estimate · jpeg_ghost_map · jpeg_ghost_quality
Provenance: imgforensics.py — IMGFORENSICS operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.