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"이 같은 답이 된다.
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL 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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.