Skip to content

Latest commit

 

History

History
1864 lines (1397 loc) · 98.8 KB

File metadata and controls

1864 lines (1397 loc) · 98.8 KB

AstroBatch - Справочник по скриптам

Набор инструментов для пакетной обработки астрономических FITS-изображений.


Краткий список скриптов

Скрипт Назначение
add.py Сложение: result = input + operand + offset
sub.py Вычитание: result = input - operand + offset
mul.py Умножение: result = input * operand * scale
div.py Деление: result = (input / operand) * scale
arith.py Универсальная арифметика (add/sub/mul/div в одном скрипте)
sum.py Суммирование стека изображений с обновлением EXPTIME
med.py Медианное комбинирование (тайловый параллельный режим)
calibrate.py Калибровка: dark, bias, flat, cosmetic correction
autocalibrate.py Автокалибровка по деревьям dark/flat с подбором по EXPTIME/FILTER
normalize.py Нормализация яркости между кадрами (линейная регрессия)
ngain.py Нормализация умножением (приведение медианы к целевому значению)
noffset.py Нормализация смещением (приведение медианы к целевому значению)
autoflat.py Выравнивание фона изображений
cosme.py Коррекция горячих пикселей по списку
make_cosme.py Генерация списка горячих пикселей из дарка
makedark.py Создание master dark и cosme.lst из сырых дарков
makeflat.py Создание master flat по фильтрам из сырых флэтов
newflat.py Добавление записи в лог обслуживания (для autocalibrate --flatlog)
darkopt.py Вычитание мастердарка с оптимизацией (подбор коэффициента)
sortfits.py Сортировка FITS по времени, разбиение на сессии
autosolve.py Астрометрическое решение (WCS), ректификация, выравнивание, JPEG вход/выход
fits2tiff.py Конвертация FITS в TIFF, JPEG, PNG
tiff2fits.py Конвертация TIFF → FITS
raw2fits.py Конвертация Camera RAW → FITS (пока только Canon CR2/CR3)
fft_align.py FFT-выравнивание кадров (Эспериментальный)
absession.py Генерация CSV-списка фотосессий для AstroBin
binxy.py Программный биннинг 2×2 / 4×4
crop.py Обрезка FITS-изображений (по размеру/центру или полям)
debayer.py Демозаик Bayer-паттерна в RGB
hotfix.py Поиск и удаление одиночных горячих пикселей
lrgb.py LRGB композиция (совмещение L-канала с цветом)
mtf.py Нелинейное преобразование яркости (авто уровни, сохранение цвета)
stack.py Оптимальное взвешенное сложение с плавным отсечением выбросов
rgbbalance.py Баланс цвета и яркости для RGB FITS
bestof.py Отбор лучших кадров по FWHM (качество атмосферы)
rgb.py Объединение/разделение RGB каналов
staralign.py Автоматическое выравнивание кадров по звёздам (Thin Plate Spline)
xisf2fits.py Конвертация XISF (PixInsight) в FITS

Общие правила для всех скриптов

Форматы входных данных (input_spec)

  • Одиночный файл: image.fit
  • Нумерованная последовательность: light0001.fit → автоматически находит light0002.fit, light0003.fit, ...
  • Принудительно одиночный файл: =image.fit — префикс = отключает поиск последовательности
  • Маска с wildcards: *.fit, light_*.fit
  • Файл-список: @list.txt или list.txt (по одному пути на строку)

Числовые константы как операнды

Арифметические скрипты (add, sub, mul, div, arith) поддерживают числовые константы в качестве операндов. Константа интерпретируется как "виртуальный файл", заполненный этим значением.

Допустимые форматы констант (строгий парсинг):

  • Целые числа: 123, -456, +789
  • Десятичные: 123.456, -0.5, +1.0

НЕ допускаются:

  • Экспоненциальная нотация: 1e5, 1E-3
  • Специальные значения: inf, -inf, nan
  • Разделители разрядов: 1_000, 1,000
  • Неполные числа: .5, 5.

Важно: Хотя бы один аргумент должен быть файлом — из него берутся размеры изображения и FITS-заголовок.

Применение: Например может быть полезно для калибровки на термостабильных CCD, где BIAS-кадры можно заменить нулём или известной константой смещения.

Форматы выходных данных (output_spec)

  • Одиночный файл: output.fit
  • Нумерованный шаблон: out0001.fit → автоинкремент для каждого входного файла

Типы данных

Поддерживаемые форматы:

  • Целочисленные: int8, int16, int32, int64 (signed/unsigned)
  • Вещественные: float32, float64

Выходная конвертация:

  • Целочисленные FITS: результат ограничивается диапазоном типа (clamp), округляется
  • Вещественные FITS: сохраняются как есть
  • NaN, Inf, -Inf: заменяются на 0 (никогда не записываются в выходные файлы)

Когда используется float64:

  • Умножение/деление на коэффициенты ~1.0 (нормализация, flat-коррекция)
  • Вычисление среднего (накопление ошибок округления)
  • Операции с дробными коэффициентами

Когда float64 НЕ нужен:

  • Сложение/вычитание целых значений или изображений
  • Медиана (выбор элемента, без арифметики)
  • Min/max операции

Подробное описание скриптов


add.py

Назначение: Сложение значения или изображения с входными кадрами.

Формула: result = input + operand + offset

Синтаксис:

add.py input_spec output_spec operand [offset]

Параметры:

  • input_spec — входные файлы
  • output_spec — выходные файлы
  • operand — числовая константа ИЛИ FITS-файл ИЛИ нумерованный шаблон FITS
  • offset — опциональное числовое смещение (по умолчанию 0)

Примеры:

add light0001.fit cal0001.fit 100
add *.fit out0001.fit bias.fit
add light0001.fit result0001.fit dark0001.fit 500
add image.fit result.fit 1024           :: добавить константу ко всем пикселям

sub.py

Назначение: Вычитание значения или изображения из входных кадров.

Формула: result = input - operand + offset

Синтаксис:

sub.py input_spec output_spec operand [offset]

Параметры:

  • input_spec — входные файлы
  • output_spec — выходные файлы
  • operand — числовая константа ИЛИ FITS-файл (значение для вычитания)
  • offset — опциональное смещение (по умолчанию 0)

Опции:

  • --continuum [snr] — Режим вычитания континуума. Детектирует звёзды в обоих изображениях, сопоставляет их по координатам (толерантность 1.5 px), и масштабирует вычитаемый кадр так, чтобы яркость звёзд совпала. Звёзды вычитаются в ноль, остаётся только эмиссия (например H-alpha). Порог SNR для детекции звёзд (по умолчанию 38).

Формула с --continuum: result = input - K * operand + offset, где K = sum(flux_input) / sum(flux_operand) вычислено по фотометрии совпавших звёзд.

Примеры:

sub light0001.fit dark_sub0001.fit master_dark.fit
sub raw.fit calibrated.fit dark.fit 100
sub light0001.fit cal0001.fit 0         # вычитание нуля (для термостабильных CCD без bias)
sub light0001.fit cal0001.fit 1024      # вычитание константы смещения
sub ha.fit continuum_sub.fit red.fit --continuum
sub ha.fit output.fit broadband.fit --continuum 50
sub ha0001.fit out0001.fit red0001.fit 1000 --continuum   # со смещением

mul.py

Назначение: Умножение входных кадров на значение или изображение.

Формула: result = input * operand * scale

Синтаксис:

mul.py input_spec output_spec operand [scale]

Параметры:

  • input_spec — входные файлы
  • output_spec — выходные файлы
  • operand — множитель (числовая константа или FITS)
  • scale — дополнительный множитель (по умолчанию 1.0)

Примеры:

mul light0001.fit scaled0001.fit 2.5
mul image.fit result.fit gain_map.fit
mul light0001.fit doubled0001.fit 2     :: умножение на константу

div.py

Назначение: Деление входных кадров на значение или изображение.

Формула: result = (input / operand) * scale

Особенности: Деление на ноль даёт 0.

Синтаксис:

div.py input_spec output_spec operand [scale]

Параметры:

  • input_spec — входные файлы
  • output_spec — выходные файлы
  • operand — делитель (числовая константа или FITS)
  • scale — множитель результата (по умолчанию 1.0)

Примеры:

div light0001.fit flat_div0001.fit master_flat.fit 5000
div image.fit normalized.fit 32768      :: деление на константу (нормализация к диапазону)
div light0001.fit norm0001.fit 1 5000   :: деление на 1 с масштабированием (эквивалент mul)

arith.py

Назначение: Универсальный арифметический инструмент (объединяет add/sub/mul/div).

Синтаксис:

arith.py (add|sub|mul|div) input_spec output_spec operand [param]

Операции:

  • addresult = input + operand + offset
  • subresult = input - operand + offset
  • mulresult = input * operand * scale
  • divresult = (input / operand) * scale

Параметры:

  • operand — числовая константа ИЛИ FITS-файл ИЛИ нумерованный шаблон
  • param — для add/sub это offset (по умолчанию 0), для mul/div это scale (по умолчанию 1)

Примеры:

arith add light0001.fit out0001.fit 100
arith sub light0001.fit cal0001.fit dark.fit 500
arith sub light0001.fit cal0001.fit 0           :: вычитание нуля (замена bias для термостабильных CCD)
arith div image.fit result.fit flat.fit 5000
arith mul light0001.fit scaled0001.fit 2.5      :: умножение на константу

sum.py

Назначение: Суммирование стека FITS-изображений.

Особенности:

  • Обновляет EXPTIME (суммарная экспозиция)
  • Обновляет DATE-OBS (самое раннее время)
  • Для целочисленных FITS: масштабирует результат до максимума типа
  • Для вещественных FITS: вычисляет среднее

Синтаксис:

sum.py input_spec output.fit

Параметры:

  • input_spec — входные файлы (последовательность, маска или одиночный файл)
  • output.fit — выходной файл

Примеры:

sum light0001.fit stacked.fit
sum *.fit combined.fit

med.py

Назначение: Медианное комбинирование стека FITS-изображений.

Особенности:

  • Параллельный ввод-вывод; авто-разбиение на горизонтальные полосы при нехватке памяти
  • Точная попиксельная медиана
  • Опциональный режим игнора нулей (--zero)
  • Использует все ядра CPU

Синтаксис:

med.py input_spec output.fit [--memory N] [--zero]

Параметры:

  • input_spec — входные файлы
  • output.fit — выходной файл
  • --memory N — лимит памяти под стек в ГБ (по умолчанию 16; при превышении обработка идёт горизонтальными полосами)
  • --zero — игнор нулей: пиксель == 0 в кадре исключается из медианы в этой позиции; в итоговом он становится 0 только там, где он 0 во всех кадрах

Примеры:

med dark0001.fit master_dark.fit
med flat*.fit master_flat.fit
med @list.txt median.fit --memory 8
med aligned*.fit stacked.fit --zero

calibrate.py

Назначение: Калибровка изображений (вычитание dark/bias, деление на flat, cosmetic correction).

Формула: result = ((raw - bias) - dark * OPTIMIZ) * K / flat

Синтаксис:

calibrate.py input_spec output_spec -d dark.fit [-b bias.fit] [-f flat.fit K] [-c cosme.lst] [-optimize|-o]

Параметры:

  • input_spec — сырые файлы
  • output_spec — выходные файлы
  • -d dark.fit — master dark (обязательно)
  • -b bias.fit — master bias (опционально)
  • -f flat.fit K — master flat и множитель K (опционально)
  • -c cosme.lst — список горячих пикселей (опционально)
  • -optimize или -o — оптимизация коэффициента дарка для каждого кадра

Примеры:

calibrate raw0001.fit cal0001.fit -d dark10s.fit
calibrate raw0001.fit cal0001.fit -d dark.fit -b bias.fit -f flat.fit 5000
calibrate raw0001.fit cal0001.fit -d dark.fit -f flat.fit 5000 -c cosme.lst -o

autocalibrate.py

Назначение: Автоматическая калибровка с подбором dark/flat по EXPTIME и FILTER.

Особенности:

  • Ищет darks по EXPTIME и JD (ближайший по времени)
  • Ищет flats по FILTER и JD (ближайший, не более N дней в будущем)
  • Автоматически находит cosme.lst в папке darks (по имени: dark600s.fit → cosme600s.lst)
  • Множитель MULT вычисляется автоматически как медиана flat-кадра

Синтаксис:

autocalibrate.py [options] rawfiles.fit out_path dark_path flat_path

Параметры:

  • rawfiles.fit — сырые файлы (файл, список, маска)
  • out_path — базовое имя выходных файлов
  • dark_path — директория с master darks и cosme*.lst
  • flat_path — директория с master flats

Опции:

  • --bestflat — автоподбор лучшего flat для каждой сессии (по минимуму σ после деления)
  • --debug — сохранять превью в ./debug/ для визуальной проверки подбора flat
  • --flat-future-days N — макс. дней в будущем для поиска flat (по умолчанию 2)
  • --flatlog FILE — CSV-лог обновления флэтов для строгого подбора по интервалам
  • --filter NAME — трактовать ВСЕ лайты как фильтр NAME (игнорируя хедер FILTER) при подборе flat и записать FILTER=NAME в выход. Для случая, когда снимали внешним фильтром, а хедер писал другой (напр. --filter Ha → матчит flat_h).

Сопоставление фильтров: сначала точное (с учётом регистра), затем — если не найдено — без учёта регистра (ha найдёт Ha; при наличии и Ha, и ha точное совпадение в приоритете).

Формула калибровки: result = ((raw - dark) * MULT) / flat

Порядок: dark subtraction → cosmetic correction → flat division

Формат выходных файлов: <base>_exp<EXPTIME>_<FILTER>_<N>.fit

Режим --bestflat:

  • Группирует файлы по фильтру и сессии (noon-to-noon по локальному времени)
  • Для каждой группы создаёт превью: downscale 4×4 после dark subtraction
  • Для каждого flat: медианный блур 16px → downscale → деление → удаление градиента → σ
  • Выбирает flat с минимальной σ (меньше артефактов пыли/виньетирования)

Режим --flatlog:

  • Формат CSV: DATETIME_UTC,CAMERA_ID[,COMMENT]
  • Camera ID сопоставляется как подстрока с INSTRUME
  • Логика выбора flat:
    1. Сначала ищет в текущем интервале (между записями в логе)
    2. Если в интервале несколько флэтов — берёт ближайший (не новее +N дней)
    3. Если с +N дней ничего, но в интервале есть флэт — берёт его (интервал = приоритет)
    4. Если интервал пуст — ищет глобально (по +N дней, как без flatlog)
    5. L fallback в конце, если точный фильтр не найден

Примеры:

:: Базовое использование
autocalibrate raw*.fit calibrated darks/ flats/

:: С автоподбором лучшего flat
autocalibrate --bestflat raw*.fit calibrated darks/ flats/

:: С отладочными превью
autocalibrate --bestflat --debug raw*.fit calibrated darks/ flats/

:: С логом обслуживания камеры
autocalibrate --flatlog maintenance.csv raw*.fit cal darks/ flats/

:: Комбинация опций
autocalibrate --bestflat --flat-future-days 3 --flatlog maint.csv raw*.fit out darks/ flats/

:: Внешняя Ha, в хедерах L: трактовать как Ha и матчить flat_h
autocalibrate M8-Ha25*.fit cal\ darks\T-10 flats\...\h --filter Ha

newflat.py

Назначение: Добавление записи в лог обслуживания камеры (для --flatlog в autocalibrate).

Применение: Отмечает момент, когда flat-кадры становятся невалидными (чистка сенсора, замена фильтров, и т.д.)

Синтаксис:

newflat.py --camera CAMERA_ID --log FILE [--date DATETIME] [--comment TEXT]

Параметры:

  • --camera — идентификатор камеры (должен быть подстрокой INSTRUME в FITS)
  • --log — путь к CSV-файлу лога
  • --date — опционально: дата/время в ISO формате (по умолчанию текущее UTC)
  • --comment — опционально: комментарий

Формат лога:

# Maintenance log
DATETIME_UTC,CAMERA_ID,COMMENT
2024-05-18T14:30:00,2600MM,Cleaned sensor
2024-12-21T10:00:00,2600MM,Changed dust cover

Примеры:

:: Добавить запись с текущим временем
newflat --camera 2600MM --log maintenance.csv

:: С указанием даты
newflat --camera 2600MM --log maintenance.csv --date 2024-05-18T14:30:00

:: С комментарием
newflat --camera "ASI2600" --log maint.csv --comment "Sensor cleaning"

normalize.py

Назначение: Нормализация яркости изображений относительно референсного кадра.

Модель: I = B * R + C → нормализованный результат: (I - C) / B

Синтаксис:

normalize.py input_spec output_spec [basefile.fit] [method] [--sat F] [--zero]

Параметры:

  • input_spec — входные файлы
  • output_spec — выходные файлы
  • basefile.fit — референсный кадр (по умолчанию первый входной)
  • method — метод нормализации:
    • 1 — линейная регрессия, OLS (по умолчанию)
    • 2 — робастная регрессия (sigma-clipping) — рекомендуется для кадров со звёздами
    • 3 — глобальная итеративная нормализация всех кадров (робастные фиты)
  • --sat F — необязательный предобрез по пересвету: перед подгонкой игнорируются пиксели ярче F × P99.5 в любом из кадров, где P99.5 — значение 99.5-го перцентиля (робастный «максимум», устойчивый к одиночным горячим пикселям). F в диапазоне (0, 1]. По умолчанию выключено.
  • --zero (-z) — сохранить нули нет-данных: после подгонки (которая и так игнорирует нули) и аффинного преобразования восстановить нулевые пиксели входа в 0 на выходе, чтобы нормализация не сдвигала 0 (рамка совмещения / нет-данных) в ненулевое -C/B. По умолчанию выключено.

Обработка пикселей (надёжность):

  • Нулевые пиксели (рамки нет-данных после совмещения) исключаются из подгонки во всех методах — иначе масса точек (0, 0) притягивает прямую к началу координат (leverage) и смещает offset C к нулю. С --zero они дополнительно восстанавливаются в 0 на выходе.
  • Пересвет отрезается остаточным sigma-clipping методов 2 и 3, а не порогом по значению: после калибровки потолок насыщения равен raw_sat / flat и меняется по полю, поэтому константой его не описать. Метод 1 (чистый OLS) убирает нули, но пересвет не режет — для кадров с насыщенными звёздами берите метод 2 или 3 (либо добавьте --sat).
  • --sat F — необязательный грубый довесок поверх вышеописанного.

Примеры:

normalize light0001.fit norm0001.fit
normalize light0001.fit norm0001.fit reference.fit 2
normalize *.fit normalized0001.fit 3
normalize *.fit norm0001.fit 2 --sat 0.8     :: плюс отброс пикселей ярче 80% от P99.5
normalize *.fit norm0001.fit 2 --zero        :: восстановить нули нет-данных на выходе

ngain.py

Назначение: Нормализация умножением — приводит медиану каждого кадра к целевому значению.

Формула: result = input * (target_median / current_median)

Аналог: NGAIN в Iris.

Особенности:

  • Поддерживает все типы данных: signed/unsigned int 8/16/32/64, float 32/64
  • Все вычисления в float64
  • Корректная конвертация обратно с контролем границ диапазона
  • При нулевой медиане изображение копируется без изменений

Синтаксис:

ngain.py input_spec output_spec target_median

Параметры:

  • input_spec — входные файлы
  • output_spec — выходные файлы
  • target_median — целевое значение медианы для всех выходных изображений

Примеры:

ngain flat0001.fit norm_flat0001.fit 10000
ngain *.fit normalized0001.fit 5000
ngain @list.txt out0001.fit 32768

noffset.py

Назначение: Нормализация смещением — приводит медиану каждого кадра к целевому значению путём добавления константы.

Формула: result = input + (target_median - current_median)

Аналог: NOFFSET в Iris.

Особенности:

  • Поддерживает все типы данных: signed/unsigned int 8/16/32/64, float 32/64
  • Все вычисления в float64
  • Корректная конвертация обратно с контролем границ диапазона
  • Сохраняет относительные яркости пикселей (в отличие от ngain)

Синтаксис:

noffset.py input_spec output_spec target_median

Параметры:

  • input_spec — входные файлы
  • output_spec — выходные файлы
  • target_median — целевое значение медианы для всех выходных изображений

Примеры:

noffset bias0001.fit norm_bias0001.fit 1000
noffset *.fit normalized0001.fit 5000
noffset light0001.fit out0001.fit 10000

autoflat.py

Назначение: Выравнивание фона изображений (два режима: cell-based и min-binning).

Mode 1 (default) — cell-based:

  1. Разбивка на ячейки → sigma-clipped медиана (отсечение звёзд)
  2. Медиан-фильтр на сетке (нули игнорируются через sentinel)
  3. Расширение сетки за края кадра
  4. Второй медиан-фильтр на расширенной сетке
  5. Полиномиальный фит (нулевые ячейки исключены)
  6. result = input - model + median(model)

Mode 2 — min-binning (оригинальный алгоритм):

  1. Расширение маски нулевых пикселей → медианная фильтрация → min-биннинг → полином

Синтаксис:

autoflat.py [-d] [--mode {1,2}] input_spec [output_spec] [options]

Опции вывода: --save FILE (модель фона), --subtract (вычесть модель). По умолчанию --subtract.

Опции Mode 1: --cell N (64), --clip K (1.7), --poly N (3), --median1 N (3), --median2 N (5), --border N (2), --mask-center [D] (маска центрального объекта).

Опции Mode 2: --poly N (1), --radius N (2).

Примеры:

autoflat input.fit output.fit
autoflat input.fit output.fit --poly 4 --mask-center
autoflat input.fit --save model.fit --subtract output.fit
autoflat --mode 2 input.fit output.fit

cosme.py

Назначение: Коррекция горячих пикселей по списку координат.

Алгоритм: Заменяет горячие пиксели средним значением соседей (3×3).

Синтаксис:

cosme.py input_spec output_spec cosme.lst [-t]

Параметры:

  • input_spec — входные файлы
  • output_spec — выходные файлы
  • cosme.lst — список горячих пикселей (формат: P x y)
  • -t — тестовый режим: создаёт маску вместо коррекции

Формат cosme.lst:

P 123 456
P 789 101
# комментарий

Примеры:

cosme light0001.fit clean0001.fit cosme.lst
cosme image.fit mask.fit cosme.lst -t

make_cosme.py

Назначение: Генерация списка горячих пикселей из master dark.

Алиас: find_hot (команда find_hot вызывает этот же скрипт)

Алгоритм: Находит 10000 самых ярких пикселей в изображении.

Синтаксис:

make_cosme.py input.fit cosme.lst

Параметры:

  • input.fit — master dark
  • cosme.lst — выходной файл списка

Примеры:

make_cosme master_dark.fit cosme.lst

makedark.py

Назначение: Автоматическое создание master dark и списков косметической коррекции из сырых дарков.

Метаскрипт: Использует sub.py, med.py, make_cosme.py.

Алгоритм:

  1. Сканирует входные файлы, отбирает с IMAGETYP='Dark Frame'
  2. Группирует по времени экспозиции (EXPTIME или EXPOSURE)
  3. Для каждой группы:
    • Вычитает bias из каждого дарка
    • Медианно комбинирует
    • Генерирует список горячих пикселей

Синтаксис:

makedark.py input_spec [bias_spec]

Параметры:

  • input_spec — директория ИЛИ маска ИЛИ последовательность дарков
  • bias_spec — опционально: числовая константа ИЛИ FITS-файл ИЛИ список/маска bias-файлов (по умолчанию 0)

Выходные файлы (в текущую директорию):

  • dark<exp>.fit — master dark для каждой экспозиции
  • cosme<exp>.lst — список горячих пикселей
  • bias.fit — master bias (если был указан список bias-файлов)

Формат имени: dark300s.fit (≥1с), dark500ms.fit (<1с), dark500mks.fit (микросекунды, <1мс — чтобы 0.0005с не терялось как 0ms)

Примеры:

makedark C:\Darks                          :: все дарки из папки, bias=0
makedark dark0001.fit                      :: последовательность дарков, bias=0
makedark *.fit 1024                        :: маска, bias=константа
makedark C:\Darks master_bias.fit          :: с готовым master bias
makedark C:\Darks bias0001.fit             :: создаст bias.fit из последовательности

makeflat.py

Назначение: Автоматическое создание master flat для каждого фильтра из сырых флэтов.

Метаскрипт: Использует sub.py, ngain.py, med.py, cosme.py, makedark.py.

Алгоритм:

  1. Сканирует входные файлы, отбирает с IMAGETYP='Flat Frame'
  2. Группирует по фильтру (FILTER)
  3. Валидирует: все файлы в группе должны иметь одинаковую экспозицию
  4. Ищет dark<exp>.fit и cosme<exp>.lst (сначала в текущей, потом во входной директории)
  5. Если дарки не найдены — запускает makedark автоматически
  6. Для каждой группы фильтра:
    • Вычитает соответствующий dark
    • Нормализует (ngain) к target_median
    • Медианно комбинирует
    • Применяет косметическую коррекцию

Синтаксис:

makeflat.py input_spec [target_median] [--filter NAME]

Параметры:

  • input_spec — директория ИЛИ маска ИЛИ последовательность флэтов
  • target_median — опционально: целевая медиана для нормализации (по умолчанию 5000)
  • --filter NAME — форсировать ВСЕ флэты как фильтр NAME, игнорируя хедер FILTER, и записать FILTER=NAME в хедер мастера. Для случая, когда снимали внешним фильтром, а колесо/хедер писали другой (напр. --filter Haflat_h.fit).

Выходные файлы (в текущую директорию):

  • flat_<filter>.fit — master flat для каждого фильтра

Коды фильтров:

FILTER Код файла
OIII flat_o.fit
SII flat_s.fit
Ha flat_h.fit
L flat_l.fit
R flat_r.fit
G flat_g.fit
B flat_b.fit
(другие) flat_<полное_имя>.fit

Примеры:

makeflat C:\Flats                          :: все флэты из папки, median=5000
makeflat C:\Flats 10000                    :: с другим target_median
makeflat flat*.fit                         :: маска файлов
makeflat @list.txt 8000                    :: из списка
makeflat C:\Flats --filter Ha              :: внешняя Ha (в хедерах L) -> flat_h.fit, FILTER=Ha

darkopt.py

Назначение: Оптимизированное вычитание дарка с подбором коэффициента K.

Формула: result = input - K * dark

Алгоритм подбора K:

  • Разбивает изображение на тайлы 64×64
  • Исключает тайлы с нулями или насыщением
  • Выбирает самый тёмный тайл
  • Вычисляет K методом наименьших квадратов

Синтаксис:

darkopt.py input_spec output_spec master_dark.fit [cosme.lst]

Параметры:

  • input_spec — входные файлы
  • output_spec — выходные файлы
  • master_dark.fit — master dark
  • cosme.lst — опциональный список горячих пикселей

Примеры:

darkopt light0001.fit opt0001.fit master_dark.fit
darkopt light0001.fit opt0001.fit dark.fit cosme.lst

sortfits.py

Назначение: Сортировка FITS-файлов по времени наблюдения, разбиение на сессии.

Синтаксис:

sortfits.py input_spec output_pattern [-s|--sessions] [--gap-hours H]

Параметры:

  • input_spec — входные файлы
  • output_pattern — шаблон выходных имён
  • -s, --sessions — режим сессий (выходные имена: <base>_Sssss_Fffff.fit)
  • --gap-hours H — разрыв в часах для разделения сессий (по умолчанию 1.0)
  • --auto — режим автоименования: имена выходных файлов по хидерам FITS: {OBJECT}_exp{TIME}_{FILTER}[_S{SSSS}]_{NNNN}.fit
  • --name NAME — переопределить значение OBJECT (используется с --auto)
  • --group-num — нумерация внутри каждой группы с 1 (используется с --auto)

Примеры:

sortfits light0001.fit sorted0001.fit
sortfits *.fit session.fit --sessions --gap-hours 2
sortfits *.fit sorted/ --auto
sortfits *.fit sorted/ --auto --name NGC1097
sortfits *.fit sorted/ --auto --group-num

autosolve.py

Назначение: Астрометрическое решение (WCS), репроекция на касательную плоскость (TAN), субпиксельное выравнивание.

Особенности:

  • Использует astrometry.net (solve-field) через WSL
  • Репроекция в гномоническую (TAN) проекцию
  • Субпиксельное выравнивание через FFT
  • Рефит WCS из .corr файлов
  • Поддерживает цветные RGB FITS — решение по зелёному каналу, репроекция всех трёх каналов
  • Принимает FITS или JPEG; для JPEG-входа выдаёт JPEG с решённым WCS, упакованным в заголовок

Синтаксис:

autosolve.py [options] input_spec output_spec

Основные опции:

  • --no-solve — пропустить астрометрическое решение
  • --rectify — репроекция на касательную плоскость (TAN)
  • --rect-center-ra — RA центра проекции (градусы)
  • --rect-center-dec — Dec центра проекции (градусы)
  • --individual — свой центр проекции для каждого файла
  • --align — субпиксельное выравнивание
  • --ref file.fit — референсный кадр для выравнивания
  • --scale-low, --scale-high — диапазон масштаба (arcsec/pixel)
  • --radius — радиус поиска (градусы)
  • --no-rotate — ректификация без деротации — коррекция дисторсии с сохранением ориентации кадра. Размеры не меняются, нет чёрных полей. Для мозаик и обзоров.
  • --reuse-wcs — если вход уже несёт готовый WCS (наш JPEG с WCS в COM-маркере или обычный solved FITS), пропустить solve-field и репроецировать прямо из этого WCS (с -r; --no-rotate снимает SIP, края = 0). Нет WCS → предупреждение + обычный солв. JPEG-вход → JPEG-выход; FITS-вход → FITS (_rect.fit), дисплей-JPEG отдельно через fits2tiff.
  • --jpeg [Q] — качество JPEG-выхода 1–100 (по умолчанию 99); действует при JPEG-входе
  • --fovx D / --fovy D — поле зрения по ширине / высоте в градусах; из него вычисляется масштаб (указывать одно)
  • --ra V / --dec V — центр поиска: десятичные градусы или шестидесятеричные (RA в часах)
  • --name "ID" — центр по имени объекта через SIMBAD/Sesame
  • --radius D — радиус конуса поиска (градусы)
  • --downsample N — прореживание при детекции звёзд (по умолчанию 1; 2–4 ускоряют большие кадры)

Репроекция (--rectify): Преобразует изображение в гномоническую (TAN) проекцию — проекцию на плоскость, касательную к небесной сфере. По умолчанию центр берётся из первого файла; можно задать явно через --rect-center-ra и --rect-center-dec.

  • --rect-method {wcsresample,interp,exact} — движок ресэмплинга (по умолчанию wcsresample; interp — билинейный, exact — максимальная точность).

Вне-футпринтные (нет-данных) пиксели после ректификации всегда = 0 (чёрный = нет-данных): потребители тайлов/оверлеев опираются на это для чистого фейда краёв, а мозаика/стекинг всё равно исключают их маской покрытия. (Заливка медианой выдумывала бы серое «небо» на месте нет-данных — фейк, запрещён политикой Pulsar.)

JPEG вход/выход: Если на вход подан JPEG, autosolve декодирует его, решает и записывает результат обратно в JPEG с решённым WCS, упакованным в COM-маркер (тот же формат, что пишет fits2tiff). Выход: <base>_wcs.jpg<base>_rect.jpg при --rectify). Если во входном JPEG уже есть встроенный FITS-заголовок (например, экспортированный из fits2tiff), из него восстанавливаются подсказки FOCALLEN/RA/DEC — решение идёт быстрее. Требует Pillow. JPEG-вход всегда даёт JPEG-выход (FITS-выход для JPEG-входа недоступен).

Заголовок с координатами (RA/DEC или OBJCTRA/OBJCTDEC) ускоряет решение даже без FOCALLEN: поиск ограничивается конусом вокруг координат (широким при неизвестном масштабе), а не идёт по всему небу.

Подсказки для решения (масштаб и позиция): Обработанный JPEG обычно не несёт заголовка с FOCALLEN/координатами, поэтому solve-field уходит в долгий слепой перебор по всему небу и всем масштабам. Подсказки резко ускоряют (и часто вообще делают возможным) решение.

Масштаб — через поле зрения в градусах (--fovx — ширина, --fovy — высота; достаточно одного). Масштаб (arcsec/px) вычисляется из размера кадра, окно ±25 % под неточность оценки:

--fovx 1.1     # поле 1.1° по ширине (= 66′)
--fovy 0.5     # поле 0.5° по высоте (= 30′)

FOV должен быть достаточно точным (окно ±25 %): грубая ошибка (например 28° вместо реальных 41°) выводит истинный масштаб за окно, и решение не находится. Ориентир: 50 мм на full-frame → поле по ширине ~40°.

Позиция — три способа записи (все три эквивалентны для Abell 35):

--ra 193.39 --dec -22.87            # десятичные ГРАДУСЫ
--ra "12 53 32" --dec "-22 52 23"   # шестидесятеричные: RA в ЧАСАХ, Dec в градусах
--ra 12:53:32   --dec -22:52:23     # разделитель — пробел или двоеточие
--name "PN A66 35"                  # по имени объекта через SIMBAD

Ключевое: десятичное --ra — это градусы (не часы!), а шестидесятеричное --raчасы. --ra/--dec имеют приоритет над --name.

Про --name: имена разрешаются по правилам SIMBAD. Внимание к неоднозначным именам — "Abell 35" это скопление галактик; планетарная туманность — "PN A66 35".

Радиус конуса — --radius 5 (градусы; по умолчанию из FOV, иначе широкий). Прореживание--downsample 2 (2–4 ускоряют большие кадры; было захардкожено 1).

Проверка индексов: перед решением autosolve сам сверяет масштаб кадра с установленными индексами и, если ни один не подходит, печатает предупреждение с подсказкой, какие шкалы докачать (и откуда). Вручную: wsl bash -lc "ls /usr/share/astrometry" показывает установленные индексы; в режиме -v видно, какие индексы solve-field перебирает.

Имя выходного файла: если output задан — решённый результат получает ровно это имя (суффикс не добавляется); если output опущен — файлы кладутся рядом со входом с суффиксом _wcs_rect при --rectify).

Примеры:

autosolve light0001.fit solved0001.fit
autosolve --rectify --rect-center-ra 180.5 --rect-center-dec 45.2 *.fit out0001.fit
autosolve *.jpg --jpeg 95            # решить JPEG-и, вернуть JPEG с WCS в заголовке
# Безголовый JPEG с подсказками имени и поля зрения:
autosolve helix.jpg helix_wcs.jpg --name "NGC 7293" --fovy 0.5 --downsample 2 --jpeg 99

Установка astrometry.net (Windows, через WSL):

# 1. Установить WSL (из PowerShell с правами администратора):
wsl --install

# 2. В WSL установить astrometry.net:
sudo apt update
sudo apt install astrometry.net

# 3. Скачать индексные файлы (выбрать нужные для вашего масштаба):
#    http://data.astrometry.net/4200/
#    Файлы index-42XX.fits — номер определяет диапазон FOV:
#      4219 = 00-10'     (узкое поле, маленький сенсор / длинный фокус)
#      4218 = 10-22'
#      4217 = 22-44'
#      4216 = 44'-2°
#      4215 = 2°-2.8°
#      4214 = 2.8°-4°
#      4213 = 4°-5.6°
#      4212 = 5.6°-8°    (типичный полнокадровый + средний фокус)
#      4211 = 8°-11°
#      4210 = 11°-16°
#      4209 = 16°-22°    (широкоугольные объективы)
#      4208 = 22°-30'
#      4207 = 30°-40°    (сверхширокоугольные)
#    Скачайте те, которые покрывают FOV вашего телескопа/объектива.

# Примеры скачивания:
cd /usr/share/astrometry
sudo wget http://data.astrometry.net/4200/index-4212.fits
sudo wget http://data.astrometry.net/4200/index-4213.fits

# 4. Проверить установку:
solve-field --help

Python-зависимости: scipy, reproject (pip install scipy reproject)


fits2tiff.py

Назначение: Конвертация FITS-изображений в TIFF, JPEG или PNG.

Особенности:

  • Выходной формат определяется расширением файла (.tif, .jpg, .png) или флагом --format
  • Выбор битности: 8-bit (stretch), 16-bit (clamp), 32-bit float (нормализация к [0,1])
  • Автоопределение битности по типу данных FITS
  • Wildcard в выходном шаблоне: *.tif сохраняет имена входных файлов
  • 32-bit float нормализуется к [0.0, 1.0] для совместимости с Photoshop
  • --stretch — авто screen transfer (MTF-подобный нелинейный stretch)
  • --keepcolor — сохранение цвета при stretch (растягивает яркость, масштабирует RGB)
  • --bin 2|4 — даунсэмплинг (аналог биннинга) перед сохранением
  • --jpeg Q — качество JPEG (1-100, по умолчанию 95)

Зависимости: Pillow (pip install Pillow)

Синтаксис:

fits2tiff.py [--bits 8|16|32] [--format tiff|jpeg|png] [--stretch] [--keepcolor] [--bin 2|4] [--jpeg Q] [--flip] input_spec output_spec

Параметры:

  • input_spec — входные файлы (стандартные форматы: файл, маска, последовательность, @список)
  • output_spec — выходной файл .tif/.jpg/.png, нумерованный шаблон или wildcard
  • --bits 8 — линейный stretch [min,max] → [0,255], uint8
  • --bits 16 — clamp к [0,65535], uint16
  • --bits 32 — нормализация [min,max] → [0.0,1.0], float32
  • (без --bits) — авто: int8/uint8→8, int16/uint16→16, остальное→32
  • --format F — формат выхода: tiff, jpeg, png (по умолчанию по расширению)
  • --stretch — нелинейный авто stretch для экранного отображения; уважает --bits для TIFF (16/32 = растянутый TIFF без бандинга), JPEG/PNG остаются 8-бит
  • --keepcolor — сохранение цвета при stretch
  • --bin 2|4 — даунсэмплинг в 2 или 4 раза
  • --jpeg Q — качество JPEG (1-100)
  • --flip — вертикальное отражение (FITS bottom-left → TIFF top-left)

При конвертации в JPEG и PNG полный FITS-заголовок автоматически сохраняется в метаданных файла (WCS координаты, имя объекта, экспозиция и т.д.)

Примеры:

:: Одиночный файл (авто битность)
fits2tiff image.fit image.tif

:: Пакетная конвертация с сохранением имён
fits2tiff *.fit *.tif

:: 8-bit для превью
fits2tiff --bits 8 light0001.fit preview0001.tif

:: JPEG с авто stretch для превью
fits2tiff --stretch --bin 2 *.fit *.jpg

:: Растянутый 16-битный TIFF (без бандинга, для дальнейшего редактирования)
fits2tiff sum_l.fit out_l.tif --stretch --bits 16

:: Нумерованный выход
fits2tiff --bits 16 *.fit out0001.tif

tiff2fits.py

Назначение: Конвертация TIFF-изображений обратно в формат FITS с восстановлением заголовков.

Особенности:

  • Автоматическое восстановление заголовков из перезаписываемого FITS-файла
  • Явное указание источника заголовков через --header
  • Поддержка TIFF 8-bit (L), 16-bit (I;16), 32-bit float (F)
  • RGB TIFF автоматически конвертируется в grayscale

Зависимости: Pillow (pip install Pillow)

Логика заголовков (приоритет):

  1. --header source.fit — заголовки из указанного файла
  2. Выходной файл уже существует — заголовки читаются из него до перезаписи
  3. Ни то ни другое — минимальный заголовок (только размеры и тип данных)

Синтаксис:

tiff2fits.py [--flip] [--header source.fit] input_spec output_spec

Параметры:

  • input_spec — входные TIFF (файл, маска, нумерованная последовательность, @список)
  • output_spec — выходной FITS, нумерованный шаблон (out0001.fit) или wildcard (*.fit)
  • --header F — взять FITS-заголовки из файла F (применяется ко всем выходным)
  • --flip — вертикальное отражение (обратное к fits2tiff --flip)

Примеры:

:: Обратная конвертация — заголовки берутся из перезаписываемых .fit файлов
tiff2fits *.tif *.fit

:: С явным указанием источника заголовков
tiff2fits edited.tif result.fit --header original.fit

:: Пакетная конвертация с нумерацией
tiff2fits img0001.tif out0001.fit --header reference.fit

Типичный workflow (Photoshop):

:: 1. Экспорт в TIFF
fits2tiff *.fit *.tif

:: 2. Редактирование в Photoshop, сохранение .tif

:: 3. Импорт обратно — заголовки подхватятся из существующих .fit
tiff2fits *.tif *.fit

raw2fits.py

Назначение: Конвертация Camera RAW файлов в FITS с сырыми данными Bayer-матрицы. Пока поддерживается только Canon CR2/CR3.

Особенности:

  • Режим по умолчанию: сырая CFA Bayer мозаика (2D монохромный uint16, оригинальные значения сенсора)
  • Опция --debaer: линейная дебаеризация в 3-канальный RGB FITS (uint16)
  • Полный маппинг EXIF → FITS заголовок (камера, экспозиция, ISO, дата, температура)
  • Встроенный парсер CR3 ISOBMFF (не требует внешних утилит для нового формата Canon)
  • Парсинг Canon MakerNote для температуры корпуса камеры (CCD-TEMP)
  • Автоопределение dark/light по доле ярких пикселей
  • Wildcard в выходном шаблоне: *.fit сохраняет имена входных файлов

Зависимости: rawpy (pip install rawpy), exifread (pip install exifread)

Маппинг EXIF → FITS заголовок:

Источник FITS keyword Описание
Make + Model INSTRUME Производитель и модель камеры
ExposureTime EXPTIME, EXPOSURE Время экспозиции в секундах
ISOSpeedRatings GAIN Значение ISO
DateTimeOriginal DATE-OBS Дата/время наблюдения (ISO формат)
(из DATE-OBS) JD Юлианская дата
Canon ShotInfo CCD-TEMP Температура корпуса камеры (Цельсий)
raw_pattern BAYERPAT Паттерн Bayer (например RGGB)
(автоопределение) IMAGETYP "Dark Frame" или "Light Frame"
FILTER "CFA" (raw) или "RGB" (debaer)
black_level_per_channel BLKLVL_R/G/B/G2 Уровни чёрного по каналам

Синтаксис:

raw2fits.py [--debaer] [--debug] input_spec output_spec

Параметры:

  • input_spec — входные RAW файлы (файл, маска *.cr2, нумерованная последовательность IMG0001.CR3, @list.txt)
  • output_spec — выходной FITS, нумерованный шаблон (out0001.fit) или wildcard (*.fit)
  • --debaer — дебаеризация в линейный RGB вместо сырого CFA
  • --debug — запись детального диагностического лога (<имя_файла>.log) для каждого файла

Примеры:

:: Одиночный файл
raw2fits IMG_0001.CR2 test.fit

:: Пакетная конвертация с сохранением имён
raw2fits *.cr3 *.fit

:: Нумерованный выход
raw2fits IMG0001.CR3 out0001.fit

:: Дебаеризованный RGB
raw2fits --debaer *.cr3 *.fit

:: Debug режим (создаёт .log файлы)
raw2fits --debug IMG_0001.CR3 test.fit

fft_align.py

Назначение: FFT-выравнивание кадров (поворот, масштаб, субпиксельный сдвиг).

Особенности:

  • Фазовая корреляция для поиска сдвига
  • Пирамидальный поиск угла и масштаба
  • Постобработка: локальная аффинная коррекция
  • Параллельная обработка

Синтаксис:

fft_align.py reference input_spec output_spec [options]

Основные опции:

  • --superfine — пирамидальный режим высокой точности
  • --post-correction — локальная аффинная коррекция
  • --max-angle N — максимальный угол поиска (по умолчанию 5°)
  • --scale-delta N — диапазон масштаба ±N (по умолчанию 0.01)
  • --flux — режим сохранения потока (линейная интерполяция)

Примеры:

fft_align ref.fit light0001.fit aligned0001.fit
fft_align ref.fit *.fit out0001.fit --superfine --post-correction
fft_align ref.fit light0001.fit aligned0001.fit --flux --max-angle 2

absession.py

Назначение: Генерация CSV-списка фотосессий для импорта в AstroBin.

Особенности:

  • Рекурсивный обход директории с FITS файлами
  • Два режима: по FITS-заголовкам (по умолчанию) или по имени файла (--parsename, без зависимостей)
  • Дата сессии из DATE-OBS (или mtime файла как fallback); ночная съёмка до полудня → предыдущий день
  • Группировка по дате, фильтру и экспозиции
  • CSV выход совместим с форматом импорта AstroBin
  • Сводная статистика по фильтрам

Зависимости: astropy (режим по умолчанию), нет (режим --parsename)

Формат CSV (AstroBin):

date,filter,number,duration
2024-03-15,5656,12,600
2024-03-15,5642,10,300

Коды фильтров AstroBin:

ВАЖНО: Коды фильтров в скрипте — это ПРИМЕРЫ. Вы ДОЛЖНЫ отредактировать словарь ASTROBIN_FILTER_IDS в файле absession.py, указав ID ваших фильтров с AstroBin. Найдите ваш фильтр на странице: https://app.astrobin.com/equipment/explorer/filter?page=1 ID фильтра — число в URL страницы фильтра, например: .../filter/4388/filter-name-... → ID = 4388

Фильтр ID (пример)
L 5652
R 5656
G 5646
B 5642
Ha 4388
SII 4396
OIII 4392

Синтаксис:

absession.py [options] [directory]

Параметры:

  • directory — путь для сканирования (по умолчанию текущая директория)
  • --parsename — извлекать фильтр и экспозицию из имён файлов (без зависимостей)
  • --out FILE — записать CSV в файл (по умолчанию stdout)
  • --flat — не рекурсировать в поддиректории

Формат имени файла (режим --parsename):

Name_Type_FILTER_SeqNum_Binning_EXPOSURE_Temp.fit

Пример: NGC253_L_R_54205_Bin1x1_120s_-10C.fit
         |      | | |     |      |    |
         |      | | |     |      |    +-- температура (игнорируется)
         |      | | |     |      +------ экспозиция: 120 секунд
         |      | | |     +------------- биннинг (игнорируется)
         |      | | +------------------- порядковый номер (игнорируется)
         |      | +--------------------- ФИЛЬТР: R, G, B, L, Ha, SII, OIII
         |      +----------------------- тип экспозиции (игнорируется)
         +------------------------------ имя объекта

Мозаика (номер поля в имени объекта, например "M8_02"):
M8_02_L_G_11788_Bin1x1_120s_-10C.fit
|  |  | | |     |      |    |
|  |  | | |     |      |    +-- температура (игнорируется)
|  |  | | |     |      +------ экспозиция: 120 секунд
|  |  | | |     +------------- биннинг (игнорируется)
|  |  | | +------------------- порядковый номер (игнорируется)
|  |  | +--------------------- ФИЛЬТР: G
|  |  +----------------------- тип экспозиции (игнорируется)
|  +-------------------------- номер поля мозаики (игнорируется)
+------------------------------ имя объекта

Определение: 7 полей (без расширения) = обычный кадр, 8 полей = мозаика. Используются только поля FILTER и EXPOSURE; остальные игнорируются. Этот формат имени можно настроить в APT, N.I.N.A., SGPro или другом софте управления съёмкой.

Определение даты сессии: файлы с DATE-OBS (или mtime) до 12:00 считаются частью вечерней сессии предыдущего дня.

Примеры:

:: Текущая директория (читает FITS-заголовки)
absession

:: Конкретная директория
absession C:\Astro\NGC3576

:: Парсинг имён файлов (без astropy)
absession --parsename C:\Astro\NGC3576

:: Сохранить в файл
absession --out sessions.csv C:\Astro\Data

:: Без рекурсии
absession --flat .

Пример вывода:

Scanning 47 FITS files...

date,filter,number,duration
2024-03-15,5656,12,600
2024-03-15,5642,10,300
2024-03-16,5652,25,120

Total files: 47
Exposure: 28200 ( 7h 50m )

L: 25 x 2 min ( 0h 50m )
R: 12 x 10 min ( 2h 0m )
B: 10 x 5 min ( 0h 50m )

staralign.py

Назначение: Выравнивание астрономических кадров по звёздам.

Автоматически находит звёзды на кадрах, сопоставляет их и выравнивает изображения с субпиксельной точностью. Поддерживает масштаб, поворот, зеркальное отражение и нелинейные искажения (TPS). Работает в кросс-фильтровом режиме (например, выравнивание Ha по R-референсу).

Зависимости: scipy, sep

Режимы работы:

  1. С --ref — выравнивание всех кадров на указанный референсный кадр по звёздам.
  2. Без --ref, несколько кадров (по умолчанию) — выравнивание всех кадров на первый кадр.
  3. Без --ref, один файл или --rgb — коррекция хроматизма: выравнивание каналов R и B по G внутри каждого файла (атмосферная рефракция + хроматическая аберрация).

Синтаксис:

staralign input_spec output_spec [--ref reference.fit] [options]
staralign *.fit out0001.fit                 (без --ref: на первый кадр)
staralign color.fit corrected.fit           (один файл: коррекция хроматизма)
staralign *.fit out0001.fit --rgb           (хроматизм для каждого файла)

Параметры:

Параметр По умолч. Описание
--ref FILE первый кадр Референсный кадр (без него по умолчанию берётся первый входной кадр)
--model {tps|projective} tps Модель регистрации
--smoothness F 0.25 Гладкость TPS (0 = точная интерполяция)
--descriptors N 20 Пентагонов на звезду (5-50)

Параметры сопоставления:

Параметр По умолч. Описание
--hash-tol F 0.05 Толеранс хешей пентагонов в 6D. Увеличить до 0.1-0.15 для кросс-фильтра
--angle-tol F 0.15 Толеранс угловой верификации (рад). Увеличить до 0.25-0.3 для разреженных полей
--min-vote N 2 Мин. голосов хешей для пары. Поставить 1 для сложных случаев
--tolerance F 3.0 Толеранс RANSAC (пиксели). Увеличить до 5-10 для больших искажений

Детекция звёзд:

Параметр По умолч. Описание
--snr F 5.0 Порог SNR (меньше = больше звёзд)
--max-stars N 150 Макс. звёзд. При неудаче автоповтор с 2x, 2.5x, 3x
--no-retry выкл Отключить автоповтор с большим числом звёзд

Прочее:

Параметр По умолч. Описание
--threads N CPU-1 Рабочие потоки (1 в режиме --debug)
--debug выкл Подробная диагностика по каждому кадру
--no-mirror выкл Не пробовать зеркальное отражение
--rgb выкл Коррекция хроматизма (R,B→G) в каждом входном файле вместо выравнивания кадров

Автоповтор: при неудаче сопоставления скрипт автоматически повторяет с увеличенным числом звёзд: [N, 2N, 2.5N, 3N], но не более числа обнаруженных. Отключить: --no-retry.

Рекомендации по сложным случаям:

Ситуация Рекомендуемые настройки
Один фильтр, один телескоп настройки по умолчанию
Кросс-фильтр (R vs Ha) --max-stars 200
Разные фокусные расстояния --tolerance 5 или выше
Разреженное поле (<30 звёзд) --min-vote 1 --angle-tol 0.25
Большая разница в числе звёзд --max-stars 300 --hash-tol 0.1

Вывод: для каждого кадра — [N/M] filename: OK inliers, tps_pairs, residual_px или FAIL reason.

  • inliers — пары звёзд, прошедшие RANSAC
  • tps_pairs — пары для финального TPS-варпа (обычно 30-300)
  • residual_px — медианная ошибка позиции в пикселях (меньше = лучше)

Итоговая строка: количества, время, список неудачных файлов.

Примеры:

:: Выровнять все кадры по референсу
staralign *.fit out0001.fit --ref ref.fit

:: Кросс-фильтр: R-референс, Ha-таргеты
staralign Ha_*.fit aligned0001.fit --ref R_ref.fit --max-stars 200

:: Многопоточный режим
staralign *.fit out0001.fit --ref ref.fit --threads 4

:: Без --ref: выровнять все кадры на первый
staralign *.fit out0001.fit

:: Коррекция хроматизма в одном RGB-файле
staralign color.fit corrected.fit

:: Батч коррекции хроматизма (каждый файл поканально)
staralign *.fit out0001.fit --rgb

Зависимости

Обязательные:

  • Python 3.6+
  • numpy
  • astropy

Для продвинутых функций:

  • scipy (fft_align, autoflat, autosolve, staralign)
  • reproject (autosolve ректификация)
  • astrometry.net (autosolve решение)
  • Pillow (fits2tiff, tiff2fits, autosolve JPEG вход/выход)
  • rawpy (raw2fits)
  • exifread (raw2fits)
  • sep (bestof, rgbbalance --autostar, sub --continuum, staralign)
  • xisf (xisf2fits)

Установка

Windows — автоматический инсталлятор: запустите setup.bat в корне проекта. Он проверит Python, установит зависимости и добавит команды в PATH.

Только PATH (без установки зависимостей): запустите Commands\setup.bat для добавления папки Commands в PATH.

После этого скрипты доступны как команды: add, sub, med, calibrate и т.д.


binxy.py

Назначение: Программный биннинг 2×2 / 4×4 пикселей.

Уменьшает размеры изображения суммированием соседних пикселей. Поддерживает 2D (H×W) и 3D (N×H×W) FITS.

Синтаксис:

binxy input_spec output_spec --2|--4 [--keep_bitness]

Параметры:

  • --2 — биннинг 2×2 (уменьшение размеров в 2 раза)
  • --4 — биннинг 4×4 (два прохода 2×2)
  • --keep_bitness — целочисленные: делить сумму на 4, не повышать разрядность

Поведение по типу данных:

Вход Операция Выход
Integer Сумма блока 2×2 Повышение разрядности при переполнении (8→16→32→64)
Integer + --keep_bitness Сумма блока 2×2 → // 4 Как на входе
Float Среднее блока 2×2 (×0.25) Как на входе

Обновляет заголовки XPIXSZ, YPIXSZ, XBINNING, YBINNING. Нечётные размеры обрезаются до чётных.

Примеры:

:: Биннинг 2x2
binxy img0001.fit out0001.fit --2

:: Биннинг 4x4 (последовательность)
binxy img0001.fit out0001.fit --4

:: 2x2, сохранить разрядность (целочисленное деление на 4)
binxy img0001.fit out0001.fit --2 --keep_bitness

crop.py

Назначение: Обрезка FITS-изображений по размеру/центру или полям.

Два режима: фиксированный размер выхода с точкой центра, или обрезка полей по краям. Поддерживает автоцентрирование на самом ярком объекте. Выход за границы заполняется нулями.

Синтаксис:

crop input_spec output_spec [options]

Режим 1 — Обрезка по размеру:

  • --width WW — ширина выхода в пикселях
  • --height HH — высота выхода в пикселях
  • --center XX YY — точка центра (по умолчанию — центр изображения)
  • --autocenter [P] — автоопределение центра по яркости (P — порог, по умолчанию 50)
  • --positions FILE — центры из CSV-файла

Формат CSV для --positions:

filename,cx,cy
009A7220.fit,1960,1091
009A7221.fit,1960,1091

Дополнительные колонки (например radius) игнорируются.

Режим 2 — Обрезка полей:

  • --top N, --bottom N, --left N, --right N — пиксели для обрезки

Примеры:

:: Обрезка 1000x1000 из центра
crop img.fit out.fit --width 1000 --height 1000

:: Обрезка вокруг заданной точки
crop img.fit out.fit --width 1000 --height 1000 --center 3000 2000

:: Автоцентр на ярчайшем объекте
crop img.fit out.fit --width 1000 --height 1000 --autocenter

:: Обрезка полей
crop img0001.fit out0001.fit --top 100 --bottom 100 --left 200 --right 200

debayer.py

Назначение: Демозаик Bayer-паттерна в 3-канальный RGB FITS.

Вход: 2D монохромный FITS с CFA Bayer-паттерном (H×W). Выход: 3-канальный RGB FITS (3×H×W).

Синтаксис:

debayer input_spec output_spec [--pattern PAT] [--method METHOD]

Параметры:

  • --pattern PAT — Bayer-паттерн: RGGB, BGGR, GRBG, GBRG (по умолчанию: из заголовка BAYERPAT или RGGB)
  • --method METHOD — алгоритм демозаика

Методы:

Метод Качество Скорость Зависимости
bilinear Базовый Быстрый Нет (numpy)
vng Высокий (VNG) Средний OpenCV (pip install opencv-python)

Примеры:

:: По умолчанию (bilinear, паттерн из заголовка)
debayer img0001.fit out0001.fit

:: VNG с явным паттерном
debayer *.fit rgb/ --method vng --pattern RGGB

hotfix.py

Назначение: Удаление одиночных горячих (и холодных) пикселей.

Для каждого пикселя вычисляет среднее и стандартное отклонение 8 соседей. Если пиксель превышает mean + N*sigma, заменяет его средним соседей. Звёзды сохраняются: их PSF занимает несколько пикселей, поэтому соседи звезды тоже яркие. Полностью векторизован (без циклов по пикселям). Поддерживает 2D и 3D FITS.

Синтаксис:

hotfix input_spec output_spec [options]

Параметры:

  • --sigma N — порог обнаружения в стандартных отклонениях (по умолчанию 5)
  • --floor N — минимальный уровень шума в ADU (по умолчанию auto)
  • --cold — также исправлять холодные (мёртвые) пиксели ниже mean - N*sigma
  • --debug — диагностический вывод для первого файла

Примеры:

:: По умолчанию (5 sigma, только горячие)
hotfix img0001.fit out0001.fit

:: Строже порог
hotfix *.fit fixed/ --sigma 7

:: Горячие и холодные пиксели
hotfix img0001.fit out0001.fit --sigma 4 --cold

mtf.py

Назначение: Midtone Transfer Function (PixInsight-совместимая) с auto black/white и сохранением цвета.

Применяет нелинейную кривую тона: mtf(x, m) = (1-m)*x / (m + x*(1-2*m))

Кривая проходит через (0,0), (m, 0.5), (1,1), где m — баланс средних тонов.

Синтаксис:

mtf input_spec output_spec K [K2 K3 ...] [options]
mtf input_spec output_spec --median T [options]
mtf input_spec output_spec --inverse

Параметры:

  • K [K2 K3 ...] — один или несколько значений midtones balance (0..1). Несколько K: результат = среднее MTF по всем K. Дубликаты = веса.
  • --median T (-m T) — вместо явного K подобрать K так, чтобы медиана кадра попала в T (0..1); для цвета медиана берётся по яркости. Взаимоисключающе с K.
  • --zero (-z) — обработка нулей (границы выровненных кадров / невалид): игнорировать нули при подсчёте --median и восстановить нули входа на выходе, чтобы MTF не сдвигала 0 в ненулевое.
  • --auto — автоматическое определение black/white уровней (linked для цветных)
  • --autoblack / --autowhite — по отдельности
  • --keepcolor [K] — сохранение цвета через luminance ratio (K=1 полное, K<1 blend)
  • --keepcolor-hsl [K] — сохранение через HSL (лучше для агрессивного stretch)
  • --equal — равновесная luminance (R+G+B)/3 вместо (R+2G+B)/4
  • --clip [P] — клиппинг по перцентилю
  • --inverse — численно обратить ранее применённый MTF и восстановить линейные данные. Берёт только вход и выход (без K). Ошибка, если записи нет или преобразование необратимо.

Обратимое преобразование: каждый прямой проход записывает точное преобразование в FITS-заголовок (флаг MTFINV + MTFK/MTFBLK/MTFWHT/MTFNMIN/MTFNMAX/MTFLUM/MTFCOL), так что --inverse восстанавливает линейность «по числам» — напр. растянуть → убрать звёзды → --inverse. Обращение точно только для ненасыщенных пикселей (значения, упёршиеся в 0/1, теряются); для лучшей точности держи промежуток во float. Необратимо: несколько K, --clip, частичный --keepcolor (0<K<1).

Auto black: 3% самых тёмных ячеек фона → median - 5×MAD. Auto white: медиана верхних 0.01% пикселей. Linked для цвета: black = min(channels), white = max(channels).

Примеры:

:: Осветлить средние тона
mtf img.fit out.fit 0.2

:: Мульти-MTF: тени + хайлайты
mtf img.fit out.fit 0.1 0.1 0.4

:: По целевой медиане (для выровненных кадров добавить --zero)
mtf img.fit out.fit --median 0.25 --auto
mtf aligned.fit out.fit --median 0.25 --auto --zero

:: Обратное преобразование (восстановить линейность по записи в заголовке)
mtf stretched.fit linear.fit --inverse

:: С автоматическими границами
mtf img.fit out.fit 0.15 --auto

:: Агрессивный stretch с HSL сохранением цвета
mtf img.fit out.fit 0.01 --keepcolor-hsl --auto

rgbbalance.py

Назначение: Баланс цвета и яркости для цветных RGB FITS.

Нейтрализует фон, применяет баланс белого (авто или ручной), нормализует яркость в серии кадров. Вход: 3-канальный RGB FITS (3×H×W).

Синтаксис:

rgbbalance input_spec output_spec [options]

Параметры:

  • --auto [file] — авто баланс белого: масштаб R и B к диапазону G. Эталон из файла (по умолчанию первый вход)
  • --autoeach — авто баланс белого вычисляется независимо для каждого файла
  • --rgb R G B — ручные коэффициенты масштабирования каналов
  • --autostar [file] — баланс белого по звёздам: детекция звёзд на G канале, кросс-матчинг с R и B (толерантность 1.5 px), апертурная фотометрия, вычисление K по суммарным потокам. Точнее чем --auto для узкополосных/широкополосных миксов. Эталон из файла (по умолчанию первый вход)
  • --snr N — порог SNR для детекции звёзд в --autostar (по умолчанию 38)
  • --warmth W — сдвиг цветовой температуры вдоль кривой Планка (-1..+1, default 0)
  • --kmin N — процент тёмных пикселей для оценки чёрного уровня (по умолчанию 5)
  • --kmax N — процент ярких пикселей для оценки белого уровня (по умолчанию 5)

--rgb, --auto, --autoeach, --autostar взаимоисключающие. Без них — только нейтрализация фона и нормализация яркости.

Алгоритм:

  1. Квантильные медианы для каждого канала (нижние kmin%, верхние kmax%)
  2. Нейтрализация чёрного: сдвиг каналов к среднему min_median
  3. Цветовой баланс вокруг чёрной точки (авто: K_R = range_G/range_R)
  4. Нормализация яркости между кадрами

Примеры:

:: Авто баланс белого
rgbbalance img0001.fit out0001.fit --auto

:: Авто баланс по конкретному эталону
rgbbalance img0001.fit out0001.fit --auto ref.fit

:: Ручные коэффициенты
rgbbalance img0001.fit out0001.fit --rgb 1.1 2.0 0.5

:: Только нормализация фона и яркости
rgbbalance img0001.fit out0001.fit

:: Баланс белого по звёздам
rgbbalance img.fit out.fit --autostar
rgbbalance img0001.fit out0001.fit --autostar ref.fit --snr 50

stack.py

Назначение: Оптимальное взвешенное сложение с sigma-fade отсечением.

Многопроходный алгоритм: анализ кадров → взвешенное среднее → итеративный sigma-clip с плавным подавлением выбросов. Вес каждого кадра определяется по SNR² и/или FWHM.

Алгоритм:

  1. Pass 0: Анализ — детекция звёзд, измерение SNR/FWHM, кэш фона
  2. Pass 1: Взвешенное среднее нормализованных кадров
  3. Pass 2: RMS deviation map (bg-subtracted сравнение)
  4. Pass 3: Sigma-clip с fade (оригинальные значения в сумму)
  5. Итерации 2+: повтор passes 2-3 с уточнённым средним

Синтаксис:

stack.py input_spec output.fit [options]

Sigma clipping (без --sigma — простая взвешенная сумма):

  • --sigma [N] — порог (default 2.3)
  • --fade N — ширина fade (default 0.7). Диапазон отсечения: [sigma .. sigma+fade]
  • --iter [N] — итерации (default 2)

Веса:

  • По умолчанию: SNR² (кадры с лучшим соотношением сигнал/шум получают больший вес)
  • --fwhm [K] — добавить вес по FWHM: weight *= MTF(FWHM_rank, K)
  • --nosnr — отключить SNR² (только FWHM)
  • --equalize [K] — притянуть все веса кадров к равным на долю K∈[0,1] (default 1.0 = полностью равные). Отключает SNR/FWHM-взвешивание в сумме, но сохраняет пер-кадровую нормализацию и сигма-клип (fade). Для кадров с несравнимым SNR (например, в сильно разном масштабе после разных преобразований). По умолчанию выкл.; K=0 — без изменений. Клиппинг/RMS всегда считаются на оптимальных весах и от K не зависят — эквализация меняет только вклад кадра в итоговую сумму. Формула: веса нормируются к среднему=1, затем Wnew = w·(1−K)+K

Прочее: --border N (1), --threads N, --debug [FILE]

Фон: --cell N (64), --clip K (1.7), --poly N (3), --mask-center [D]

Граничный фон (--bg-border [W], opt-in, по умолчанию выкл.): оценивать пер-кадровый уровень неба (dark) по тонкому кольцу данных у реального края кадра, а не по всему кадру. Для мозаик из кадров разных футпринтов с центрированным объектом это убирает DC-шов на границе футпринта (кольцо свободно от объекта → несмещённое небо). W — ширина кольца в px (default авто = 5% короткой стороны). Внешняя no-data область определяется заливкой от края (внутренние дыры исключаются); полный кадр без no-data → внешняя рамка; вырожденное кольцо → откат к фону по всему кадру. Не использовать, если объект касается края.

Starless SNR (опционально; дефолтный звёздный SNR не меняется): По умолчанию сигнал кадра (для веса SNR² и нормировки) = медиана потока опорных звёзд, поэтому на поле без звёзд stack завершается с ошибкой. --starless оценивает сигнал по ярким клеткам: кадр режется на мелкие клетки (--signal-cell N, default 16, авто-уменьшение 16→8→4→2→1); сигнал-клетки = валидные на всех кадрах (без нулей и пересвета) и с mean − фон > 5σ на всех кадрах; сигнал = медиана (по средним 30% клеток по яркости) от mean − фон. Пересвет = --sat-frac F (default 0.5) × робастный максимум кадра (P99.5); отключается, если порог попадает в диапазон неба/сигнала. Если даже на 1px клетках найдено <3 — stack завершается с ненулевым кодом (вызывающий может сделать фоллбэк к медиане/сумме). --fwhm в starless-режиме игнорируется.

Примеры:

:: Простое взвешенное сложение (без sigma)
stack *.fit result.fit

:: С sigma-clip (по умолчанию sigma=2.3, fade=0.7, 2 итерации)
stack *.fit result.fit --sigma

:: Вес по SNR² и FWHM
stack *.fit result.fit --sigma --fwhm

:: Только по FWHM, без SNR
stack *.fit result.fit --fwhm --nosnr

:: Равный вклад кадров (несравнимый SNR), нормализация и сигма-клип сохранены
stack *.fit result.fit --sigma --equalize

:: С debug логом
stack *.fit result.fit --sigma --debug log.txt

:: Поле без звёзд (туманность) — сигнал по ярким клеткам
stack neb_*.fit result.fit --sigma --starless
stack neb_*.fit result.fit --starless --signal-cell 8

:: Мозаика кадров разных футпринтов с центрированным объектом — небо по краевому кольцу
stack obj_*.fit result.fit --sigma --bg-border

lrgb.py

Назначение: LRGB композиция — совмещение высокодетального L-канала с цветовыми данными RGB.

Методы:

  • ratio (default) — C_out = C × L_fit / (R+G+B + ε), сохраняет цветовые соотношения точнее. Знаменатель R+G+B (не перцептивный (R+2G+B)/4) даёт тождество Σ C_out = L_fit и согласован с super-luminance
  • hsl — RGB→HSL, замена L (после LinearFit), HSL→RGB

Super-luminance (--superlum): опциональное построение мастер-яркости с максимальным SNR — инверсно-дисперсионная (SNR²) смесь L и синтетической яркости R+G+B (обе после подгонки шкал). Шум оценивается по фону, печатается отношение SNR_L:SNR_syn и ожидаемый выигрыш. По умолчанию выключено: L используется как есть (входной L уже может быть super-luminance). Допущение: RGB должен быть уже сбалансирован — иначе синтетическая яркость R+G+B перекошена и веса SNR смещаются; используйте --auto или пред-баланс каналов.

Синтаксис:

lrgb.py L.fit R.fit G.fit B.fit output.fit [options]
lrgb.py L.fit RGB.fit output.fit [options]

Параметры:

  • --method M — ratio (default) или hsl
  • --saturation S — boost насыщенности (default 1.0, L подавляет saturation)
  • --warmth W — сдвиг цветовой температуры вдоль кривой Планка (-1..+1, default 0)
  • --lightness K — MTF на lightness (default 0.5 = identity)
  • --superlum — построить super-luminance (SNR²-смесь L + R+G+B) перед совмещением
  • --dry-run — измерить и напечатать отношение шумов L:syn и ожидаемый выигрыш SNR, без записи
  • --eps E — пол знаменателя ratio-метода (default 0.002, нормированные [0,1]); только численная стабильность в тенях
  • --bg-desat K — тянуть слабосигнальные пиксели к нейтральному серому: цвет сохраняется для сигнала ≥ K·σ над фоном, гаснет ниже (default 0 = выкл; типично 2–4). Каноническая чистка цветового шума фона
  • --auto — полный пайплайн: баланс RGB + выравнивание фона + LRGB-совмещение
  • --mask-center — использовать центральную область для оценки фона (для --auto)

Примеры:

:: 4 моно файла, ratio метод (default)
lrgb L.fit R.fit G.fit B.fit result.fit

:: L + готовый RGB, HSL метод
lrgb L.fit RGB.fit result.fit --method hsl

:: С boost насыщенности
lrgb L.fit R.fit G.fit B.fit result.fit --saturation 1.3

:: Super-luminance (+SNR) с нейтрализацией фона
lrgb L.fit R.fit G.fit B.fit result.fit --superlum --bg-desat 3

:: Только измерить ожидаемый выигрыш SNR
lrgb L.fit R.fit G.fit B.fit result.fit --superlum --dry-run

:: Полный автоматический пайплайн
lrgb --auto L.fit R.fit G.fit B.fit result.fit

bestof.py

Назначение: Отбор лучших кадров по FWHM (качество атмосферы).

Анализирует FWHM звёзд на наборе FITS-изображений с помощью детекции на основе SEP. Может копировать лучшие N% кадров, фильтровать по порогу FWHM и/или записать CSV-отчёт.

Зависимости: sep (pip install sep)

Синтаксис:

bestof input_spec [output_spec] [опции]

Режимы отбора (хотя бы один обязателен, если не указан только --csv):

  • --best P — копировать лучшие P процентов кадров (наименьший FWHM), 1-99
  • --threshold T — копировать кадры с FWHM <= T пикселей

Опции:

  • --csv FILE — записать CSV-отчёт: fwhm,filename (отсортировано по FWHM)
  • --snr N — порог SNR для детекции звёзд (по умолчанию 10)

Примеры:

bestof light0001.fit best0001.fit --best 70
bestof *.fit selected/ --threshold 3.5
bestof *.fit --csv report.csv
bestof *.fit best/ --best 80 --csv report.csv

rgb.py

Назначение: Объединение/разделение RGB каналов в FITS-файлах.

Merge: объединяет 3 монохромных 2D FITS (R, G, B) в один 3-канальный RGB FITS (3, H, W). Split: извлекает R, G, B каналы из RGB FITS (3, H, W) в 3 монохромных FITS. Прописывает FILTER = R/G/B в хидер каждого канала.

Синтаксис:

rgb --merge inR inG inB --out outRGB
rgb --split inRGB --out outR outG outB

Параметры: Все аргументы файлов поддерживают стандартные спецификации: один файл, маска, нумерованная последовательность, @list.txt. Для merge все три входа должны содержать одинаковое количество файлов.

Примеры:

# Объединить одиночные файлы
rgb --merge r.fit g.fit b.fit --out rgb.fit

# Объединить последовательности
rgb --merge r0001.fit g0001.fit b0001.fit --out rgb0001.fit

# Разделить одиночный файл
rgb --split rgb.fit --out r.fit g.fit b.fit

# Разделить последовательность
rgb --split rgb0001.fit --out r0001.fit g0001.fit b0001.fit

xisf2fits.py

Назначение: Конвертация XISF (PixInsight) файлов в формат FITS.

Сохраняет данные пикселей как есть (float32/float64/uint16, без конвертации типов). Восстанавливает ключевые слова FITS-хидера из метаданных XISF FITSKeyword. Обрабатывает RGB (конвертация осей HWC→CHW) и монохромные изображения.

Зависимости: xisf (pip install xisf)

Синтаксис:

xisf2fits input_spec output_spec

Параметры:

  • input_spec — один файл .xisf, маска (*.xisf), или @list.txt
  • output_spec — один файл .fit, нумерованный шаблон (out0001.fit), или директория (outdir/)

Примеры:

xisf2fits image.xisf image.fit
xisf2fits *.xisf converted/
xisf2fits @list.txt out0001.fit

Тестирование

В каждой папке скрипта есть run.bat для тестирования:

cd Add
run.bat

Тестовые данные находятся в папках Samples1/, Samples2/, 1/.