watermark_embed — IMGFORENSICS watermark op

• Data kinds: image2d × phash → image2d

• Call: import fullseye as fs; fs.ledger.watermark_embed(image, bits, strength: 'float' = 0.1, wavelet: 'str' = 'haar', level: 'int' = 1) -> 'np.ndarray' (implementation को सीधे call करना हो तो import imgforensics; imgforensics.watermark_embed(image, bits, strength: 'float' = 0.1, wavelet: 'str' = 'haar', level: 'int' = 1) -> 'np.ndarray', registry से लेना हो तो opsimgforensics.get("watermark_embed"))

उपयोग

DWT-DCT watermark embed करना। watermark वाली image (H, W) लौटाता है। image2d।

1-level DWT (default haar) के LL subband को 8x8 blocks में काटता है और 1 bit को इस बात से दर्शाता है कि हर block के orthogonal DCT-II के mid-band coefficients की जोड़ी (3,1) और (1,3) में कौन बड़ा है (Hsu & Wu 1999 की mid-band coefficient-pair method)। यदि अंतर strength से कम है, तो दोनों को सममित रूप से खिसकाया जाता है जब तक अंतर strength तक न पहुँचे (केवल एक को खिसकाने से block की energy पक्षपाती हो जाती)। निकालने (extraction) के लिए मूल image की ज़रूरत नहीं है (blind)।

क्षमता (LL height // 8) * (LL width // 8) bits है। यदि bits उससे छोटा है, तो यह शुरुआत से भरता है और शेष blocks को अछूता छोड़ता है। यदि लंबा है, तो ValueError।

bits एक bool 1-D array है (phash vocabulary)। 0/1 का int array भी स्वीकार है, लेकिन float नहीं (यह rounding की दिशा चुपचाप तय नहीं करता)।

strength और image quality के बीच का trade-off watermark_capacity sweep करके table के रूप में लौटाता है। मापा गया (256x256 texture image, 128 bits, LL 128x128 है = क्षमता 256 bits; tests/test_imgforensics.py::test_watermark_strength_psnr_tradeoff):

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

strength PSNR (dB) BER BER (JPEG q 90) BER (JPEG q 75)

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

0.02 45.48 0.000 0.008 0.195

0.05 44.48 0.000 0.000 0.008

0.10 42.95 0.000 0.000 0.000

0.20 40.32 0.000 0.000 0.000

0.40 36.37 0.000 0.000 0.000

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

trade-off वास्तव में यही है। बिना processing के, सबसे कमज़ोर 0.02 भी 0 errors देता है, लेकिन JPEG quality 75 से गुज़रने पर 19.5% बिगड़ जाते हैं। default 0.1 को इस बिंदु के रूप में चुना गया "quality 75 तक 0 errors, PSNR 42.95 dB" (हर strength पर clipped 0 है)।

PyWavelets आवश्यक (ImportError)।

संदर्भ (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

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

perceptual_hash · fingerprint_correlate · error_level_map · jpeg_quality_estimate · jpeg_ghost_map · noise_inconsistency_map · copy_move_regions · watermark_extract

इसी category के (watermark)

watermark_extract · watermark_capacity


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