![](https://habrastorage.org/getpro/habr/upload_files/57a/436/85c/57a43685c12fcba3e63fb2ae58fbf7b6.jpg)
Содержание:
Введение
Установка | Запуск без установки
Работа с библиотекой Samila
Полезные ссылки
Введение
Samila - библиотека для создания генеративного искусства, написанная на языке программирования Python. В данный момент Samila позволяет создавать только статичные изображения. По заверению разработчиков, возможность анимации появится в ближайшее время.
В основе механизма генерации изображений библиотеки Samila лежит идея о преобразовании пространства квадратной формы, из Декартовой системы координат, в любую иную систему, например, такую как Полярная система координат. Samila позволяет создавать изображения, основанные на тысячах точек. Положение каждой отдельной точки рассчитывается по формуле со случайными параметрами. Из-за случайных чисел каждое изображение выглядит по-разному.
![](https://habrastorage.org/getpro/habr/upload_files/cf5/9da/52a/cf59da52ad36248e4b9a3962fe50e90a.jpg)
Установка | Запуск без установки
Для работы Samila необходима версия Python не ниже 3.5.
Установка библиотеки:
pip install samila
Запуск без установки:
Поработать с библиотекой можно и без установки на локальный компьютер. Например, в Google Colab. Я накидал несколько примеров, вот по этой ссылке. При желании можно скопировать себе(кнопка "Copy to Drive", если вы залогинены под своим Google аккаунтом).
Работа с библиотекой Samila
Быстрый старт. Генерация случайного изображения без каких-либо входных данных:
import matplotlib.pyplot as plt
from samila import GenerativeImage
g = GenerativeImage()
g.generate()
g.plot()
plt.show()
![](https://habrastorage.org/getpro/habr/upload_files/e90/0e9/08d/e900e908d93a230467db095e43c740d8.jpg)
С сохранением в PNG:
from samila import GenerativeImage
g = GenerativeImage()
g.generate()
g.plot()
g.save_image(file_adr="test.png")
Если нужно сгенерировать заданное количество случайных изображений, чтобы было из чего выбрать:
from samila import GenerativeImage
for i in range(10):
g = GenerativeImage()
g.generate()
g.plot()
img_name = str(i+1) + "_test.png"
g.save_image(file_adr=img_name)
Основа для создания красивых изображений. Добавляем условий:
import matplotlib.pyplot as plt
from samila import GenerativeImage
import random
import math
def f1(x, y):
result = random.uniform(-1,1) * x**2 - math.sin(y**2) + abs(y-x)
return result
def f2(x, y):
result = random.uniform(-1,1) * y**3 - math.cos(x**2) + 2*x
return result
g = GenerativeImage(f1, f2)
g.generate()
g.plot()
plt.show()
![](https://habrastorage.org/getpro/habr/upload_files/afe/ea6/79c/afeea679c84bea62cd86acb439559050.jpg)
Проекция:
import matplotlib.pyplot as plt
from samila import GenerativeImage
import random
import math
from samila import Projection
def f1(x, y):
result = random.uniform(-1,1) * x**2 - math.sin(y**2) + abs(y-x)
return result
def f2(x, y):
result = random.uniform(-1,1) * y**3 - math.cos(x**2) + 2*x
return result
g = GenerativeImage(f1, f2)
g.generate()
g.plot(projection=Projection.POLAR)
plt.show()
![](https://habrastorage.org/getpro/habr/upload_files/c4e/401/aa7/c4e401aa7efd7b6e0fa2a7b9a64c5bc8.jpg)
По умолчанию вид проекции(projection): RECTILINEAR
Поддерживаемые виды проекций: RECTILINEAR, POLAR, AITOFF, HAMMER, LAMBERT и MOLLWEIDE:
![](https://habrastorage.org/getpro/habr/upload_files/a3f/e83/b5e/a3fe83b5e3ced106385c4886aff91e7a.gif)
Диапазон:
import matplotlib.pyplot as plt
from samila import GenerativeImage
import random
import math
from samila import Projection
def f1(x, y):
result = random.uniform(-1,1) * x**2 - math.sin(y**2) + abs(y-x)
return result
def f2(x, y):
result = random.uniform(-1,1) * y**3 - math.cos(x**2) + 2*x
return result
g = GenerativeImage(f1, f2)
g.generate(start=-2*math.pi, step=0.01, stop=0)
g.plot()
plt.show()
![](https://habrastorage.org/getpro/habr/upload_files/e6e/711/736/e6e711736bbaa68f0aed90e6891e8067.jpg)
Цвет:
import matplotlib.pyplot as plt
from samila import GenerativeImage
import random
import math
from samila import Projection
def f1(x, y):
result = random.uniform(-1,1) * x**2 - math.sin(y**2) + abs(y-x)
return result
def f2(x, y):
result = random.uniform(-1,1) * y**3 - math.cos(x**2) + 2*x
return result
g = GenerativeImage(f1, f2)
g.generate()
g.plot(color="yellow", bgcolor="black", projection=Projection.POLAR)
plt.show()
![](https://habrastorage.org/getpro/habr/upload_files/2c6/174/b13/2c6174b135abfdef059280e0b864ca95.jpg)
Регенерация(параметр seed):
import matplotlib.pyplot as plt
from samila import GenerativeImage
import random
import math
from samila import Projection
def f1(x, y):
result = random.gauss(0, 1) * math.sin(y)+ (x + y) * random.uniform(-1, 1)
return result
def f2(x, y):
result = random.uniform(-1, 1) * y * x + math.cos(x ** 2) + random.gauss(0, 1)
return result
g = GenerativeImage(f1, f2)
g.generate(seed=300)
g.plot(color="red", bgcolor="black", projection=Projection.POLAR)
plt.show()
![](https://habrastorage.org/getpro/habr/upload_files/3b0/e34/2da/3b0e342da58a86e58f9099ca103a7256.jpg)
Помимо всего вышеперечисленного, Samila также умеет:
Сохранять данные о полученных изображениях в формате JSON
Воспроизводить изображения на основе ранее сохранённых данных
Сохранять изображения в более высоком разрешении
Загружать изображения напрямую в NFT.storage
Полезные ссылки
Google Colab с примерами
Комментарии (4)
z0ic
01.02.2022 15:41Похоже на каустику.
iShrimp
01.02.2022 19:19Это и есть каустики, возникающие при проецировании на плоскость гладких многообразий.
И чтобы они получились красивее, их нужно семплировать не случайным шумом и не равномерной сеткой (как здесь), а адаптивно, с учётом локальных производных (как в данной работе).
pathofpw
Спасибо! Приятно было погенерировать красивые штуки.