sensor op• 데이터 종류: image2d × fingerprint → table
• 호출: import fullseye as fs; fs.ledger.fingerprint_correlate(image, fingerprint, denoiser: 'str' = 'wiener', sigma: 'float' = 0.02, exclude: 'int' = 11) -> 'dict'(구현을 직접 호출하려면 import imgforensics; imgforensics.fingerprint_correlate(image, fingerprint, denoiser: 'str' = 'wiener', sigma: 'float' = 0.02, exclude: 'int' = 11) -> 'dict', 원장에서 가져오려면 opsimgforensics.get("fingerprint_correlate"))
이미지 한 장을 지문에 대조합니다. 판정은 돌려주지 않습니다 —— 증거량과 주의서를 돌려줍니다.
잔차 W = I - denoise(I)와 참조 신호 I·K의 순환 상호상관을 FFT로 구해, 정규화 상호상관의 피크와 PCE(peak-to-correlation energy)를 반환한다.
반환(table 어휘의 dict):
pce PCE. 임계값은 동봉하지 않는다(아래 caveats 참조)
ncc_peak 정규화 상호상관의 피크값([-1, 1])
peak_shift 피크의 위치 (dy, dx). (0, 0)이 아니면 위치가 어긋나 있다
= 잘라내기 / 손떨림 보정 / 리사이즈를 의심할 단서
n_pixels 사용한 화소 수
caveats 이 수치가 말할 수 없는 것의 열(문자열)
peak_shift를 반환하는 것은 중요하며, (0, 0) 이외의 피크는 "같은 센서이지만잘려 있다"이거나 "우연한 상관" 중 하나이다. 어느 쪽인지는이 op로는 정할 수 없다. 실측에서는 다른 센서와의 대조는 항상 (0, 0) 이외에피크가 서고((-51, -60) (31, -8) 등 매번 제각각), 동일 센서는반드시 (0, 0)에 선다.
재압축으로 PRNU는 사라진다(tests/test_imgforensics.py::test_prnu_dies_under_recompression, 8장으로 만든 지문·128x128):
========== ========== ==========
재압축 PCE 무압축 대비
========== ========== ==========
무압축 7246 1.00
품질 95 6174 0.85
품질 90 4214 0.58
품질 75 1412 0.19
품질 50 530 0.07
품질 30 207 0.03
========== ========== ==========
즉 낮은 PCE는 "다른 카메라"가 아니라 "정보가 남아 있지 않다"일지도 모른다. 여기서 임계값을 동봉하면, 압축된 화상을 기계적으로 "다른 카메라"로 판정하는도구가 되어 버린다.
조용히 틀리는 경로(실측): fingerprint에 지문이 아니라 보통의 화상을 넘기면, shape는 맞으므로 예외는 나지 않고 PCE도 유한값이 반환된다. 지문은 (H, W)의 float64이므로 기존 image2d 술어를 완전히 만족하며, 실행 시에는 구별할 수 없다. 그래서 입구에서 "제로 평균이 아닌" 것을 ValueError로 튕긴다(|mean| > 0.05 * std). 실측(tests/test_imgforensics.py::test_fingerprint_gate_rejects_plain_images):
============================== ==============
넘긴 것 |mean|/std
============================== ============== sensor_fingerprint의 반환 4.8e-18
보통의 자연 화상 4.626
어두운 화상(평균 0.015) 4.626
고콘트라스트 화상 1.801
============================== ==============
비는 스케일 불변이므로 어두운 화상이든 밝은 화상이든 똑같이 튕길 수 있다(0.05의 임계값에서 1.5자릿수 이상 떨어져 있다).
그래도 완전하지는 않다: 직접 제로 평균화한 화상을 넘기면 게이트는 통과하고, PCE = -5.97이라는 유한값이 반환된다(실측). 즉 실행 시 검사는 한쪽밖에 지킬 수 없다. 이것이 "지문을 image2d에 편승시키지 않고 어휘를 나눈다"는판단의 근거이며, 자세한 내용은 opsimgforensics의 docstring에 있다.
• 샘플 데이터 카탈로그(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
• poc_prnu_camera_fingerprint — py -3.11 examples/poc_prnu_camera_fingerprint.py
table 를 입력으로 받는 것)sensor)sensor_fingerprint · fingerprint_strength_map
*Provenance: imgforensics.py — IMGFORENSICS 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.