Bright-Star Halo Suppression
Optionally reduce visually distracting bright-star halo/bloat and color rings after the image is nonlinear. This is a cosmetic/artifact-mitigation finishing transform, not PSF recovery, deconvolution, or star correction -- and the correct action is frequently a no-op. It is a separate concept from dark-structure enhancement (a different article): different objective, different spatial target, different algorithm, different failure modes.
schema 1 · revision 1Recognize it
- One or a few bright stars have clearly measurable extended halo/bloat or color rings that dominate the presentation, and that halo survives comparison against the unchanged parent rather than being primarily a recombination, stretch, or optical/PSF defect.
Intended output
Reduced bright-star halo/bloat/color-ring severity confined to the affected stars, with local nebulosity/companions, background level, and field-wide color preserved outside the intended star regions. "No halo suppression" is a legitimate, often correct, outcome -- not a failure to finish the image.
Required input state
- A nonlinear image, after star recombination/finishing where applicable, with a clearly identifiable candidate halo defect that survives comparison against the unchanged parent -- not a defect actually originating in star correction/deconvolution, star split/recombination, or the stretch stage itself, which should be fixed at their own source rather than papered over here.
What NOVA does
`seti_astro.halo_suppress(reduction_level=1, is_linear=False)` calls SASpro's `compute_halo_b_gon()` to get the raw level-dependent transform, then separately builds a bright-star mask: grayscale/lightness conversion, threshold at the 99.5th percentile, Gaussian blur with sigma `6.0 + 3.0*reduction_level` to cover the surrounding annulus, gamma-shaped to 0.6, and blends `original*(1-mask) + halo_result*mask` so only bright-star regions receive the transform. Production overrides `reduction_level` per workflow/object-type policy; the ontology's `halo_minimal` candidate (level 0) still applies a real, nonzero gamma transform within that mask. The `_NL_STEPS`-gap means the standard Experiment Mode path uses fixed ontology candidate levels rather than the adaptive FWHM/large-star-fraction severity computation.
Use when
- One or a few bright stars have a clearly measurable extended halo/ring that dominates the presentation and survives comparison against the unchanged parent, local nebulosity/companions can be protected and checked, and a low-strength treatment produces a specific annular improvement without damaging the rest of the field.
Skip when
- The field is dense/crowded -- the real IC 1805 failure evidence is strong condition-specific reason for caution here, though it does not establish a universal star-count threshold.
- There is no obvious halo defect, the apparent issue is actually star shape/PSF (belongs in earlier restoration, not here), the field contains faint signal under/near bright stars the broad transform could erase, or color rings/background noise/clipping worsen relative to the unchanged parent.
- A clean stack simply does not need finishing -- a later M66 run recorded halo suppression, dark-structure enhancement, CLAHE, and HDR-core-blend all losing to do-nothing.
Limits
- Current upstream SASpro `compute_halo_b_gon()` contains no explicit star detector, stellar catalog, annulus measurement, PSF fit, or chromatic halo model -- it forms a grayscale/lightness image, builds an unsharp-derived lightness mask, constructs an inverse mask whose strength grows with level, multiplies the image by that mask, and applies a level-dependent gamma LUT (approximately gamma 1.2/1.5/1.8/2.2 for levels 0-3). Used headlessly with no PixInsight-GUI-applied star mask, that lightness mask divides an already-[0,1] image by 255, collapsing it toward zero and degenerating the operation into *global* gamma darkening that crushes the whole image.
- NOVA does not expose that raw defect to users. `seti_astro.halo_suppress()` explicitly documents and works around it: it builds its own bright-star luminance mask (99.5th-percentile threshold on a grayscale/lightness map, Gaussian-blurred with sigma scaled by reduction level to cover the surrounding halo annulus) and blends the halo-reduced result in only where that mask is nonzero, leaving galaxy/background tone at mask~0 essentially untouched. This is real, current, already-live production behavior -- not something this article proposes -- and it directly corrects the framing that NOVA applies an undifferentiated global transform.
- Despite that star-confinement, halo suppression can still fail catastrophically on a sufficiently dense field: a real IC 1805 run (16,133-star dual-narrowband field, workflow 1.17.2, run after the star-confinement mask was already in place) shows level-1 halo suppression increasing background noise by ~129% (0.0283 to 0.0647) and driving p99.9 from ~0.499 to ~0.997, with false magenta/cyan/green rings. In a field that dense, the bright-star mask can cover enough of the frame -- and enough mask-boundary transitions accumulate -- that the confinement stops meaningfully limiting the effect. This is strong condition-specific failure evidence for dense fields, not proof that Halo-B-Gon always fails or that a specific star-count threshold is universally safe.
- Ontology declares a public range of reduction levels 1-2 (default 1, "never use 3+"), but `halo_minimal` passes reduction_level=0, and level 0 still applies gamma 1.2 under the raw upstream transform -- it is a real nonzero treatment, not a no-op. Only the explicit `none` candidate is a true unchanged control.
- `compute_halo_suppress()` in `tool_params.py` derives a severity heuristic from median stellar FWHM and large-star fraction and can compute reduction level up to 3, in tension with the ontology's own "never use 3+" guidance. But standard Experiment Mode does not currently invoke that adaptive computation at all: `halo_suppression` has a real entry in `_STEP_CFG`, yet is absent from the `_NL_STEPS` set the caller checks before applying adaptation -- confirmed still true as of this revision (2026-09-09). The standard path therefore runs fixed ontology candidate levels only; the adaptive severity code is currently dead for this step.
- FWHM and large-star fraction are proxy heuristics for "stars might be bloated," not direct measurements of a colored halo annulus -- high FWHM can come from seeing, focus, sampling, registration, guiding, or star-stretch choices as easily as from a genuine broad PSF wing, and neither statistic identifies the cause.
Scientific and aesthetic notes
- A rigorous halo-suppression comparison needs the exact same nonlinear parent after star recombination/finishing, an explicit `none` arm, candidate labels hidden from human/vision evaluators when practical, the actual reduction level and algorithm/package version recorded, star/annulus ROIs defined before judging the candidate, the same preview stretch/render for all arms, and no downstream curves/saturation differences before measurement. Block or stratify by star density, bright-star magnitude/intensity distribution, filter type/chromatic halo behavior, parent stretch and star-stretch/recombination strategy, seeing/focus/PSF, native vs. drizzled pixel scale, and whether the apparent halo is optical scatter, chromatic aberration, star-removal residue, recombination artifact, or simply a broad saturated star profile -- different causes should not be pooled as if one process has one response.
- Lower FWHM, fewer detected stars, darker p99/p99.9, reduced whole-frame entropy/high-frequency power, an improved "star roundness" score, a prettier perceptual result, lower saturation around a bright star, or historical winner frequency can all be achieved by globally darkening/shrinking stars or deleting faint companions -- none of them alone demonstrates a corrected halo.
- "No halo suppression" is often the most faithful choice, not a failure to finish an image -- teach the no-op result as a legitimate, frequently correct outcome.
Evidence and measurements
| Measurements | Acceptance criteria |
|---|---|
|
|
Cross-tool matrix
| Tool | Equivalence | Expected result | Evidence |
|---|---|---|---|
| nova | Exact replay | Reduced halo/ring severity confined to bright-star regions, with background level, local nebulosity, and field-wide color outside those regions materially unaffected. | nova-halo-source, nova-halo-nl-steps-gap, nova-ic1805-halo-failure, nova-m66-halo-noop |
| pixinsight | Functional alternative | A manually assembled star-confined halo treatment, not a one-to-one NOVA equivalent. | nova-halo-source |
| saspro | Same engine, adapted host | A level-dependent gamma-LUT darkening transform, subsequently confined by NOVA's external bright-star mask. | saspro-halobgon-upstream, nova-halo-source |
| siril | Functional alternative | Not applicable to NOVA's current dispatch for this family; documented for completeness only. | nova-halo-source |
NOVA Python pipeline star-confined mask wrapper around SASpro Halo-B-Gon; adaptive severity computation currently unreachable in standard Experiment Mode
- Describe NOVA's halo suppression as a star-confined masked blend built specifically to correct the raw upstream global-darkening defect -- not as an undifferentiated global transform.
- Record the actual reduction level and whether the field-density condition resembles the IC 1805 failure case before trusting a low-level result on a dense field.
- Do not treat `halo_minimal` (level 0) as a no-op -- only the explicit `none` candidate is a true unchanged control.
- Do not assume the adaptive FWHM/large-star-fraction severity computation ran -- it is currently unreachable in the standard path (`halo_suppression` absent from `_NL_STEPS`), so fixed ontology candidate levels are what actually executed.
Controls and starting ranges
- halo_minimal
- reduction_level 0 -- a real nonzero gamma transform within the star mask, not a no-op
- halo_mild / halo_standard
- reduction_level 1 / 2 -- ontology's declared safe range
- none
- true control
Mask behavior: Native and central to the mechanism -- a bright-star luminance mask (threshold + Gaussian annulus, level-scaled sigma) confines the transform; this is the fix for the raw upstream function's global-darkening defect.
Failure modes
- Colored rings around stars, broad field darkening, or crushed faint stars -- especially on dense fields, per the real IC 1805 evidence.
- Destroyed faint nebulosity near stars from the mask covering more of the frame than intended on a crowded field.
- Apparent FWHM improvement caused by lost profile wings rather than a genuinely corrected halo.
Recovery
- Revert to the unchanged parent; if the defect originates upstream, fix the true cause -- star correction/deconvolution for PSF shape, a different star split/recombination strategy for star-removal artifacts, or local/masked finishing for one isolated bright halo.
PixInsight (context only for this family) no dedicated halo-suppression tool independently confirmed as an equivalent packaged tool in this repo
- A comparable manual result is achievable via masking/curves around identified bright stars, but no single packaged PixInsight tool matching NOVA's specific star-confinement mask and gamma-LUT mechanism was confirmed in this repo's research.
Controls and starting ranges
- manual mask + curves/gamma
- build a bright-star mask and apply a local darkening curve only through it
Mask behavior: Fully supported through PixInsight's native masking tools when manually constructed; not a packaged one-call equivalent.
Failure modes
- Assuming a manual PixInsight result and NOVA's halo_suppress() are directly comparable without controlling mask geometry and gamma behavior.
Recovery
- Document the manual mask/gamma approach explicitly rather than presenting it as an equivalent engine.
Seti Astro Suite Pro Halo-B-Gon (as the underlying transform) Halo-B-Gon (compute_halo_b_gon) is the underlying transform; the star-confinement mask is a NOVA addition, not vendor SASpro behavior
- Current upstream source confirms no explicit star/annulus detection in the core transform -- it is a lightness-mask, multiply, gamma-LUT pipeline intended for GUI use with a user-applied star mask. NOVA's headless wrapper supplies that missing mask itself; treat the raw upstream function as version-bound context for the underlying transform, not a description of NOVA's actual effective behavior.
Controls and starting ranges
- reduction_level
- 0-3 upstream, gamma approximately 1.2/1.5/1.8/2.2; NOVA's ontology restricts public candidates to 0-2
Mask behavior: SASpro's own lightness-derived mask is part of the internal transform; NOVA's external bright-star mask is a separate, corrective addition.
Failure modes
- Treating the raw upstream transform's behavior as NOVA's actual field-wide effect, ignoring the external confinement mask.
Recovery
- Document both the raw transform and NOVA's confinement mask when describing effective treatment.
Siril (context only for this family) no dedicated halo-suppression tool independently confirmed in this repo
- No packaged Siril tool matching this specific star-confined halo-suppression strategy was confirmed in this repo's research.
Controls and starting ranges
- availability
- not currently NOVA's dispatch path for this step
Mask behavior: Not applicable to NOVA's current dispatch for this step.
Failure modes
- Assuming a general Siril tone/star adjustment is evidence about NOVA's halo-suppression candidates.
Recovery
- N/A -- not NOVA's current dispatch path for this family.
Validation status
Not yet Jeff-validated. Use this as sourced guidance, not a certification.
Sources
- Phase-2 research packet P30 (Part B: Bright-Star Halo Suppression), 2026-08-28
packet:P30:2026-08-28— NOVA source-confirmed - NOVA halo_suppress() star-confined masking wrapper, correcting the raw upstream global-darkening defect
nas_server/seti_astro.py:halo_suppress (commit 1799c06, 2026-05-30)— NOVA source-confirmed - halo_suppression absent from _NL_STEPS -- adaptive severity computation unreachable in standard Experiment Mode
nas_server/experiments.py:_NL_STEPS,_STEP_CFG; nas_server/tool_params.py:compute_halo_suppress— NOVA source-confirmed - IC 1805 (16,133-star dual-band field): level-1 halo suppression increased background noise 129% and produced colored rings, despite NOVA's star-confined mask
critiques/20260707_080122_seestar_nebula.md (workflow 1.17.2)— NOVA execution record - M66: halo_suppression, dark_enhance, CLAHE, and HDR-core-blend all lost to do-nothing on a clean stack
critiques/20260715_194614_seestar_galaxy.md— NOVA execution record - Seti Astro Suite Pro current upstream Halo-B-Gon source (version-bound, not the pinned install)
setiastro/setiastrosuitepro src/setiastro/saspro/halobgon.py, ref c2c941b88335c82cc42ced4a2016c43261610918— Vendor-documented
Related evidence
The M66 recipe and Jeff-validation ledger will link here when their static exports are available. Until then, this article remains explicitly unvalidated.