Перейти к содержанию

Подсказки: удаление водяных знаков Gemini

Что удаляем

Gemini (Nano Banana / Gemini Flash Image) ставит на картинки два элемента:

  1. SynthID-звезда — полупрозрачная звезда в правом нижнем углу, наложена через alpha blending
  2. V-шеврон (крылья) — видимый логотип-галочка под звездой, впечатан в пиксели напрямую

Они требуют разных подходов.


Инструменты


Проблема 1: маска слабее реального водяного знака

Маска (bg_96.png) снята с одной силы водяного знака, но Gemini использует минимум две:

Сила Коэффициент Какие картинки
Стандартная ~1.0 Часть генераций
Усиленная ~1.45–1.50 Большинство генераций
Сильная ~1.9+ Редко

Решение: автодетект коэффициента. Берём область под маской, где фон тёмный. Если фон ≈ 0, то alpha ≈ яркость_пикселя / 255. Сравниваем с маской → получаем масштаб.

ratios = (region_brightness / 255.0) / mask_alpha
scale = median(ratios)  # обычно ~1.0 или ~1.48
scaled_alpha = clip(mask_alpha * scale, 0, 0.99)

Проблема 2: V-шеврон не удаляется маской

Шеврон — не alpha-overlay, а прямая отрисовка в пиксели. Reverse alpha blending его не берёт.

Решение: inpainting — замена ярких пикселей цветом фона.

Где находится шеврон

  • По вертикали: от star_y + logo_size - 50 до star_y + logo_size + 35 (крылья начинаются внутри звезды)
  • По горизонтали: ±55px от центра звезды
  • Яркость: 100–195 на тёмном фоне (5–15)

Порядок действий

Важно: сначала удалить звезду, потом инпейнтить шеврон.

Если сделать наоборот: - Инпейнт заменит шеврон на тёмные пиксели - Reverse alpha blending увидит тёмные пиксели под маской звезды и сделает их ещё темнее или инвертирует → артефакты

Алгоритм inpainting

  1. Взять образец фона слева от звезды (x: star_x - 80 .. star_x - 20)
  2. Вычислить порог: median(фон) + 20
  3. Все пиксели ярче порога в зоне шеврона → заменить на цвет фона

Проблема 3: пиксели растекаются за маску

Маска 96×96, но реальный водяной знак чуть шире. По краям остаются слабые следы.

Решение: padding — расширить область обработки на 16px во все стороны. Для пикселей в зоне padding оценивать alpha по яркости:

excess = pixel_brightness - local_background
if excess > 10:
    alpha = excess / 255.0 * scale

Нижний padding не нужен — там шеврон, он обрабатывается отдельно.


Позиция водяного знака

Gemini ставит водяной знак в правый нижний угол:

Размер изображения Логотип Отступ от края
Оба измерения > 1024 96×96 64px
Иначе 48×48 32px
x = width - margin - logo_size
y = height - margin - logo_size

Общий pipeline

images-orig/*.png
  │
  ├─ 1. Reverse alpha blending (звезда)
  │     • Загрузить маску bg_96/bg_48
  │     • Автодетект scale
  │     • Применить: original = (watermarked - alpha * 255) / (1 - alpha)
  │     • +padding 16px (кроме низа)
  │
  ├─ 2. Inpainting (шеврон)
  │     • Зона: bottom-center звезды ±55px, -50..+35px по вертикали
  │     • Порог: bg_median + 20
  │     • Замена на цвет фона
  │
  └─ images/*.png (чистые)

Чеклист после обработки

  • [ ] Звезда не видна в правом нижнем углу
  • [ ] V-шеврон не виден под звездой
  • [ ] Нет ярких артефактов в зоне водяного знака
  • [ ] Нет тёмного прямоугольника (over-inpainting)
  • [ ] Основное изображение не повреждено

Если остаются следы

  • Увеличить padding (16 → 20)
  • Понизить порог inpainting (20 → 15)
  • Расширить зону шеврона
  • Для упорных случаев: ручной inpaint в редакторе или перегенерация картинки