watermark op• Datenarten: image2d × phash → image2d
• Aufruf: import fullseye as fs; fs.ledger.watermark_embed(image, bits, strength: 'float' = 0.1, wavelet: 'str' = 'haar', level: 'int' = 1) -> 'np.ndarray' (die Implementierung direkt: import imgforensics; imgforensics.watermark_embed(image, bits, strength: 'float' = 0.1, wavelet: 'str' = 'haar', level: 'int' = 1) -> 'np.ndarray'; aus dem Register: opsimgforensics.get("watermark_embed"))
DWT-DCT-Wasserzeichen-Einbettung. Liefert das markierte Bild (H, W). image2d.
Zerlegt das LL-Teilband einer 1-stufigen DWT (Default haar) in 8x8-Blöcke und stellt 1 Bit durch die Größenrelation eines Paares von Mittelband-Koeffizienten (3,1) und (1,3) der orthogonalen DCT-II jedes Blocks dar (das Mittelband-Koeffizientenpaar-Verfahren von Hsu & Wu 1999). Ist die Differenz kleiner als strength, werden beide symmetrisch verschoben, bis die Differenz strength erreicht (nur einen zu verschieben würde die Energie des Blocks einseitig verändern). Die Extraktion braucht das Originalbild nicht (blind).
Die Kapazität ist (LL-Höhe // 8) * (LL-Breite // 8) Bit. Ist bits kürzer, wird von vorne aufgefüllt und die übrigen Blöcke bleiben unberührt. Ist es länger, ValueError.
bits ist ein bool-1-D-Array (phash-Vokabular). Auch ein int-Array aus 0/1 wird akzeptiert, float aber nicht (die Rundungsrichtung wird nicht stillschweigend festgelegt).
Den Zielkonflikt zwischen Stärke und Bildqualität sweept watermark_capacity und gibt ihn als Tabelle zurück. Gemessen (256x256-Texturbild, 128 Bit, LL ist 128x128 = Kapazität 256 Bit; 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
========= ========== ====== ================= =================
Das ist der Zielkonflikt in Wirklichkeit. Unbearbeitet ergibt selbst die schwächste Stärke 0.02 0 Fehler, aber nach JPEG-Qualität 75 kippen 19.5%. Der Default 0.1 ist als der Punkt "0 Fehler bis Qualität 75, PSNR 42.95 dB" gewählt (clipped ist bei jeder Stärke 0).
PyWavelets erforderlich (ImportError).
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.
• image_forensics_audit — py -3.11 examples/image_forensics_audit.py
image2d als Eingabe)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. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.