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

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

app.draw_qc_rects() app.sort_stats()

ptp_img = app.draw_filtered_rects(IMG_GRAY_GEO, app.ptp_filtered) std_img = app.draw_filtered_rects(IMG_GRAY_GEO, app.std_filtered)

# Отображаем отфильтрованные прямоугольники на полутоновой карте. cv.imshow('Sorted by ptp for {} rect'.format(app.name), ptp_img) cv.waitKey(3000)

cv.imshow('Sorted by std for {} rect'.format(app.name), std_img) cv.waitKey(3000)

app.make_final_display() # Включает в себя вызов mainloop()

if __name__ == '__main__': main()

Глава 8. Обнаружение далеких экзопланет

Обнаружение инопланетных мегаструктур

practice_tabbys_star.py

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

import numpy as np import cv2 as cv

import matplotlib.pyplot as plt

IMG_HT = 400

IMG_WIDTH = 500

BLACK_IMG = np.zeros((IMG_HT, IMG_WIDTH), dtype='uint8')

STAR_RADIUS = 165

EXO_START_X = -250

EXO_START_Y = 150

EXO_DX = 3

NUM_FRAMES = 500

def main():

intensity_samples = record_transit(EXO_START_X, EXO_START_Y) rel_brightness = calc_rel_brightness(intensity_samples) plot_light_curve(rel_brightness)

def record_transit(exo_x, exo_y):

"""Рисуем проходящий на фоне звезды массив и возвращаем список изменений в интенсивности ее свечения."""

intensity_samples = []

for _ in range(NUM_FRAMES): temp_img = BLACK_IMG.copy()

# Рисуем звезду:

cv.circle(temp_img, (int(IMG_WIDTH / 2), int(IMG_HT / 2)), STAR_RADIUS, 255, -1)

# Рисуем инопланетный массив:

Глава 8. Обнаружение далеких экзопланет      375

cv.rectangle(temp_img, (exo_x, exo_y),

(exo_x + 20, exo_y + 140), 0, -1) cv.rectangle(temp_img, (exo_x - 360, exo_y),

(exo_x + 10, exo_y + 140), 0, 5) cv.rectangle(temp_img, (exo_x - 380, exo_y),

(exo_x - 310, exo_y + 140), 0, -1) intensity = temp_img.mean()

cv.putText(temp_img, 'Mean Intensity = {}'.format(intensity), (5, 390),

cv.FONT_HERSHEY_PLAIN, 1, 255) cv.imshow('Transit', temp_img) cv.waitKey(10) intensity_samples.append(intensity) exo_x += EXO_DX

return intensity_samples

def calc_rel_brightness(intensity_samples):

"""Возвращаем из списка значений интенсивности список значений относительной яркости."""

rel_brightness = []

max_brightness = max(intensity_samples) for intensity in intensity_samples:

rel_brightness.append(intensity / max_brightness) return rel_brightness

def plot_light_curve(rel_brightness):

"""Выводим график изменений относительной яркости во времени.""" plt.plot(rel_brightness, color='red', linestyle='dashed',

linewidth=2) plt.title('Relative Brightness vs. Time') plt.xlim(-150, 500)

plt.show()

if __name__ == '__main__': main()

Обнаружение транзита астероидов

practice_asteroids.py

"""Симулируем транзит астероидов и рисуем график кривой блеска.""" import random

import numpy as np import cv2 as cv

import matplotlib.pyplot as plt

STAR_RADIUS = 165

BLACK_IMG = np.zeros((400, 500, 1), dtype="uint8")

NUM_ASTEROIDS = 15

NUM_LOOPS = 170

class Asteroid():

"""Рисуем на изображении круг, обозначающий астероид."""

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

def __init__(self, number):

self.radius = random.choice((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3))

self.x = random.randint(-30, 60) self.y = random.randint(220, 230) self.dx = 3

def move_asteroid(self, image):

"""Рисуем и перемещаем объект астероида.""" cv.circle(image, (self.x, self.y), self.radius, 0, -1) self.x += self.dx

def record_transit(start_image):

"""Симулируем транзит астероидов на фоне звезды и возвращаем список значений интенсивности."""

asteroid_list = [] intensity_samples = []

for i in range(NUM_ASTEROIDS): asteroid_list.append(Asteroid(i))

for _ in range(NUM_LOOPS): temp_img = start_image.copy()

# Рисуем звезду.

cv.circle(temp_img, (250, 200), STAR_RADIUS, 255, -1) for ast in asteroid_list:

ast.move_asteroid(temp_img) intensity = temp_img.mean()

cv.putText(temp_img, 'Mean Intensity = {}'.format(intensity), (5, 390), cv.FONT_HERSHEY_PLAIN, 1, 255)

cv.imshow('Transit', temp_img) intensity_samples.append(intensity) cv.waitKey(50)

cv.destroyAllWindows() return intensity_samples

def calc_rel_brightness(image):

"""Вычисляем величины относительной яркости и возвращаем их список.""" rel_brightness = record_transit(image)

max_brightness = max(rel_brightness) for i, j in enumerate(rel_brightness):

rel_brightness[i] = j / max_brightness return rel_brightness

def plot_light_curve(rel_brightness):

"Рисуем график кривой блеска на основе списка значений относительной яркости."""

plt.plot(rel_brightness, color='red', linestyle='dashed', linewidth=2, label='Relative Brightness')

plt.legend(loc='upper center') plt.title('Relative Brightness vs. Time') plt.show()

Глава 8. Обнаружение далеких экзопланет      377

relative_brightness = calc_rel_brightness(BLACK_IMG) plot_light_curve(relative_brightness)

Добавление эффекта потемнения к краю

practice_limb_darkening.py

"""Симулируем транзит экзопланеты, рисуем график кривой ее блеска и оцениваем радиус."""

import cv2 as cv

import matplotlib.pyplot as plt

IMG_HT = 400 IMG_WIDTH = 500

BLACK_IMG = cv.imread('limb_darkening.png', cv.IMREAD_GRAYSCALE) EXO_RADIUS = 7

EXO_START_X = 40

EXO_START_Y = 230 EXO_DX = 3 NUM_FRAMES = 145

def main():

intensity_samples = record_transit(EXO_START_X, EXO_START_Y) relative_brightness = calc_rel_brightness(intensity_samples) plot_light_curve(relative_brightness)

def record_transit(exo_x, exo_y):

"""Рисуем планету, проходящую на фоне звезды, и возвращаем список со значениями изменяющейся интенсивности."""

intensity_samples = []

for _ in range(NUM_FRAMES): temp_img = BLACK_IMG.copy()

# Рисуем экзопланету:

cv.circle(temp_img, (exo_x, exo_y), EXO_RADIUS, 0, -1) intensity = temp_img.mean()

cv.putText(temp_img, 'Mean Intensity = {}'.format(intensity), (5, 390),

cv.FONT_HERSHEY_PLAIN, 1, 255) cv.imshow('Transit', temp_img) cv.waitKey(30) intensity_samples.append(intensity) exo_x += EXO_DX

return intensity_samples

def calc_rel_brightness(intensity_samples):

"""Возвращаем из списка интенсивности список значений относительной яркости."""

rel_brightness = []

max_brightness = max(intensity_samples) for intensity in intensity_samples:

rel_brightness.append(intensity / max_brightness) return rel_brightness