Python и Samila. Делаем красиво

57a43685c12fcba3e63fb2ae58fbf7b6.jpg

Содержание:

  • Введение

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

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

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

Введение

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

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

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

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

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

c4e401aa7efd7b6e0fa2a7b9a64c5bc8.jpg

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

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

image-loader.svg

Диапазон:

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

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

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

3b0e342da58a86e58f9099ca103a7256.jpg

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

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

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

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

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

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

© Habrahabr.ru