-
Notifications
You must be signed in to change notification settings - Fork 0
/
background_generator.py
89 lines (69 loc) · 2.43 KB
/
background_generator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import cv2
import math
import os
import random as rnd
import numpy as np
from PIL import Image, ImageDraw, ImageFilter
def gaussian_noise(height, width):
"""
Create a background with Gaussian noise (to mimic paper)
"""
# We create an all white image
image = np.ones((height, width)) * 255
# We add gaussian noise
cv2.randn(image, 235, 10)
return Image.fromarray(image).convert("RGBA")
def plain_white(height, width):
"""
Create a plain white background
"""
return Image.new("L", (width, height), 255).convert("RGBA")
def quasicrystal(height, width):
"""
Create a background with quasicrystal (https://en.wikipedia.org/wiki/Quasicrystal)
"""
image = Image.new("L", (width, height))
pixels = image.load()
frequency = rnd.random() * 30 + 20 # frequency
phase = rnd.random() * 2 * math.pi # phase
rotation_count = rnd.randint(10, 20) # of rotations
for kw in range(width):
y = float(kw) / (width - 1) * 4 * math.pi - 2 * math.pi
for kh in range(height):
x = float(kh) / (height - 1) * 4 * math.pi - 2 * math.pi
z = 0.0
for i in range(rotation_count):
r = math.hypot(x, y)
a = math.atan2(y, x) + i * math.pi * 2.0 / rotation_count
z += math.cos(r * math.sin(a) * frequency + phase)
c = int(255 - round(255 * z / rotation_count))
pixels[kw, kh] = c # grayscale
return image.convert("RGBA")
def image(height, width, image_dir):
"""
Create a background with a image
"""
images = os.listdir(image_dir)
if len(images) > 0:
pic = Image.open(
os.path.join(image_dir, images[rnd.randint(0, len(images) - 1)])
)
if pic.size[0] < width:
pic = pic.resize(
[width, int(pic.size[1] * (width / pic.size[0]))], Image.ANTIALIAS
)
if pic.size[1] < height:
pic = pic.resize(
[int(pic.size[0] * (height / pic.size[1])), height], Image.ANTIALIAS
)
if pic.size[0] == width:
x = 0
else:
x = rnd.randint(0, pic.size[0] - width)
if pic.size[1] == height:
y = 0
else:
y = rnd.randint(0, pic.size[1] - height)
return pic.crop((x, y, x + width, y + height))
else:
raise Exception("No images where found in the images folder!")