watermark op• Data kinds: image2d → phash
• Call: import fullseye as fs; fs.ledger.watermark_extract(image, n_bits: 'int', wavelet: 'str' = 'haar', level: 'int' = 1) -> 'np.ndarray' (to call the implementation directly, import imgforensics; imgforensics.watermark_extract(image, n_bits: 'int', wavelet: 'str' = 'haar', level: 'int' = 1) -> 'np.ndarray'; from the registry, opsimgforensics.get("watermark_extract"))
Blind extraction of the watermark. Returns a 1-D bool (the phash vocabulary).
It only reads which is larger in each mid-band coefficient pair, with the same DWT / block division. It needs neither the original image nor a key —— this is a mark of integrity, not of secrecy; since there is no key, anyone can erase it and anyone can write it. It cannot be used to claim ownership.
Since the return is in the phash vocabulary, agreement with the embedded bit string can be counted directly with hash_distance (BER = hash_distance(sent, got) / n_bits). That is why the vocabularies are aligned.
PyWavelets required (ImportError).
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• The canonical algorithm (author, year) and its uses are named in the family usage guide above.
• image_forensics_audit — py -3.11 examples/image_forensics_audit.py
phash as input)hash_distance · watermark_embed · watermark_capacity
watermark)watermark_embed · watermark_capacity
*Provenance: imgforensics.py — IMGFORENSICS operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.