Files
remove-ai-watermarks/data/gemini_capture
Victor Kuznetsov e572767555 feat(visible): add Jimeng remover, fix Doubao outline defect, reproducible mask build
Visible-watermark work across all three corner-mark engines plus a committed,
reproducible alpha-build pipeline (scripts/visible_alpha_solve.py) fed by committed
solid black/gray/white captures.

- jimeng: new "即梦AI" wordmark remover (reverse-alpha + thin residual inpaint,
  always NCC-aligned -- the mark re-rasterizes/jitters per image). Detect via glyph
  silhouette NCC (0.45 threshold; does not cross-fire with Doubao). Registered in the
  visible-mark catalog; `visible --mark jimeng` / `--mark auto`.
- doubao: fix a real production defect -- the shipped remover left a READABLE
  "豆包AI生成" outline on real samples while detect() returned conf 0.0 (fooled by a
  thin outline), so the test passed and the "56/56 clean" claim was detector-measured,
  not visual. Root cause: under-estimated alpha + fixed-geometry-no-inpaint + tight
  locate box. Rebuilt alpha (careful gray-self solve), always-align, thin inpaint,
  widened locate box -> readable outline becomes faint texture-level traces.
- gemini: rebuild gemini_bg_{96,48} from our own controlled captures (validated NCC
  0.9998 vs the prior third-party asset); removal re-verified clean, no behaviour change.
- tests: add textured-shift regression to both engines (guards the align-on-shift path
  the Doubao defect exposed; lesson: a detector-only removal test is insufficient,
  assert visual residual).
- docs: CLAUDE.md, README, capture READMEs and docstrings synced; stale
  "exact/pixel-exact/56-clean" claims removed.

Also includes a SynthID label-wording clarification in identify.py/cli.py
("SynthID pixel watermark" -> "SynthID watermark, inferred from C2PA metadata").

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 12:20:19 -07:00
..

Gemini (Nano Banana) visible sparkle capture

Status (captured 2026-05-31): black/gray/white captures taken and committed in captures/ (solid colour + the sparkle, content-free). The sparkle-on-black assets gemini_bg_{96,48}.png are rebuilt by scripts/visible_alpha_solve.py gemini.

Google Gemini (Nano Banana) stamps a four-point sparkle icon in the bottom-right corner via alpha compositing: watermarked = a*logo + (1-a)*original. Unlike the Doubao/Jimeng text marks, the sparkle is captured over a pure-black background, where watermarked = a*255 (logo is near-white), so the alpha reads directly off the capture (alpha = max(R,G,B)/255) -- no background fit needed. This is the "golden" capture case.

What the captures confirmed (2026-05-31)

  • The sparkle at a 2048-wide image is 96x96 px (width_frac ~0.047), bottom-right, margins ~0.031, alpha max ~0.51 -- matching the engine's existing 96px asset.
  • Our own controlled capture matches the previously third-party-sourced gemini_bg_96.png to NCC 0.9998, so the bundled asset is validated and now reproducible from our own capture.

How to capture (image-edit path)

For each solid-colour seed (seeds/seed_{black,gray,white}_2048.png, gitignored):

  1. Open Gemini image generation, image-edit / reference mode, upload the seed.
  2. Prompt: Recreate this image exactly as it is, keep it identical, do not add or change anything
  3. Download the ORIGINAL output (not a screenshot). Do not crop / edit / re-save.

Black is the key one (sparkle on black -> exact alpha). Gray/white cross-check.

Naming, drop into captures/

gemini_black_2048.png   # the key capture (sparkle on black)
gemini_gray_2048.png
gemini_white_2048.png

The solid captures are committed (content-free). The synthetic seeds/ and any real-content gemini_content_*.png validation download are gitignored (local-only). Rebuild the assets with:

uv run python scripts/visible_alpha_solve.py gemini   # or: all