← Handbook

Narrowband and Dual-Band Color Strategy

Answer two separate questions that narrowband/dual-band color work conflates if not taught explicitly: what emission-line signal do we think is actually present (the channel/signal layer), and how should that signal be mapped into display RGB (the palette layer)? NOVA has four related but non-alias strategies -- `nb_palette`, `narrowband_norm`, `narrowband_hoo`, and `narrowband_composite` -- that answer these two questions differently depending on what channels are actually available.

schema 1 · revision 1

Recognize it

Intended output

A displayed color image whose channel provenance (measured, model-derived, or an RGB proxy) and palette mapping (HOO, synthetic SHO, Foraxx, true SHO) are both explicit and correctly labeled -- never presenting a model-derived channel estimate as measured spectroscopy, and never presenting a two-channel synthetic SHO as a true three-channel acquisition.

Required input state

What NOVA does

`nb_palette` builds Ha/OIII component estimates via a Gaia-XP-informed non-negative-least-squares mixing-matrix fit on the star-full post-background-extraction image, then applies that unmixing to the starless linear image at the stretch boundary; it self-skips (retaining the parent image) when XP channels are missing/dimension-mismatched, or when the measured Ha/OIII flux ratio exceeds `NB_PALETTE_MAX_FLUX_RATIO=20.0`. `narrowband_norm` runs PixInsight NarrowbandNormalization with `o3_boost` auto-scaled from Ha-dominance ratio; a prior `MaximumStars/Equalize` approach was a silent no-op under PixInsight 1.9.3 because the expected property did not exist, so the current supported path matters as real version-specific provenance. `narrowband_hoo()` computes `R=Ha, G=0.15*Ha + oiii_g*O, B=O` with `O=min(OIII, oiii_cap*Ha)` (default `oiii_cap=0.85`, `oiii_g=0.90`), preferring real XP-unmixed `xp_ha.fit`/`xp_oiii.fit` channels (each passed through a matching STF stretch so the cap compares like-for-like scales) and falling back to an RGB-proxy OIII estimate only when those files are absent. `narrowband_composite` maps supplied mono masters to SHO (`R=SII, G=Ha, B=OIII`) or Foraxx (`R=0.76*Ha+0.24*OIII, G=0.85*OIII+0.15*Ha, B=OIII`) when the required channels are provided via job `extra_params`.

Use when

  • Real emission-line signal (SeeStar duo-band or true mono Ha/OIII/SII masters) needs a deliberate channel-and-palette decision distinct from ordinary broadband color calibration -- and the signal/channel provenance (measured, XP-model-derived, or RGB proxy) can be disclosed alongside whichever palette is chosen.

Skip when

  • The target is a reflection nebula or other broadband-continuum subject captured incidentally through a dual-band filter -- narrowband color mapping is not a substitute for broadband continuum color and should not be routed through this family merely because a duo-band filter was used.
  • The extracted Ha/OIII flux ratio indicates the OIII channel is noise/pedestal-dominated rather than genuine bicolor signal -- the flux-ratio gate exists specifically to catch this for `nb_palette`.
  • The goal is a literal three-channel SHO claim but only Ha and OIII were actually captured -- that goal cannot be met by this family without true mono SII data; use synthetic/pseudo-SHO language instead, or skip the SHO framing entirely.

Limits

  • The SeeStar S50's duo-band filter is documented at approximately 30nm around OIII and 20nm around H-alpha -- far wider than a classical 3-7nm mono narrowband filter, and it feeds an OSC Bayer sensor, not separate monochrome exposures. The resulting stack is not three independently measured emission-line channels: OIII near 500.7nm registers across both green and blue Bayer photosites, and SII is not present as a dedicated measured channel at all in an ordinary SeeStar Ha/OIII capture. Any "SHO-like" display synthesized from only Ha and OIII must be labeled synthetic/pseudo-SHO, never true three-channel SHO.
  • `nb_palette` uses Gaia-DR3-XP-informed channel extraction: a mixing matrix fit with non-negative-least-squares behavior against stars with known XP spectra, then applied to unmix the image into Ha/OIII component estimates. This is stronger than a naive RGB proxy, but the output remains a model-derived unmixing, not direct spatial spectroscopy of the nebula -- label it "XP-calibrated / model-derived Ha and OIII component estimates," never "ground-truth Ha/OIII." The fit is sensitive to which stars are available in the field, their color distribution, extinction, and catalogue/photometric matching quality; non-negative constraints prevent physically nonsensical negative estimates but do not prove uniqueness or correctness.
  • `NB_PALETTE_MAX_FLUX_RATIO = 20.0` skips `nb_palette` when the extracted Ha/OIII flux ratio exceeds it, falling back to `narrowband_norm`. This is a real, source-confirmed project heuristic with a real motivating case (IC 1805 measured a ratio around 157, and Henry rejected the resulting renders outright: "Those all look bad. The sky should be black.", 2026-06-12) -- it is not an externally validated universal physical threshold, and must not be presented as one.
  • `nbp_hoo_aggressive` is not merely a stronger HOO candidate -- it switches the stretch philosophy from linked to per-channel, which can materially change apparent line ratios independent of palette choice. A result comparing it against `nbp_hoo` is a strategy comparison (palette AND stretch philosophy changed together), not a clean palette-only comparison.
  • `narrowband_hoo()`'s bounded-HOO cap (`O = min(OIII, oiii_cap * Ha)`, default `oiii_cap=0.85`) can execute on two materially different channel sources with the identical candidate label: real Gaia-XP-unmixed channels (`run_dir/xp_ha.fit` + `xp_oiii.fit`, preferred) when present, or an RGB-proxy fallback (`clip(0.5*G + 0.5*B - 0.55*Ha, 0, None)`, Gaussian-blurred and normalized by its own 99.5th percentile) when they are not. The function records which source ran (`oiii_source: "xp_oiii"` or `"rgb_proxy"`), and that provenance must be part of any cited evidence -- the two are not equivalent treatments despite sharing a candidate ID.
  • `narrowband_normalize`'s `o3_boost` is auto-scaled by `clamp(0.50 + 0.395*ha_dominance_ratio, 1.25, 1.70)`, lifting weak OIII more strongly on more Ha-dominant fields. Boosting recorded weak OIII improves its visibility/balance -- it cannot recover OIII that was never captured above the noise floor, and a more balanced-looking palette is not evidence of more physically accurate line flux.
  • SCNR is deliberately skipped whenever `narrowband_norm`, `narrowband_hoo`, or `nb_palette` is active, because OIII registers across both green and blue OSC response and broad green suppression would remove legitimate teal/OIII signal as if it were a color cast. A fair comparison between any two narrowband candidates must record whether SCNR was actually skipped for both -- comparing one candidate with SCNR suppressed against one without is not a palette-only comparison.
  • `narrowband_hoo` and `narrowband_norm` are both `force_only` in the ontology -- neither runs automatically in the standard pipeline; both require an explicit job-level force to execute at all. `narrowband_composite` operates in the linear stage (not nonlinear, unlike the other three) and requires supplied mono Ha/OIII/optional-SII FITS paths via `extra_params['narrowband']` -- it is a materially different input-provenance class from the SeeStar duo-band OSC path, and the Handbook must not collapse "narrowband file" into one category across both.
  • None of the four families currently expose a clear unchanged/no-op candidate the way several other Experiment Mode families do -- `nb_palette`'s four `experiment_variants` are all real palette transforms, and `narrowband_norm`/`narrowband_hoo`/`narrowband_composite` use a separate `variants` schema outside formal Experiment Mode dispatch entirely, with no `none` entry in any of the three. A future controlled comparison needs an explicit copied-input baseline that does not currently exist in the ontology for this family.
  • Palette evaluation is confounded by star-recombination state: `nb_palette` operates on the starless branch and replaces the post-stretch starless working image, with stars re-screened afterward by the existing recombination path. Judging a starless palette says little about final star color, recombined broadband/OSC stars can make a palette look more natural even when the nebular mapping is unchanged, and comparing one candidate before recombination with another after is invalid.

Scientific and aesthetic notes

  • A valid palette/channel experiment holds fixed or explicitly blocks on: the same parent FITS and starless/star-full state, the same channel provenance (XP-derived vs. RGB-proxy HOO are not a pure palette comparison), the same extraction model/version, the same stretch philosophy (linked vs. per-channel is a separate factor from palette choice), the same background/calibration state, the same SCNR policy, the same star-recombination stage, the same crop/scale/registration, the same clipping/headroom policy, and the same display transform for previews.
  • Ha/OIII flux ratio from NOVA's reconstructed channels is a model-derived diagnostic unless independently calibrated; OIII coverage fraction is a useful implementation diagnostic, not proof of real OIII emission; sky blackness can catch a field-flood failure but blacker sky is not universally better and can result from destructive clipping; saturation/chroma magnitude describes output colorfulness, not physical accuracy.
  • Whole-frame SNR-like metrics, entropy, high-frequency power, generic sharpness, star count alone, lower background alone, stronger teal/gold separation, a perceptual preference score, historical win fraction, and "not rejected" by an artifact gate must never be promoted into palette or channel-reconstruction validation. A palette can improve every aesthetic criterion while becoming less faithful to original line ratios, and can preserve line ratios while being less visually preferred -- these are separate objectives that must not be conflated.
  • Choice among HOO, synthetic SHO/gold, and Foraxx, and the degree of OIII emphasis, may legitimately be driven partly by aesthetic preference once physical/provenance constraints are disclosed -- that validates preference for the rendering, not a physical claim about the underlying line ratios.

Evidence and measurements

MeasurementsAcceptance criteria
  • Residual error and conditioning of the fitted XP mixing/unmixing model on calibration stars, when assessing the channel model itself rather than the palette.
  • Independent channel background median and robust RMS/MAD, channel clipping/negative-floor incidence, and spatial morphology agreement between expected nebular structures and reconstructed component maps.
  • Per-channel clipping/headroom and percentile occupancy, sky pedestal and sky chroma after mapping, and target-ROI channel ratios interpreted as a display transformation rather than recovered physics.
  • Star color/halo metrics after recombination, and difference maps showing where a strategy altered the parent signal.
  • Whether SCNR was actually skipped, which OIII source (`xp_oiii`/`rgb_proxy`) supplied `narrowband_hoo`, and whether `nb_palette` executed, self-skipped, or was flux-ratio-gated.
  • Channel provenance (measured mono master, XP-model-derived estimate, or RGB proxy) and the exact palette formula/coefficients used are both disclosed -- never presented as one undifferentiated "narrowband palette applied" fact.
  • A synthetic SHO/gold render from only Ha/OIII is never described as measured three-channel SHO.
  • A `nbp_hoo` vs. `nbp_hoo_aggressive` result is labeled a strategy comparison (stretch philosophy changed), never a clean palette-only comparison.
  • Whole-frame SNR-like metrics, entropy, sharpness, star count, background darkness alone, perceptual preference, or historical win fraction are never presented as standalone proof of correct channel reconstruction.
  • A starless-palette result and a final-recombined-image result are never pooled as if they assessed the same thing.

Cross-tool matrix

Tool EquivalenceExpected resultEvidence
novaExact replayA displayed color image with clearly disclosed channel provenance and palette formula, correct star/background separation, and no field-flood or false-signal artifacts.nova-narrowband-source, nova-ic1805-flux-ratio-evidence
pixinsightSame engine, adapted hostOIII channel visibility balanced against Ha according to the configured/auto-scaled boost.nova-narrowband-source
sasproSame engine, adapted hostGaia-XP-informed Ha/OIII component estimates feeding NOVA's nb_palette and narrowband_hoo XP-channel path.nova-narrowband-source, gaia-dr3-xp-documentation
sirilFunctional alternativeA composed narrowband/dual-band color image via Siril's own tooling.nova-narrowband-source

NOVA Python pipeline XP-informed nb_palette + PixInsight narrowband_normalize + narrowband_hoo (XP or RGB-proxy) + narrowband_composite (SHO/Foraxx from supplied mono masters)

  1. Record which of the four strategies actually ran and, for `narrowband_hoo`, whether the real XP channels or the RGB-proxy fallback supplied OIII -- the candidate label alone does not disclose this.
  2. Record whether `nb_palette` executed, self-skipped on missing/mismatched XP channels, or was gated by the flux-ratio check -- a retained parent image is not evidence the palette failed to help, it may mean it never ran.
  3. Never describe `nbp_sho_gold` or any Ha/OIII-only render as measured three-channel SHO.
  4. Do not compare `nbp_hoo` against `nbp_hoo_aggressive` as a pure palette test -- the stretch philosophy changes too.

Controls and starting ranges

nbp_hoo / nbp_foraxx / nbp_sho_gold
XP-derived palette strategies, linked stretch
nbp_hoo_aggressive
same HOO mapping, per-channel stretch -- a strategy change, not a strength probe
hoo_oiii_soft / hoo_oiii_strong
oiii_cap 0.6 / 1.0 (default 0.85)
nbn_o3_soft / nbn_o3_strong
o3_boost 1.3 / 1.7 (auto-scaled default clamp 1.25-1.70)
sho_palette / foraxx_palette
narrowband_composite mono-master mappings

Mask behavior: Not exposed as a general control; narrowband_hoo's OIII cap is itself a spatially local, Ha-conditioned soft mask.

Failure modes

  • False OIII / field flood: weak reconstructed OIII spreads across the field, raising cyan/blue background -- from noise pedestal, imperfect unmixing, per-channel stretch, or overly strong OIII normalization.
  • Suppressed real OIII from broad SCNR, too-low oiii_cap, linked stretch on an extremely weak channel, or extraction failure.
  • Synthetic SHO misread as measured SII by a viewer.
  • Star palette artifacts (unnatural green/magenta stars, halos) after synthetic mapping.

Recovery

  • Inspect the linear reconstructed channel and fit quality rather than fixing solely by darkening the final palette; compare XP-derived and proxy behavior; only increase OIII visibility if signal exists above noise; evaluate starless and recombined outputs separately.

PixInsight NarrowbandNormalization NarrowbandNormalization; project runtime pin 1.9.3 Lockhart

  1. A prior `MaximumStars/Equalize`-based approach was a silent no-op under PixInsight 1.9.3 because the expected property did not exist -- the current `o3_boost`-based path is the real supported mechanism; treat exact PI version as material provenance for this family.
  2. Boosting OIII improves visibility of recorded weak signal; it cannot recover OIII never captured above noise.

Controls and starting ranges

o3_boost
auto-scaled clamp(0.50 + 0.395*ha_dominance_ratio, 1.25, 1.70); manual soft/strong overrides 1.3/1.7

Mask behavior: Not exposed by NOVA's current wrapper.

Failure modes

  • Presenting a more visually balanced palette as more physically accurate line flux.

Recovery

  • Reduce o3_boost; compare against the XP-derived channel evidence before trusting a normalized result.

Seti Astro Suite Pro (context for nb_palette's XP-informed extraction) exact deployed package version for nb_palette's XP-extraction path not independently confirmed in this repo

  1. Treat the exact deployed SASpro version relevant to `nb_palette`'s channel extraction as unresolved/version-bound rather than guessed -- it was not determinable from public project metadata at research time.

Controls and starting ranges

availability
XP-informed extraction hook feeding nb_palette; exact version-bound

Mask behavior: Not applicable at this layer.

Failure modes

  • Treating the XP-derived channels as independently calibrated spectroscopy rather than a model-derived unmixing.

Recovery

  • Fall back to the RGB-proxy path or narrowband_norm when XP extraction is unavailable or its fit quality is questionable.

Siril native narrowband/palette tools native narrowband/palette compositing tools; exact version not independently confirmed in this repo

  1. Treat as the same conceptual family -- channel-to-palette mapping for narrowband/dual-band data -- with different implementation and provenance model than NOVA's XP-informed and PixInsight-based paths.
  2. Apply the same channel-provenance and palette-formula disclosure discipline used for NOVA's own candidates.

Controls and starting ranges

native palette compositing
typically operates on true mono narrowband masters, closest to NOVA's narrowband_composite input class

Mask behavior: Not independently confirmed in this repo.

Failure modes

  • Treating a Siril palette result as evidence about NOVA's XP-derived or PixInsight-based candidates.

Recovery

  • Document the actual input channel provenance and palette formula used, same as for NOVA's own candidates.

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.