Generative ART
Project description
Table of contents
- Overview
- Installation
- Usage
- Mathematical Details
- Try Samila in Your Browser
- Issues & Bug Reports
- Social Media
- Contribution
- References
- Acknowledgments
- Authors
- License
- Show Your Support
- Changelog
- Code of Conduct
Overview
Samila is a generative art generator written in Python, Samila lets you create images based on many thousand points. The position of every single point is calculated by a formula, which has random parameters. Because of the random numbers, every image looks different.
Open Hub | |
PyPI Counter | |
Github Stars |
Branch | master | dev |
CI |
Code Quality |
Installation
Source code
- Download Version 1.1 or Latest Source
- Run
pip install -r requirements.txt
orpip3 install -r requirements.txt
(Need root access) - Run
python3 setup.py install
orpython setup.py install
(Need root access)
PyPI
- Check Python Packaging User Guide
- Run
pip install samila==1.1
orpip3 install samila==1.1
(Need root access)
Easy install
- Run
easy_install --upgrade samila
(Need root access)
Conda
- Check Conda Managing Package
conda install -c sepandhaghighi samila
(Need root access)
Usage
Magic
>>> import matplotlib.pyplot as plt
>>> from samila import GenerativeImage
>>> g = GenerativeImage()
>>> g.generate()
>>> g.plot()
>>> plt.show()
Basic
>>> 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()
>>> g.seed
188781
>>> plt.show()
Projection
>>> from samila import Projection
>>> g = GenerativeImage(f1, f2)
>>> g.generate()
>>> g.plot(projection=Projection.POLAR)
>>> g.seed
829730
>>> plt.show()
- Supported projections :
RECTILINEAR
,POLAR
,AITOFF
,HAMMER
,LAMBERT
,MOLLWEIDE
andRANDOM
- Default projection is
RECTILINEAR
Marker
>>> from samila import Marker
>>> g = GenerativeImage(f1, f2)
>>> g.generate()
>>> g.plot(marker=Marker.CIRCLE, spot_size=10)
>>> g.seed
448742
>>> plt.show()
- Supported markers :
POINT
,PIXEL
,CIRCLE
,TRIANGLE_DOWN
,TRIANGLE_UP
,TRIANGLE_LEFT
,TRIANGLE_RIGHT
,TRI_DOWN
,TRI_UP
,TRI_LEFT
,TRI_RIGHT
,OCTAGON
,SQUARE
,PENTAGON
,PLUS
,PLUS_FILLED
,STAR
,HEXAGON_VERTICAL
,HEXAGON_HORIZONTAL
,X
,X_FILLED
,DIAMOND
,DIAMON_THIN
,VLINE
,HLINE
andRANDOM
- Default marker is
POINT
Rotation
You can even rotate your art by using rotation
parameter. Enter your desired rotation for the image in degrees and you will have it.
>>> g = GenerativeImage(f1, f2)
>>> g.generate()
>>> g.plot(rotation=45)
- Default rotation is 0
Range
>>> g = GenerativeImage(f1, f2)
>>> g.generate(start=-2*math.pi, step=0.01, stop=0)
>>> g.plot()
>>> g.seed
234752
>>> plt.show()
Color
>>> g = GenerativeImage(f1, f2)
>>> g.generate()
>>> g.plot(color="yellow", bgcolor="black", projection=Projection.POLAR)
>>> g.seed
1018273
>>> plt.show()
-
Supported colors are available in
VALID_COLORS
list -
color
andbgcolor
parameters supported formats:- Color name (example:
color="yellow"
) - RGB/RGBA (example:
color=(0.1,0.1,0.1)
,color=(0.1,0.1,0.1,0.1)
) - Hex (example:
color="#eeefff"
) - Random (example:
color="random"
) - Complement (example:
color="complement", bgcolor="blue"
) - Transparent (example:
bgcolor="transparent"
) - List (example:
color=["black", "#fffeef",...]
)
- Color name (example:
⚠️ Transparent mode is only available for background
⚠️ List mode is only available for color
⚠️ In List mode, the length of this list must be equal to the lengths of data1 and data2
Point Color
You can make your custom color map and use it in Samila
>>> colorarray = [
... [0.7, 0.2, 0.2, 1],
... [0.6, 0.3, 0.2, 1],
... "black",
... [0.4, 0.4, 0.3, 1],
... [0.3, 0.4, 0.4, 1],
... "#ff2561"]
>>> g.generate()
>>> g.seed
454893
>>> g.plot(cmap=colorarray, color=g.data2, projection=Projection.POLAR)
>>> plt.show()
Regeneration
>>> g = GenerativeImage(f1, f2)
>>> g.generate(seed=1018273)
>>> g.plot(projection=Projection.POLAR)
>>> plt.show()
NFT.storage
Upload generated image directly to NFT.storage
>>> g.nft_storage(api_key="YOUR_API_KEY", timeout=5000)
{'status': True, 'message': 'FILE_LINK'}
You can also upload your config/data to nft storage as follows:
>>> g.nft_storage(api_key="API_KEY", upload_config=True)
{'status': {'image': True, 'config':True}, 'message': {'image':'IMAGE_FILE_LINK', 'config':'CONFIG_FILE_LINK'}
or
>>> g.nft_storage(api_key="API_KEY", upload_data=True)
{'status': {'image': True, 'data':True}, 'message': {'image':'IMAGE_FILE_LINK', 'data':'DATA_FILE_LINK'}
- Default timeout is 3000 seconds
Save image
Save generated image
>>> g.save_image(file_adr="test.png")
{'status': True, 'message': 'FILE_PATH'}
Save generated image in higher resolutions
>>> g.save_image(file_adr="test.png", depth=5)
{'status': True, 'message': 'FILE_PATH'}
Save data
Save generated image data
>>> g.save_data(file_adr="data.json")
{'status': True, 'message': 'FILE_PATH'}
So you can load it into a GenerativeImage
instance later by
>>> g = GenerativeImage(data=open('data.json', 'r'))
Data structure:
{
"plot": {
"projection": "polar",
"bgcolor": "black",
"color": "snow",
"spot_size": 0.01
},
"matplotlib_version": "3.0.3",
"data1": [
0.3886741692042526,
22.57390286376703,
-0.1646310981668766,
66.23632344600155
],
"data2": [
-0.14588750183600108,
20.197945942677833,
0.5485453260942901,
-589.3284610518896
]
}
Save config
Save generated image config. It contains string formats of functions which is also human readable.
>>> g.save_config(file_adr="config.json")
{'status': True, 'message': 'FILE_PATH'}
So you can load it into a GenerativeImage
instance later by
>>> g = GenerativeImage(config=open('config.json', 'r'))
Config structure:
{
"matplotlib_version": "3.0.3",
"generate": {
"seed": 379184,
"stop": 3.141592653589793,
"step": 0.01,
"start": -3.141592653589793
},
"f2": "random.uniform(-1,1)*math.cos(x*(y**3))+random.uniform(-1,1)*math.ceil(y-x)",
"f1": "random.uniform(-1,1)*math.ceil(y)-random.uniform(-1,1)*y**2+random.uniform(-1,1)*abs(y-x)",
"plot": {
"color": "snow",
"bgcolor": "black",
"projection": "polar",
"spot_size": 0.01
}
}
Mathematical details
Samila is simply a transformation between a square-shaped space from the Cartesian coordinate system to any arbitrary coordination like Polar coordinate system.
Example
We have set of points in the first space (left square) which can be defined as follow:
And below functions are used for transformation:
>>> 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
here we use Projection.POLAR
so later space will be the polar space and we have:
>>> g = GenerativeImage(f1, f2)
>>> g.generate(seed=10)
>>> g.plot(projection=Projection.POLAR)
Try Samila in your browser!
Samila can be used online in interactive Jupyter Notebooks via the Binder or Colab services! Try it out now! :
- Check
examples
folder
Issues & bug reports
Just fill an issue and describe it. We'll check it ASAP! or send an email to info@samila.site.
- Please complete the issue template
You can also join our discord server
Social media
References
1- Schönlieb, Carola-Bibiane, and Franz Schubert. "Random simulations for generative art construction–some examples." Journal of Mathematics and the Arts 7.1 (2013): 29-39.
2- Create Generative Art with R
3- NFT.storage : Free decentralized storage and bandwidth for NFTs
Acknowledgments
This project was funded through the Next Step Microgrant, a program established by Protocol Labs.
Show your support
Star this repo
Give a ⭐️ if this project helped you!
Donate to our project
If you do like our project and we hope that you do, can you please support us? Our project is not and is never going to be working for profit. We need the money just so we can continue doing what we do ;-) .
Bitcoin
1KtNLEEeUbTEK9PdN6Ya3ZAKXaqoKUuxCyEthereum
0xcD4Db18B6664A9662123D4307B074aE968535388Litecoin
Ldnz5gMcEeV8BAdsyf8FstWDC6uyYR6pgZDoge
DDUnKpFQbBqLpFVZ9DfuVysBdr249HxVDhTron
TCZxzPZLcJHr2qR3uPUB1tXB6L3FDSSAx7Ripple
rN7ZuRG7HDGHR5nof8nu5LrsbmSB61V1qqBinance Coin
bnb1zglwcf0ac3d0s2f6ck5kgwvcru4tlctt4p5qefTether
0xcD4Db18B6664A9662123D4307B074aE968535388Dash
Xd3Yn2qZJ7VE8nbKw2fS98aLxR5M6WUU3sStellar
GALPOLPISRHIYHLQER2TLJRGUSZH52RYDK6C3HIU4PSMNAV65Q36EGNLZilliqa
zil1knmz8zj88cf0exr2ry7nav9elehxfcgqu3c5e5Coffeete
Gitcoin
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
Unreleased
1.1 - 2023-04-05
Added
__version__
attributepython_version
attributeget_python_version
functionRANDOM_EQUATION_MIN_COMPLEXITY
parameterRANDOM_EQUATION_FOF_MAX_DEPTH
parameterRANDOM_EQUATION_FOF_MIN_DEPTH
parameterrotate
function
Changed
rotation
parameter added toplot
methodtimeout
parameter added tonft_storage
methodload_config
function modifiednft_storage_upload
function modified- Random mode modified
RANDOM_EQUATION_GEN_COMPLEXITY
parameter renamed toRANDOM_EQUATION_MAX_COMPLEXITY
README.md
updated
1.0 - 2022-12-14
Added
Marker
enumget_data
functionget_config
function
Changed
marker
parameter added toplot
methodupload_data
parameter added tonft_storage
methodupload_config
parameter added tonft_storage
methodgenerate
method optimized- Test system modified
README.md
updatedPython 3.11
added totest.yml
plot
method warning bug fixed- Random mode modified
Removed
fill_data
function
0.9 - 2022-09-28
Added
- Anaconda workflow
Changed
README.md
updatedCODE_OF_CONDUCT.md
updateddemo.ipynb
updatedcmap
parameter added toplot
method- Random mode modified
- Test system modified
generate
method optimizedsamila_help
function updatedload_data
andload_config
functions error handling updated
0.8 - 2022-06-01
Added
INVALID_COLOR_TYPE_ERROR
errorCOLOR_NOT_FOUND_WARNING
warningBOTH_COLOR_COMPLEMENT_WARNING
warningset_background
functionis_valid_color
functioncolor_complement
functionselect_color
function
Changed
- Transparent mode support for
bgcolor
parameter - Random mode modified
- Complementary color support for
color
andbgcolor
parameters filter_color
function modified
0.7 - 2022-05-04
Added
fill_data
functionrandom_hex_color_gen
functioncolor
,bgcolor
andprojection
parameters random mode
Changed
- Calculation warning added to
generate
method - Hex color support for
color
andbgcolor
parameters - Test system modified
- Random mode modified
filter_color
function modifiedfilter_projection
function modifiedis_same_data
function modifiedREADME.md
updated
0.6 - 2022-04-13
Added
save_params_filter
function
Changed
__del__
method updatedmessage
field changed insave_fig_file
functionmessage
field changed insave_config_file
functionmessage
field changed insave_data_file
functionmessage
field changed innft_storage_upload
functiondepth
section added to config/data filelinewidth
parameter added toplot
methodlinewidth
parameter added toplot_params_filter
function- Random mode modified
README.md
updated
0.5 - 2022-03-21
Added
__del__
method- Demo notebook
Changed
depth
parameter added tonft_storage
methoddepth
parameter added tosave_fig_buf
functionalpha
parameter added toplot
methodalpha
parameter added toplot_params_filter
function- Random mode modified
README.md
updated
0.4 - 2022-01-13
Added
PLOT_DATA_ERROR
error message_GI_initializer
functiongenerate_params_filter
functionplot_params_filter
functionfilter_size
functionsave_config
methodload_config
functionsave_config_file
functionsamilaConfigError
classsamilaPlotError
classfilter_float
function- Random equations mode
function1_str
attributefunction2_str
attribute
Changed
README.md
updatedplot
section added to data fileedgecolor
changed toc
inplot
methodconfig
parameter added to GenerativeImage__init__
filter_projection
function edited- Test system updated
Removed
NO_FUNCTION_ERROR
error messageDATA_PARSING_ERROR
error messageJUST_DATA_WARNING
warning message
0.3 - 2021-11-10
Added
- Discord channel
load_data
functionsave_data_file
functionsave_data
method
Changed
data
parameter added to GenerativeImage__init__
methoddepth
parameter added tosave_image
methoddepth
parameter added tosave_fig_file
functionsave_image
andnft_storage
methods background bug fixedREADME.md
updated- Test system updated
Python 3.10
added totest.yml
0.2 - 2021-10-14
Added
dependabot.yml
requirements-splitter.py
samila_help
functiontest.py
function_test.py
overall_test.py
nft_upload_test.py
is_same_data
functionsave_image
method
Changed
dev-requirements.txt
updatedREADME.md
updated__main__.py
updated- Test system updated
nft_storage
method updated
0.1 - 2021-09-30
Added
GenerativeImage
classplot
methodgenerate
methodnft_storage
method
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file samila-1.1.tar.gz
.
File metadata
- Download URL: samila-1.1.tar.gz
- Upload date:
- Size: 25.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3231e06cd11f6a63850a249fec232e2b9ef972d802713a295a93ecc10299c4a6 |
|
MD5 | e49ef64f3b64d558b9ce78229c46486c |
|
BLAKE2b-256 | 58596123eb4f09dee7761d8aff92b64c9aa6d09111791695b9f4d8c27a7dac2b |
File details
Details for the file samila-1.1-py3-none-any.whl
.
File metadata
- Download URL: samila-1.1-py3-none-any.whl
- Upload date:
- Size: 20.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4593b936cac65041e42c463746c0d8886e63d365155c7e196629c261143d483a |
|
MD5 | 2ecc4ae02559972861aaef1bf9661fce |
|
BLAKE2b-256 | 11141eb8f489649362836f44b71d254cff67554a1dd99e31ae9aaf6b0235a2f1 |