setiastrosuitepro 1.6.12__py3-none-any.whl → 1.7.1.post2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- setiastro/images/TextureClarity.svg +56 -0
- setiastro/images/narrowbandnormalization.png +0 -0
- setiastro/images/planetarystacker.png +0 -0
- setiastro/saspro/_generated/build_info.py +2 -2
- setiastro/saspro/aberration_ai.py +128 -13
- setiastro/saspro/aberration_ai_preset.py +29 -3
- setiastro/saspro/astrospike_python.py +45 -3
- setiastro/saspro/blink_comparator_pro.py +116 -71
- setiastro/saspro/curve_editor_pro.py +72 -22
- setiastro/saspro/curves_preset.py +249 -47
- setiastro/saspro/gui/main_window.py +285 -44
- setiastro/saspro/gui/mixins/file_mixin.py +35 -16
- setiastro/saspro/gui/mixins/menu_mixin.py +8 -0
- setiastro/saspro/gui/mixins/toolbar_mixin.py +115 -6
- setiastro/saspro/histogram.py +179 -7
- setiastro/saspro/imageops/narrowband_normalization.py +816 -0
- setiastro/saspro/imageops/serloader.py +1345 -0
- setiastro/saspro/legacy/numba_utils.py +1 -1
- setiastro/saspro/live_stacking.py +24 -4
- setiastro/saspro/multiscale_decomp.py +30 -17
- setiastro/saspro/narrowband_normalization.py +1618 -0
- setiastro/saspro/remove_green.py +1 -1
- setiastro/saspro/resources.py +6 -0
- setiastro/saspro/rgbalign.py +456 -12
- setiastro/saspro/ser_stack_config.py +82 -0
- setiastro/saspro/ser_stacker.py +2321 -0
- setiastro/saspro/ser_stacker_dialog.py +1838 -0
- setiastro/saspro/ser_tracking.py +206 -0
- setiastro/saspro/serviewer.py +1625 -0
- setiastro/saspro/sfcc.py +298 -64
- setiastro/saspro/shortcuts.py +14 -7
- setiastro/saspro/stacking_suite.py +21 -6
- setiastro/saspro/stat_stretch.py +179 -31
- setiastro/saspro/subwindow.py +2 -4
- setiastro/saspro/texture_clarity.py +593 -0
- setiastro/saspro/widgets/resource_monitor.py +122 -74
- {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/METADATA +3 -2
- {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/RECORD +42 -30
- {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/WHEEL +0 -0
- {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/entry_points.txt +0 -0
- {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/licenses/LICENSE +0 -0
- {setiastrosuitepro-1.6.12.dist-info → setiastrosuitepro-1.7.1.post2.dist-info}/licenses/license.txt +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# src/setiastro/saspro/ser_stack_config.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Optional, Tuple, Literal, Union, Sequence, TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
import numpy as np
|
|
8
|
+
KeepMask = "np.ndarray"
|
|
9
|
+
else:
|
|
10
|
+
KeepMask = object
|
|
11
|
+
|
|
12
|
+
from setiastro.saspro.imageops.serloader import PlanetaryFrameSource
|
|
13
|
+
|
|
14
|
+
TrackMode = Literal["off", "planetary", "surface"]
|
|
15
|
+
PlanetarySource = Union[str, Sequence[str], PlanetaryFrameSource]
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class SERStackConfig:
|
|
19
|
+
source: PlanetarySource
|
|
20
|
+
roi: Optional[Tuple[int, int, int, int]] = None
|
|
21
|
+
track_mode: TrackMode = "planetary"
|
|
22
|
+
surface_anchor: Optional[Tuple[int, int, int, int]] = None
|
|
23
|
+
keep_percent: float = 20.0
|
|
24
|
+
bayer_pattern: Optional[str] = None
|
|
25
|
+
|
|
26
|
+
# AP / alignment
|
|
27
|
+
ap_size: int = 64
|
|
28
|
+
ap_spacing: int = 48
|
|
29
|
+
ap_min_mean: float = 0.03
|
|
30
|
+
ap_multiscale: bool = False
|
|
31
|
+
ssd_refine_bruteforce: bool = False
|
|
32
|
+
keep_mask: Optional[KeepMask] = None
|
|
33
|
+
|
|
34
|
+
# ✅ Drizzle
|
|
35
|
+
drizzle_scale: float = 1.0 # 1.0 = off, 1.5, 2.0
|
|
36
|
+
drizzle_pixfrac: float = 0.80 # "drop shrink" in output pixels (roughly)
|
|
37
|
+
drizzle_kernel: str = "gaussian" # "square" | "circle" | "gaussian"
|
|
38
|
+
drizzle_sigma: float = 0.0 # only used for gaussian; 0 => auto from pixfrac
|
|
39
|
+
|
|
40
|
+
def __init__(self, source: PlanetarySource, **kwargs):
|
|
41
|
+
# Allow deprecated/ignored kwargs without crashing
|
|
42
|
+
kwargs.pop("multipoint", None) # accept but ignore
|
|
43
|
+
|
|
44
|
+
self.source = source
|
|
45
|
+
self.roi = kwargs.pop("roi", None)
|
|
46
|
+
self.track_mode = kwargs.pop("track_mode", "planetary")
|
|
47
|
+
self.surface_anchor = kwargs.pop("surface_anchor", None)
|
|
48
|
+
self.keep_percent = float(kwargs.pop("keep_percent", 20.0))
|
|
49
|
+
self.bayer_pattern = kwargs.pop("bayer_pattern", None)
|
|
50
|
+
if isinstance(self.bayer_pattern, str):
|
|
51
|
+
s = self.bayer_pattern.strip().upper()
|
|
52
|
+
self.bayer_pattern = s if s in ("RGGB", "BGGR", "GRBG", "GBRG") else None
|
|
53
|
+
else:
|
|
54
|
+
self.bayer_pattern = None
|
|
55
|
+
self.ap_size = int(kwargs.pop("ap_size", 64))
|
|
56
|
+
self.ap_spacing = int(kwargs.pop("ap_spacing", 48))
|
|
57
|
+
self.ap_min_mean = float(kwargs.pop("ap_min_mean", 0.03))
|
|
58
|
+
self.ap_multiscale = bool(kwargs.pop("ap_multiscale", False))
|
|
59
|
+
self.ssd_refine_bruteforce = bool(kwargs.pop("ssd_refine_bruteforce", False))
|
|
60
|
+
self.keep_mask = kwargs.pop("keep_mask", None)
|
|
61
|
+
|
|
62
|
+
# ✅ NEW: Drizzle params
|
|
63
|
+
self.drizzle_scale = float(kwargs.pop("drizzle_scale", 1.0))
|
|
64
|
+
if self.drizzle_scale not in (1.0, 1.5, 2.0):
|
|
65
|
+
self.drizzle_scale = 1.0
|
|
66
|
+
|
|
67
|
+
self.drizzle_pixfrac = float(kwargs.pop("drizzle_pixfrac", 0.80))
|
|
68
|
+
self.drizzle_kernel = str(kwargs.pop("drizzle_kernel", "gaussian")).strip().lower()
|
|
69
|
+
self.drizzle_sigma = float(kwargs.pop("drizzle_sigma", 0.0))
|
|
70
|
+
|
|
71
|
+
# sanitize a bit
|
|
72
|
+
if self.drizzle_scale < 1.0:
|
|
73
|
+
self.drizzle_scale = 1.0
|
|
74
|
+
if self.drizzle_pixfrac <= 0.0:
|
|
75
|
+
self.drizzle_pixfrac = 0.01
|
|
76
|
+
if self.drizzle_kernel not in ("square", "circle", "gaussian"):
|
|
77
|
+
self.drizzle_kernel = "gaussian"
|
|
78
|
+
if self.drizzle_sigma < 0.0:
|
|
79
|
+
self.drizzle_sigma = 0.0
|
|
80
|
+
|
|
81
|
+
if kwargs:
|
|
82
|
+
raise TypeError(f"Unexpected config keys: {sorted(kwargs.keys())}")
|