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 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 में दिए गए हैं।
• image_forensics_audit — py -3.11 examples/image_forensics_audit.py
image2d को input के रूप में लेते हैं)perceptual_hash · fingerprint_correlate · error_level_map · jpeg_quality_estimate · jpeg_ghost_map · noise_inconsistency_map · copy_move_regions · watermark_extract
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.