Код на все звезды розыска – это набор алгоритмов и готовых программных решений, позволяющих автоматически находить и идентифицировать звёздные объекты в астрономических изображениях, а также в больших каталогах небесных тел. Такие инструменты востребованы в:
- научных исследованиях (поиск новых звёзд, переменных и сверхновых);
- любительской астрономии (создание собственных каталогов);
- образовательных проектах (демонстрация методов обработки изображений);
- коммерческих сервисах (приложения для планетариев, мобильных «звёздных карт»).
В этой статье мы разберём, что представляет собой такой код, какие задачи он решает, какие алгоритмы используют, и приведём полностью работающий пример на Python с комментариями.
Что подразумевается под «кодом на все звёзды розыска»?
Термин сочетает два понятия:
- Код – программный скрипт или библиотека.
- Розыск – процесс поиска, то есть автоматическое обнаружение звёзд на изображениях.
Ключевые требования к коду
- Скорость обработки (десятки‑сотни мегапикселей за секунды).
- Надёжность в условиях различного уровня шума.
- Гибкость настройки порогов и параметров.
- Возможность интеграции с другими астрономическими пакетами (Astropy, SAOImage DS9, Aladin).
Алгоритмическая база
Самый популярный подход – пороговое выделение в сочетании с сепарацией связанных компонентов. Ниже перечислены основные шаги:
2.1 Предобработка изображения
- Темная коррекция (dark subtraction) – вычитаем темный кадр.
- Флат‑коррекция – делим на flat‑field, чтобы убрать неоднородности.
- Гауссово размытие (sigma ≈ 1‑2 пикселя) – подавляем высокочастотный шум.
2.2 Выделение звёздных точек
- Вычисляем медианный фон и стандартное отклонение σ.
- Устанавливаем порог
threshold = median + k·σ, гдеkобычно 3‑5. - Создаём бинарную маску: пиксель = 1, если его значение > threshold.
2.3 Лейблинг (разметка) компонентов
С помощью функции scipy.ndimage.label или skimage.measure.label находятся отдельные связные области – потенциальные звёзды.
2.4 Вычисление параметров звёзд
- Центроид (x, y) – позиция звезды.
- Фотометрия: суммарный поток, интегральная яркость.
- Фитинг ПСФ (Point Spread Function) для более точного измерения.
2.5 Фильтрация ложных срабатываний
Отбрасываем объекты, которые:
- Меньше заданного числа пикселей (обычно 3‑5).
- Имеют аномально высокую/низкую яркость.
- Не соответствуют ожидаемому профилю ПСФ.
Полный пример кода на Python
Ниже – готовый скрипт, который принимает FITS‑файл, ищет звёзды и выводит их координаты в виде CSV‑файла.
#!/usr/bin/env python3
"""
Код на все звёзды розыска.
Пример реализации поиска звёзд в астрономическом изображении (FITS).
Требуемые библиотеки:
astropy, numpy, scipy, scikit-image, pandas
"""
import numpy as np
import pandas as pd
from astropy.io import fits
from scipy.ndimage import gaussian_filter, label, find_objects
from skimage.measure import regionprops
import matplotlib.pyplot as plt
def load_fits(path: str) -> np.ndarray:
"""Читает FITS‑файл и возвращает массив данных."""
with fits.open(path) as hdul:
data = hdul[0].data.astype(np.float64)
return data
def preprocess(image: np.ndarray,
dark: np.ndarray = None,
flat: np.ndarray = None,
sigma: float = 1.5) -> np.ndarray:
"""Применяет темную, flat‑коррекцию и гауссово размытие."""
if dark is not None:
image = image ⏤ dark
if flat is not None:
image = image / flat
# Гауссово размытие для подавления шума
return gaussian_filter(image, sigma=sigma)
def detect_stars(image: np.ndarray,
sigma_thresh: float = 4.0,
min_pixels: int = 5) -> pd.DataFrame:
"""
Находит звёзды и возвращает DataFrame со следующими колонками:
x, y – центр звезды (пиксели)
flux – суммарный поток внутри объекта
npix – количество пикселей в объекте
"""
# 1) Фоновая статистика
median = np;median(image)
std = np.std(image)
# 2) Порог
threshold = median + sigma_thresh * std
mask = image > threshold
# 3) Связные компоненты
labeled, n_labels = label(mask)
slices = find_objects(labeled)
# 4) Сбор параметров
records = []
for i, slc in enumerate(slices, start=1):
region = regionprops(labeled == i, intensity_image=image)[0]
if region.area < min_pixels:
continue # слишком мелко – шум
y, x = region.centroid # обратный порядок!
flux = region.intensity_image.sum
records.append(dict(x=x, y=y, flux=flux, npix=region.area))
df = pd.DataFrame.from_records(records)
return df
def plot_results(image: np.ndarray, stars: pd.DataFrame, title: str = "Detected Stars"):
plt.figure(figsize=(8, 8))
plt.imshow(image, cmap='gray', origin='lower', vmin=np.percentile(image, 5), vmax=np.percentile(image, 99))
plt.scatter(stars['x'], stars['y'], s=30, edgecolor='red', facecolor='none', linewidth=1.2)
plt.title(title)
plt.xlabel('X [pixel]')
plt.ylabel('Y [pixel]')
plt.grid(False)
plt.show
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="Код на все звёзды розыска")
parser.add_argument("fits_path", help="Путь к FITS‑файлу")
parser.add_argument("-o", "--output", default="stars.csv", help="Имя CSV‑файла с результатами")
parser.add_argument("-t", "--threshold", type=float, default=4.0, help="Коэффициент порога (σ)")
parser.add_argument("-m", "--minpix", type=int, default=5, help="Минимальное количество пикселей в объекте")
args = parser.parse_args
# 1) Загрузка
img = load_fits(args.fits_path)
# 2) Предобработка (в данном примере без dark/flat)
img_clean = preprocess(img, sigma=1.2)
# 3) Поиск
stars_df = detect_stars(img_clean,
sigma_thresh=args.threshold,
min_pixels=args.minpix)
# 4) Сохранение
stars_df.to_csv(args.output, index=False)
print(f"Найдено {len(stars_df)} звёзд. Результаты сохранены в {args.output}")
# 5) Визуализация
plot_results(img_clean, stars_df, title="Звёзды, найденные кодом")
Пояснения к коду
- load_fits – читает файл формата FITS, который является стандартом в астрономии.
- preprocess – опциональная темная и flat‑коррекция; в примере используется только гауссово размытие.
- detect_stars – основной «розыск»: вычисляет медиану и σ, задает порог, ищет связные компоненты и собирает свойства.
- plot_results – быстрый способ увидеть, насколько корректно работает алгоритм.
- Для больших наборов данных рекомендуется использовать
daskили параллельные вычисления.
Как адаптировать код под свои задачи
4.1 Работа с другими типами файлов
Если у вас изображения в формате PNG, JPG или TIFF, замените функцию load_fits на чтение через imageio.imread или OpenCV. Главное – привести массив к float64 и нормализовать.
4.2 Настройка порога
В полевых условиях уровень фонового шума может сильно различаться. Рекомендуется:
- Провести несколько пробных запусков с разными
k(3‑6) и посмотреть на количество найденных объектов. - Использовать адаптивный порог (например,
skimage.filters.threshold_local), если фон неоднороден.
4.3 Улучшение фотометрии
Для точных измерений вместо простой суммы интенсивности используйте:
- Апертурную фотометрию (апертура радиуса 2‑3×FWHM).
- Фитинг ПСФ (Gaussian, Moffat) через
photutils.
4.4 Параллелизация
При обработке сотен изображений можно обернуть основной цикл в concurrent.futures.ProcessPoolExecutor или воспользоваться dask.delayed. Это уменьшит общее время обработки в несколько раз.
Часто задаваемые вопросы (FAQ)
5.1 Почему в моём результате слишком много «шумовых» точек?
Возможные причины:
- Слишком низкий порог (
sigma_thresh< 3). - Не выполнена предварительная коррекция темного кадра.
- Изображение содержит космические лучи – их следует удалять методом
median filterилиsigma‑clipping.
5.2 Как избавиться от двойных detections (одна звезда считается двумя объектами)?
Увеличьте параметр sigma в gaussian_filter (размытие) или примените morphology.binary_opening перед лейблингом.
5.3 Можно ли использовать код для поиска галактик?
Да, но галактики обычно имеют более сложную форму и большую площадь. Для них рекомендуется:
- Снизить
min_pixelsдо 20‑30. - Использовать более продвинутый сегментационный алгоритм – например,
photutils.detect_sourcesсthresholdиkernelизGaussian2DKernel.
Код на все звёзды розыска – это мощный, но при этом достаточно простой набор инструментов, позволяющих быстро и надёжно находить звёздные объекты в астрономических данных. Благодаря открытым библиотекам Astropy, SciPy и scikit‑image любой желающий может адаптировать пример под свои нужды, будь то научный проект, учебная лабораторная работа или собственное приложение для смартфона.
Помните о ключевых моментах:
- Тщательная предобработка (dark, flat, размытие) существенно повышает качество.
- Выбор порога – компромисс между полнотой и чистотой списка.
- Фильтрация и пост‑обработка (проверка размеров, формы, ПСФ) избавляют от ложных срабатываний.
Удачной охоты за звёздами! 🚀