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.