fingerprint_correlate — IMGFORENSICS 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"))

用法

把一張影像與指紋比對。不給出判定 —— 回傳證據量與注意事項。

以 FFT 求殘差 W = I - denoise(I) 與參考訊號 I·K 的循環互相關,回傳正規化互相關的峰值與 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。

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 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 作為輸入)

evidence_quantile

同類別(sensor)

sensor_fingerprint · fingerprint_strength_map


*Provenance: imgforensics.py — IMGFORENSICS 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.