fingerprint_correlate — IMGFORENSICS sensor op

• Data kinds: image2d × fingerprint → table

• Call: import fullseye as fs; fs.ledger.fingerprint_correlate(image, fingerprint, denoiser: 'str' = 'wiener', sigma: 'float' = 0.02, exclude: 'int' = 11) -> 'dict' (implementation को सीधे call करना हो तो import imgforensics; imgforensics.fingerprint_correlate(image, fingerprint, denoiser: 'str' = 'wiener', sigma: 'float' = 0.02, exclude: 'int' = 11) -> 'dict', registry से लेना हो तो opsimgforensics.get("fingerprint_correlate"))

उपयोग

1 image को fingerprint से मिलाता है। निर्णय नहीं लौटाता — evidence statistic और चेतावनियाँ लौटाता है।

residual W = I - denoise(I) और reference signal I·K का circular cross-correlation FFT से लेता है, और normalized cross-correlation का peak तथा PCE (peak-to-correlation energy) लौटाता है।

Returns (table vocabulary का dict):

pce PCE। कोई threshold साथ नहीं दिया जाता (नीचे caveats देखें)

ncc_peak normalized cross-correlation का peak मान ([-1, 1])

peak_shift peak की स्थिति (dy, dx)। यदि यह (0, 0) नहीं है, तो स्थिति खिसकी हुई है

= cropping / image stabilization / resizing पर शक करने का सुराग

n_pixels उपयोग किए गए pixels की संख्या

caveats उन बातों की list (strings) जो यह संख्या नहीं बता सकती

peak_shift लौटाना मायने रखता है: (0, 0) के अलावा कोई peak या तो "समान sensor लेकिन cropped" है या "संयोग से हुआ correlation"। दोनों में से कौन-सा है, यह op तय नहीं कर सकता। मापों में, अलग sensor से matching का peak हमेशा (0, 0) के अलावा कहीं और आता है ((-51, -60) (31, -8) आदि, हर बार बिखरा हुआ), जबकि समान sensor का peak हमेशा (0, 0) पर आता है।

Recompression PRNU को खत्म कर देता है (tests/test_imgforensics.py::test_prnu_dies_under_recompression, 8 images से बना fingerprint, 128x128):

========== ========== ==============

Recompr. PCE None से अनुपात

========== ========== ==============

None 7246 1.00

Quality 95 6174 0.85

Quality 90 4214 0.58

Quality 75 1412 0.19

Quality 50 530 0.07

Quality 30 207 0.03

========== ========== ==============

इसलिए कम PCE का अर्थ "अलग camera" नहीं बल्कि "कोई जानकारी नहीं बची" भी हो सकता है। यहाँ threshold साथ देने से यह ऐसा tool बन जाएगा जो compressed images को यांत्रिक रूप से "अलग camera" ठहराता है।

एक path जो चुपचाप गलत है (मापा गया): यदि fingerprint में fingerprint की जगह एक साधारण image दी जाए, तो shape मेल खाता है, इसलिए कोई exception नहीं उठता और एक finite PCE लौटता है। fingerprint (H, W) float64 है, इसलिए यह मौजूदा image2d predicate को पूरी तरह संतुष्ट करता है और run time पर अलग नहीं पहचाना जा सकता। इसलिए जो कुछ भी "zero-mean नहीं" है उसे entry पर ही ValueError से अस्वीकार किया जाता है (|mean| > 0.05 * std)। मापा गया (tests/test_imgforensics.py::test_fingerprint_gate_rejects_plain_images):

================================= ==============

क्या दिया गया |mean|/std

================================= ============== sensor_fingerprint output 4.8e-18

साधारण natural image 4.626

Dark image (mean 0.015) 4.626

High-contrast image 1.801

================================= ==============

यह अनुपात scale-invariant है, इसलिए dark और bright images दोनों समान रूप से अस्वीकार होती हैं (threshold 0.05 से 1.5 orders of magnitude से अधिक दूर)।

फिर भी पूरा नहीं: जो image आपने स्वयं zero-mean की है वह gate पार कर लेती है, और एक finite मान PCE = -5.97 लौटता है (मापा गया)। यानी run-time check केवल एक पक्ष की रक्षा कर सकता है। यही निर्णय "fingerprint को image2d के सहारे न चलने दें; उसे अपनी vocabulary दें" का आधार है, जिसका विवरण opsimgforensics के docstring में है।

संदर्भ (sample data, साहित्य)

• 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 में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• image_forensics_audit — py -3.11 examples/image_forensics_audit.py

• poc_prnu_camera_fingerprint — py -3.11 examples/poc_prnu_camera_fingerprint.py

वे अगले ops जिनसे type जुड़ता है (table को input के रूप में लेते हैं)

evidence_quantile

इसी category के (sensor)

sensor_fingerprint · fingerprint_strength_map


*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.