Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -8,6 +8,7 @@ import gradio as gr
|
|
| 8 |
from scipy.integrate import quad_vec
|
| 9 |
from math import tau
|
| 10 |
from PIL import Image
|
|
|
|
| 11 |
|
| 12 |
|
| 13 |
def fourier_transform_drawing(input_image, frames, coefficients, img_size):
|
|
@@ -55,18 +56,41 @@ def fourier_transform_drawing(input_image, frames, coefficients, img_size):
|
|
| 55 |
num_points = 1000 # how many points to use for numerical integration
|
| 56 |
t_values = np.linspace(0, tau, num_points)
|
| 57 |
t_list = np.linspace(0, tau, len(xs))
|
| 58 |
-
|
| 59 |
-
def compute_cn(
|
| 60 |
"""
|
| 61 |
Integrate the contour along axis (-1) using the composite trapezoidal rule.
|
| 62 |
https://numpy.org/doc/stable/reference/generated/numpy.trapz.html#r7aa6c77779c0-2
|
| 63 |
"""
|
| 64 |
-
|
| 65 |
-
coef = np.trapz(f_exp, t_values) / tau
|
| 66 |
return coef
|
| 67 |
-
|
|
|
|
|
|
|
|
|
|
| 68 |
N = coefficients
|
| 69 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
|
| 71 |
# animate the drawings
|
| 72 |
fig, ax = plt.subplots()
|
|
@@ -102,23 +126,6 @@ def fourier_transform_drawing(input_image, frames, coefficients, img_size):
|
|
| 102 |
draw_y.append(center[1])
|
| 103 |
drawing.set_data(draw_x[:i+1], draw_y[:i+1])
|
| 104 |
|
| 105 |
-
# def animate(i, coefs, time):
|
| 106 |
-
# t = time[i]
|
| 107 |
-
# center = (0, 0)
|
| 108 |
-
# theta = np.linspace(0, tau, 80)
|
| 109 |
-
# for _, (c, fr) in enumerate(coefs):
|
| 110 |
-
# c = c * np.exp(1j*(fr * tau * t))
|
| 111 |
-
# r = np.linalg.norm(c)
|
| 112 |
-
# x, y = center[0] + r * np.cos(theta), center[1] + r * np.sin(theta)
|
| 113 |
-
# circle_lines[_].set_data([center[0], center[0] + np.real(c)], [center[1], center[1] + np.imag(c)])
|
| 114 |
-
# circles[_].set_data(x, y)
|
| 115 |
-
# center = (center[0] + np.real(c), center[1] + np.imag(c))
|
| 116 |
-
|
| 117 |
-
# draw_x.append(center[0])
|
| 118 |
-
# draw_y.append(center[1])
|
| 119 |
-
|
| 120 |
-
# drawing.set_data(draw_x[:i+1], draw_y[:i+1])
|
| 121 |
-
|
| 122 |
drawing_time = 1
|
| 123 |
time = np.linspace(0, drawing_time, num=frames)
|
| 124 |
anim = animation.FuncAnimation(fig, animate, frames=frames, interval=5, fargs=(coefs, time))
|
|
|
|
| 8 |
from scipy.integrate import quad_vec
|
| 9 |
from math import tau
|
| 10 |
from PIL import Image
|
| 11 |
+
from concurrent.futures import ThreadPoolExecutor
|
| 12 |
|
| 13 |
|
| 14 |
def fourier_transform_drawing(input_image, frames, coefficients, img_size):
|
|
|
|
| 56 |
num_points = 1000 # how many points to use for numerical integration
|
| 57 |
t_values = np.linspace(0, tau, num_points)
|
| 58 |
t_list = np.linspace(0, tau, len(xs))
|
| 59 |
+
|
| 60 |
+
def compute_cn(f_exp, n, t_values):
|
| 61 |
"""
|
| 62 |
Integrate the contour along axis (-1) using the composite trapezoidal rule.
|
| 63 |
https://numpy.org/doc/stable/reference/generated/numpy.trapz.html#r7aa6c77779c0-2
|
| 64 |
"""
|
| 65 |
+
coef = np.trapz(f_exp * np.exp(-n * t_values * 1j), t_values) / tau
|
|
|
|
| 66 |
return coef
|
| 67 |
+
|
| 68 |
+
# Pre-compute the interpolated values
|
| 69 |
+
f_exp_precomputed = np.interp(t_values, t_list, xs + 1j * ys)
|
| 70 |
+
|
| 71 |
N = coefficients
|
| 72 |
+
indices = [0] + [j for i in range(1, N + 1) for j in (i, -i)]
|
| 73 |
+
|
| 74 |
+
print("Number of threads used:", os.cpu_count())
|
| 75 |
+
|
| 76 |
+
# Parallelize the computation of coefficients
|
| 77 |
+
with ThreadPoolExecutor() as executor:
|
| 78 |
+
coefs = list(executor.map(lambda n: (compute_cn(f_exp_precomputed, n, t_values), n), indices))
|
| 79 |
+
|
| 80 |
+
# Ensure the zeroth coefficient is computed only once
|
| 81 |
+
coefs = [(coefs[0][0], 0)] + coefs[1:]
|
| 82 |
+
|
| 83 |
+
# def compute_cn(n, t_list, xs, ys):
|
| 84 |
+
# """
|
| 85 |
+
# Integrate the contour along axis (-1) using the composite trapezoidal rule.
|
| 86 |
+
# https://numpy.org/doc/stable/reference/generated/numpy.trapz.html#r7aa6c77779c0-2
|
| 87 |
+
# """
|
| 88 |
+
# f_exp = np.interp(t_values, t_list, xs + 1j * ys) * np.exp(-n * t_values * 1j)
|
| 89 |
+
# coef = np.trapz(f_exp, t_values) / tau
|
| 90 |
+
# return coef
|
| 91 |
+
|
| 92 |
+
# N = coefficients
|
| 93 |
+
# coefs = [(compute_cn(0, t_list, xs, ys), 0)] + [(compute_cn(j, t_list, xs, ys), j) for i in range(1, N+1) for j in (i, -i)]
|
| 94 |
|
| 95 |
# animate the drawings
|
| 96 |
fig, ax = plt.subplots()
|
|
|
|
| 126 |
draw_y.append(center[1])
|
| 127 |
drawing.set_data(draw_x[:i+1], draw_y[:i+1])
|
| 128 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
drawing_time = 1
|
| 130 |
time = np.linspace(0, drawing_time, num=frames)
|
| 131 |
anim = animation.FuncAnimation(fig, animate, frames=frames, interval=5, fargs=(coefs, time))
|