sensor_fingerprint — IMGFORENSICS sensor op

• Data kinds: images → fingerprint

• Call: import fullseye as fs; fs.ledger.sensor_fingerprint(images, denoiser: 'str' = 'wiener', sigma: 'float' = 0.02, zero_mean: 'bool' = True) -> 'np.ndarray' (implementation को सीधे call करना हो तो import imgforensics; imgforensics.sensor_fingerprint(images, denoiser: 'str' = 'wiener', sigma: 'float' = 0.02, zero_mean: 'bool' = True) -> 'np.ndarray', registry से लेना हो तो opsimgforensics.get("sensor_fingerprint"))

उपयोग

कई image से PRNU sensor fingerprint K का maximum likelihood अनुमान लगाता है (Chen et al. 2008)।

K = Σ_i W_i I_i / Σ_i I_i² (W_i = I_i - denoise(I_i))। imaging model I = I⁰ + I⁰·K + Θ के अंतर्गत यह K का maximum-likelihood estimator है —— PRNU अधिक चमकीले pixels में अधिक मज़बूती से दिखता है (क्योंकि यह एक multiplicative defect है), इसलिए यह brightness-weighted औसत है।

आउटपुट (H, W) float64 है; zero_mean=True (default) होने पर row और column के mean हटाए जाते हैं और इसे standard deviation 1 पर normalize किया जाता है। normalization से fingerprint_correlate का PCE scale-invariant बनता है; fingerprint की निरपेक्ष ताकत अलग से fingerprint_strength_map लौटाता है।

images समान shape की 2 या अधिक होनी चाहिए। इन्हें मिलाने के लिए resize न करें —— PRNU स्वयं pixel की भौतिक स्थिति (position) है, इसलिए interpolate करते ही fingerprint गायब हो जाता है (shape mismatch पर ValueError उठता है)।

images की संख्या बनाम अलगाव का माप (tests/test_imgforensics.py::test_prnu_separates_two_sensors, 128x128, PRNU strength 3%, read noise σ=0.01, default denoiser="wiener"):

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

Images सही K से correlation PCE same sensor PCE other sensor

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

2 +0.727 5295 16.5

4 +0.809 6472 14.5

8 +0.859 7246 13.1

16 +0.892 7755 -12.3

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

"सही K से correlation" को मापना ही मायने रखता है। केवल PCE देखने पर, fingerprint sensor pattern का कुछ भी न पकड़े तब भी यह "अलग हुआ दिख" सकता है —— वास्तव में यह implementation एक समय इसी स्थिति में था (_wiener_denoise का docstring)। PCE "जो समान sensor के लिए लगातार दिखता है" उसे मापता है, इसलिए PCE स्वयं इसकी कोई गारंटी नहीं देता कि वह PRNU है।

denoiser="wavelet" (PyWavelets आवश्यक) समान शर्तों में लगातार अधिक मज़बूत है: correlation +0.745 से +0.901, same-sensor PCE 6068 से 8852। default "wiener" है ताकि एक optional dependency अनिवार्य न बने, accuracy के कारण नहीं।

ये synthetic noise पर मान हैं; असली cameras पर scene की सामग्री residual में रिसती है, इसलिए ये कई orders of magnitude छोटे हो जाते हैं। यह table पक्का करती है कि "implementation सही काम करता है"; यह वास्तविक उपयोग के लिए threshold नहीं है।

संदर्भ (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 जुड़ता है (fingerprint को input के रूप में लेते हैं)

fingerprint_correlate · fingerprint_strength_map

इसी category के (sensor)

fingerprint_correlate · 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.