Реализация серии Фурье не может приближаться к форме БэтменаPython

Программы на Python
Ответить
Anonymous
 Реализация серии Фурье не может приближаться к форме Бэтмена

Сообщение Anonymous »

Я попытался внедрить формулу, из которой можно было рассчитать коэффициенты серии Фурье. (Я использовал видео 3B1B об этом: видео) и написание кода для этого, моим первым предметом для тестирования был единственный контур логотипа Бэтмена, я сначала снимаю бинарную картину логотипа Бэтмена и использую алгоритм марширующих квадратов, чтобы найти его контур. После этого я спасаю значения и получаю эти результаты:
Изображение

А вот код, реализующий это (Fourier_Coefficients.py):

Код: Выделить всё

import numpy as np

def calculate_Fourier(points, num_coefficients):
complex_points = []
for point in points:
complex_points.append(point[0] + 1j * point[1])

t = np.linspace(0, 1, len(complex_points), endpoint=False)

c_k = np.zeros(num_coefficients, dtype=np.complex128)

for i in range(num_coefficients):
c_k[i] = np.sum(complex_points * np.exp(-2j * np.pi * i * t) * t[1])

return c_k
(ПРИМЕЧАНИЕ: для этого кода t1 по сути представляет собой deltaT, поскольку он равен 1/len(complex_points)
И теперь, на следующем слайде я анимирую весь процесс, где я также написал дополнительный фрагмент кода для создания GIF-изображения. Если бы моя реализация была правильной, создание формы Бэтмена не должно было бы вызвать никаких затруднений, но мы можем наблюдать действительно странные явления в GIF-изображении.
это это код фрагмент этой части
import numpy as np
import matplotlib.pyplot as plt
import imageio
from Fourier_Coefficients import calculate_Fourier
from Countour_Classifier import contours

# List to store file names for GIF creation
png_files = []

# Generate plots iteratively
for i in range(len(contours[0])):

contour_coefficients = []

for contour in contours:
contour_coefficients.append(calculate_Fourier(contour, i))

# Fourier coefficients (complex numbers) and frequencies
coefficients = contour_coefficients[0] # First contour
frequencies = np.arange(len(coefficients))

# Time parameters
t = np.linspace(0, 1, len(coefficients)) # One period
curve = np.zeros(len(t), dtype=complex)

# Use the first (i + 1) coefficients
for j in range(len(coefficients)):
c, f = coefficients[j], frequencies[j]
curve += c * np.exp(1j * 2 * np.pi * f * t)

# Plotting
plt.figure(figsize=(8, 8))
plt.plot(curve.real, curve.imag, label="Trajectory", color="blue")
plt.scatter(0, 0, color="black", label="Origin")
plt.axis("equal")
plt.title(f"Fourier Series with {i + 1} Coefficients")
plt.xlabel("Real Part (X)")
plt.ylabel("Imaginary Part (Y)")
plt.legend()
plt.text(-0.5, -0.5, f"Using {i + 1} coefficients", fontsize=12, color="red")

# Save the figure as a PNG file
filename = f"fourier_{i + 1}_coefficients.png"
plt.savefig(filename)
plt.close()

# Append the file name to the list
png_files.append(filename)

# Create a GIF from the PNG files
gif_filename = "fourier_series.gif"
with imageio.get_writer(gif_filename, mode='I', duration=0.5) as writer:
for filename in png_files:
image = imageio.imread(filename)
writer.append_data(image)

print("Plots saved as PNG files and GIF created as 'fourier_series.gif'.")
< /code>
Теперь это результат
gif < /p>
наблюдение #1 < /strong>
Когда число коэффициентов 0, 1, 2 или 3 он ничего не рисует.
наблюдение #2

Повышение номера коэффициентов, мы Получите шаткую круговую форму, где нижняя часть изображения немного более идентична оригинальной, но наносится на его крылья
наблюдение № 3 < /p>
Когда мы приближаемся к LEN (Complex_Numbers), изменяется ситуация, и мы получаем эти странные формы, отличающиеся от круговой < /p>
наблюдение # 4
Когда мы превосходят LEN (Complex_Number), он рисует случайный гиббера > < /p>
Когда изменяется количество подразделений внутри значения t в коде animation.py, мы получаем совершенно разные изображения. 1
Вот фактические данные .txt, предоставленные для дальнейшего тестирования. >
после всей этой информации, вы можете помочь мне помочь мне, что не так с моим кодом < /p>

Подробнее здесь: https://stackoverflow.com/questions/793 ... tman-shape
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»