Содержание:

  • Введение

  • Установка | Запуск без установки

  • Работа с библиотекой Samila

  • Полезные ссылки

Введение

Samila - библиотека для создания генеративного искусства, написанная на языке программирования Python. В данный момент Samila позволяет создавать только статичные изображения. По заверению разработчиков, возможность анимации появится в ближайшее время.

В основе механизма генерации изображений библиотеки Samila лежит идея о преобразовании пространства квадратной формы, из Декартовой системы координат, в любую иную систему, например, такую как Полярная система координат. Samila позволяет создавать изображения, основанные на тысячах точек. Положение каждой отдельной точки рассчитывается по формуле со случайными параметрами. Из-за случайных чисел каждое изображение выглядит по-разному.

Установка | Запуск без установки

Для работы 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()

С сохранением в 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()

Проекция:

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()

По умолчанию вид проекции(projection): RECTILINEAR

Поддерживаемые виды проекций: RECTILINEAR, POLAR, AITOFF, HAMMER, LAMBERT и MOLLWEIDE:

Диапазон:

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()

Цвет:

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()

Регенерация(параметр 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()

Помимо всего вышеперечисленного, Samila также умеет:

  • Сохранять данные о полученных изображениях в формате JSON

  • Воспроизводить изображения на основе ранее сохранённых данных

  • Сохранять изображения в более высоком разрешении

  • Загружать изображения напрямую в NFT.storage

Полезные ссылки

Комментарии (4)


  1. pathofpw
    01.02.2022 12:05
    +1

    Спасибо! Приятно было погенерировать красивые штуки.


  1. z0ic
    01.02.2022 15:41

    Похоже на каустику.


    1. iShrimp
      01.02.2022 19:19

      Это и есть каустики, возникающие при проецировании на плоскость гладких многообразий.

      И чтобы они получились красивее, их нужно семплировать не случайным шумом и не равномерной сеткой (как здесь), а адаптивно, с учётом локальных производных (как в данной работе).


  1. Sergei_Erjemin
    03.02.2022 12:13

    Класс. Еще бы понять куда это на практике присменить...