Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Воган Ли - Python для хакеров (Библиотека программиста) - 2023.pdf
Скачиваний:
5
Добавлен:
07.04.2024
Размер:
14.76 Mб
Скачать

382      Решения для практических проектов

Измерение продолжительности экзопланетного дня

practice_length_of_day.py

"""Считываем изображения, вычисляем среднюю интенсивность, рисуем график изменения относительной интенсивности во времени."""

import os

from statistics import mean import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

from scipy import signal # См. главу 1 для установки scipy.

#Переключаемся на каталог с изображениями. os.chdir('br549_pixelated')

images = sorted(os.listdir()) intensity_samples = []

#Конвертируем изображения в полутоновые и создаем список средних значений интенсивности.

for image in images:

img = cv.imread(image, cv.IMREAD_GRAYSCALE) intensity = img.mean() intensity_samples.append(intensity)

#Генерируем список значений относительной интенсивности. rel_intensity = intensity_samples[:]

max_intensity = max(rel_intensity) for i, j in enumerate(rel_intensity):

rel_intensity[i] = j / max_intensity

#Рисуем график значений интенсивности относительно номера шага симуляции (альтернатива времени).

plt.plot(rel_intensity, color='red', marker='o', linestyle='solid', linewidth=2, markersize=0, label='Relative Intensity')

plt.legend(loc='upper center')

plt.title('Exoplanet BR549 Relative Intensity vs. Time') plt.ylim(0.8, 1.1)

plt.xticks(np.arange(0, 50, 5)) plt.grid()

print("\nManually close plot window after examining to continue program.") plt.show()

#Находим период/продолжительность суток.

#Оцениваем максимальную высоту и границы разделения (distance) на графике.

#Параметры height и distance представляют значения >= границ.

peaks = signal.find_peaks(rel_intensity, height=0.95, distance=5) print(f"peaks = {peaks}")

print("Period = {}".format(mean(np.diff(peaks[0]))))