← Handbook

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 1

Recognize it

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

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

MeasurementsAcceptance criteria
  • Bright-star radial intensity profiles at multiple radii, and annular excess relative to local background.
  • Channel-specific radial profiles / chromatic ring magnitude, and halo radius at a defined contrast threshold.
  • Preservation of stellar core position/shape, neighboring faint stars, and local nebulosity/galaxy signal behind and around the star.
  • Background RMS/MAD away from stars, and new ring/edge artifacts in the difference image against the unchanged control.
  • Clipping/highlight occupancy, field-wide color drift outside star halos, and effect stratified by stellar brightness rather than one brightest star alone.
  • Halo/ring severity is reduced and confined to the affected bright-star regions, checked against a real unchanged control and against annular/radial profile measurements around the affected stars specifically -- not whole-frame statistics alone.
  • Background level, local nebulosity, and field-wide color outside the intended star regions are not materially degraded.
  • The actual reduction level, algorithm/package version, and whether the field resembles a known dense-field failure condition (IC 1805-like) are recorded.
  • `halo_minimal` (level 0) is never described as a no-op -- only the explicit `none` candidate is.
  • Lower FWHM, fewer detected stars, darker p99/p99.9, reduced entropy/high-frequency power, improved "star roundness," or historical win rate are never presented as standalone proof of a corrected halo.
  • A no-op result is recorded as a legitimate finding, not an incomplete pipeline run.

Cross-tool matrix

Tool EquivalenceExpected resultEvidence
novaExact replayReduced 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
pixinsightFunctional alternativeA manually assembled star-confined halo treatment, not a one-to-one NOVA equivalent.nova-halo-source
sasproSame engine, adapted hostA level-dependent gamma-LUT darkening transform, subsequently confined by NOVA's external bright-star mask.saspro-halobgon-upstream, nova-halo-source
sirilFunctional alternativeNot 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

  1. 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.
  2. 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.
  3. Do not treat `halo_minimal` (level 0) as a no-op -- only the explicit `none` candidate is a true unchanged control.
  4. 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

  1. 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

  1. 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

  1. 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

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.