Подсказки: удаление водяных знаков Gemini
Что удаляем
Gemini (Nano Banana / Gemini Flash Image) ставит на картинки два элемента:
- SynthID-звезда — полупрозрачная звезда в правом нижнем углу, наложена через alpha blending
- V-шеврон (крылья) — видимый логотип-галочка под звездой, впечатан в пиксели напрямую
Они требуют разных подходов.
Инструменты
- Gemini-Watermark-Remover-Python — github.com/VimalMollyn/Gemini-Watermark-Remover-Python
- Маски (bg_96.png, bg_48.png) — из journey-ad/gemini-watermark-remover — свежее и точнее, чем штатные
Проблема 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
- Взять образец фона слева от звезды (x: star_x - 80 .. star_x - 20)
- Вычислить порог:
median(фон) + 20 - Все пиксели ярче порога в зоне шеврона → заменить на цвет фона
Проблема 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 в редакторе или перегенерация картинки