Created
November 12, 2018 18:48
-
-
Save veirus/e711c626e74ceb48a7485ec96fac7728 to your computer and use it in GitHub Desktop.
Photo effects
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from PIL import Image | |
import numpy as np | |
import matplotlib.pyplot as pyplot | |
import pandas as pd | |
from datetime import datetime | |
import seaborn as sns | |
ini = datetime.now() | |
fle = "Cosmonaut" # File name | |
img = Image.open("C:\\Users\\Rober\\Desktop\\"+fle+".png") # Works only with png files | |
def conv(arr) : # convertion functions - treats the image array to be used in Seaborn scatteplot func. | |
mtz = pd.DataFrame() | |
XL = [] | |
YL = [] | |
SL = [] | |
for y in range(0,len(arr)) : | |
for x in range(0,len(arr[0])) : | |
YL.append(y) | |
XL.append(x) | |
SL.append(arr[y][x]) | |
mtz["Y"] = XL | |
mtz["X"] = YL | |
mtz["S"] = SL | |
return mtz | |
h = img.size[0] | |
v = img.size[1] | |
R,G,B = img.split() | |
s = 3 # size of the block(resolution) - smaller number equals to longer time processing | |
rsizeArr_R = np.asarray(R.resize((int(h/s),int(v/s)))) # Red channel | |
rsizeArr_G = np.asarray(G.resize((int(h/s),int(v/s)))) # Green channel | |
rsizeArr_B = np.asarray(B.resize((int(h/s),int(v/s)))) # Blue channel | |
r = 100 # proportion, [higher/lower] number equals to [smaller/larger] image | |
bkg = "black" # background color | |
pyplot.rcParams['figure.facecolor'] = bkg | |
pyplot.rcParams['savefig.facecolor'] = bkg | |
fig, g = pyplot.subplots(figsize=(h/r,v/r)) | |
pyplot.subplots_adjust(top = 1.00, left = 0.00, right = 1.00, bottom = 0.00) | |
g.axis("off") | |
#Calling the conversion function | |
Arr_r = conv(rsizeArr_R) | |
Arr_b = conv(rsizeArr_B) | |
Arr_g = conv(rsizeArr_G) | |
# 3 color plotting block | |
sz = (1,9) # minimum and maximum size of the marker | |
sns.scatterplot(x="Y", y="X",alpha = 0.99, | |
hue="S", size="S",legend = False, | |
palette="Oranges_r", sizes=sz, | |
data=Arr_r, marker = "8", edgecolor=None) | |
sz = (1,6) | |
sns.scatterplot(x="Y", y="X",alpha = 0.60, | |
hue="S", size="S",legend = False, | |
palette="Blues_r", sizes=sz, | |
data=Arr_b, marker = "8", edgecolor=None) | |
sz = (0.5,4) | |
sns.scatterplot(x="Y", y="X",alpha = 0.15, | |
hue="S", size="S",legend = False, | |
palette="Greens_r", sizes=sz, | |
data=Arr_g, marker = "8", edgecolor=None) | |
# This block was set to reproduce more or less the original image, but it is a trial and error process. | |
# The first color (red channel) has a stronger size marker range and alpha (transparency), the others : | |
# the color after is plot on top of the previous one, so must be compensated. | |
# | |
# You can try other backgoung color, block size, palletes, sizes, markers, or even how many channels to | |
# plot - the imagination is the limit. | |
# | |
# For reasosn that I do not know, the marker 's' (square) "leakes" over the plot so I avoid it. | |
# | |
# Put a time counting that might be useful when you test different resolutions (block sizes). | |
pyplot.grid(False) | |
pyplot.ylim(int(v/s),-1) | |
pyplot.xlim(-1,int(h/s)) | |
pyplot.show() | |
fim = datetime.now() | |
print(fim-ini) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment