linear
Runbook · SHO · single panel

PixInsight Standard SHO Workflow

This is my standard narrowband (SHO) workflow, from WBPP through to the finished image. Companion to the mosaic runbook.

Companion document
PixInsight Mosaic Workflow for multi-panel targets
Documented against
RCW 33, March 2026 · RCW 108, August 2026
PixInsight version
1.9.4 · WBPP 3.0.1

Part 1 — Preparation

1Set up the process icon workspace

Do this once, not per project. Install the scripts and processes the workflow depends on, arrange them as icons on the PixInsight workspace in the order they're used, then save the set so it can be reloaded next session.

Process icon set arranged on the workspace
Icon Tool Stage
Blink Blink before WBPP — frame culling
WeightedBatchPreProcessing WeightedBatchPreProcessing linear
BlurX BlurXTerminator linear
GradientCorection GradientCorrection linear
NoiseX NoiseXTerminator linear
StarX StarXTerminator linear
PerfectPalletPicker PerfectPalettePicker stretches here
GenHypStretch GeneralizedHyperbolicStretch non-linear
NarrowBandNormalization NarrowbandNormalization non-linear
NBtoRGBStars NB to RGB Stars non-linear
CombineImages Combine Images non-linear

Arranging them in execution order turns the workspace itself into the checklist — you work down the column, and a skipped step is visible as an icon you never touched.

(Italicised entries are scripts rather than processes, which is why they render differently.)

Not kept as an icon: ImageSolver, launched from the Scripts menu. Worth considering adding it — see the note at Step 22.

Saving the set

Workspace right-click → Process Icons → Save Process Icons…

Saving process icons

This writes the whole set — including the parameter values baked into each instance — to a .xpsm file. Load Process Icons… brings them back in a new session, so tuned settings survive restarts. You can also create a shortcut to the .xpsm file on your desktop for easy access.


Part 2 — Frame culling

Process → Image Inspection → Blink

Blink
  1. Add all the light frames
  2. Click the top toolbar button — "Apply an automatic histogram transformation to all images" — so each frame is stretched individually
  3. Play through them (0.05 s default, adjustable) watching for defects
  4. Move rejects to a subfolder
  5. Delete them once the review is done

Individual stretch rather than one global stretch matters: sky brightness varies across a session, and a common stretch makes early and late frames hard to compare.

What to reject, and what to keep

Defect Verdict
Cloud Always remove
Tree branches, tracking failures, distorted stars Always remove
Bright satellite trails Remove
Minor satellite trails Survivable — integration rejection handles them — but remove anyway if you have plenty of subs
Slightly out of focus Keep — BlurXTerminator recovers these
Badly out of focus Remove

The more subs you have, the more aggressive you can be. With 80 frames per filter you can bin the marginal ones; with 15, a flawed frame may beat losing 7% of your integration time.

The point is to leave only clean frames in the LIGHT folder. WBPP has its own bad-frame rejection, but culling by eye first is more reliable for obvious failures and keeps the measurement and weighting stages from working around junk.

Filenames are readable in the list (2026-03-05_21-59-42_H_-10.00_300.00s_0000), so a run of consecutive bad frames shows up as a time block — for example, drift out of focus, cloud or tracking issues.


Part 3 — Calibration and integration

3Launch and reset WBPP

Script → Batch Processing → Weighted Batch Preprocessing (WBPP)

Before loading a new project, click Reset:

Reset button
Reset Engine dialog
Option Setting
Reset all parameters ☐
— to factory-default values ○ (selected but inactive)
— from the settings of the last session ○
Clear all file lists ✓
Purge cache ✓

Leaving Reset all parameters unticked keeps tuned settings — grouping keywords, cosmetic correction, output pedestal — while clearing the previous project's frames and discarding stale calibration data. Same configuration, clean slate for files.

4Set the output directory

Output directory

Point it at the project root — the folder containing the light frames, not a subfolder:

C:/PixInsight/2026-03-05_RCW 33

WBPP creates its own structure underneath, including the master/ folder. Nothing needs creating in advance.

Naming convention: YYYY-MM-DD_TARGET — date of first session plus target.

5Add the frames

Folder layout

If the project root is clean — only calibration and light folders — use + Directory and add the whole tree at once.

Add Directory button
bias/
dark/
FLAT/
LIGHT/

Folder name casing doesn't matter.

If the root contains anything else — previous WBPP output, stray files, a master/ folder from an earlier run — don't add the whole directory. Add folder by folder or file by file, so WBPP doesn't ingest processed data as raw frames. This is also why Purge cache and Clear all file lists matter at Step 3.

6Check the diagnostic messages

Diagnostic messages
=== 307 frames found, 307 added (in 9.466 s) ===

Found should equal added. A mismatch means frames were rejected — usually unreadable files or headers WBPP couldn't classify — and you want to know which before running. Click OK.

The NINA filename convention makes problems visible at a glance:

FLAT_2026-03-10_07-03-26_H_-10.00_4.06s_0000.fits
type_date_time_filter_temp_exposure_sequence

A wrong filter or sensor temperature is readable directly from the list.

7Verify on the Post-Calibration tab

Post-Calibration tab
Frames Bin Exposure Filter Colour Integration
80 (6248×4176) 1×1 300.00s H Gray 6h 40m
84 (6248×4176) 1×1 300.00s O Gray 7h 00m
81 (6248×4176) 1×1 300.00s S Gray 6h 45m

Confirm the filter count (three rows, not more), that frame counts match the sessions, and that dimensions and exposure are consistent. For a mosaic you'd see six rows — one per filter × panel.

8Run

Run button

Then wait. 245 lights at 6248×4176 took 1h 08m.

Global options in use

WBPP full window
Option Setting
FITS orientation Global Pref
Compact GUI ☐
Detect masters from path ✓
Generate rejection maps ✓
Preserve white balance ☐
Save groups on exit ✓
Smart naming override ☐
Registration Reference Image Mode auto (mosaic uses auto by PANEL)
Grouping Keywords ☐ for single panel

The PANEL keyword stays listed but greyed when Grouping Keywords is unticked — the definition persists between sessions. A mosaic run only needs the checkbox re-ticked, not the keyword re-entered.

The Calibration tab confirms masterBias, masterDark (300 s) and three masterFlats (H 4.07 s, O 1.99 s, S 2.27 s) were built and applied, with all lights showing Dark and Flat ticked and Bias not used.

9Check the Execution Monitor

Execution monitor

Every row should read success.

Stage Note
Calibration + Integration (flats) 20 frames per filter
Calibration (lights) 80 H / 84 O / 81 S
Measurements 245 measured
Bad frames rejection 0 rejected
Reference frame selection —
Registration all registered
LN reference generation per filter
Local Normalization all completed
Integration one master per filter
Autocrop 3 cropped
Astrometric solution 2 solved per filter

Astrometry runs automatically. "2 solved" per filter is the master and its autocrop variant. This is why ImageSolver is usually unnecessary later — including in the mosaic workflow.

If any row errors: identify the offending files from the console, delete them, and re-run rather than trying to salvage.

10Save the Smart Report, then exit

Smart report

Hit Save and put it in the log folder. Two uses:

  • Diagnosing bad frames — it names specific files, which the Execution Monitor summary doesn't.
  • Confirming what was solved — the tail lists astrometric solutions by full path.

It also reports Keywords : [] — empty for a single-panel run, [PANEL] for a mosaic. A way to verify the grouping keyword took effect.

Then Exit WBPP. "Save groups on exit" being ticked preserves the group structure if you need to come back.


Part 4 — Linear processing

11Open the masters

File → Open, navigate to master/, select the three _autocrop files:

Master folder
masterLight_BIN-1_6248x4176_EXPOSURE-300.00s_FILTER-H_mono_autocrop.xisf
masterLight_BIN-1_6248x4176_EXPOSURE-300.00s_FILTER-O_mono_autocrop.xisf
masterLight_BIN-1_6248x4176_EXPOSURE-300.00s_FILTER-S_mono_autocrop.xisf

Use the _autocrop versions — ragged registration borders already trimmed.

Each file opens as two images, so three files give six windows. Apply STF AutoStretch to see which holds data and close the empty one. This is standard PixInsight behaviour with no known way to disable it.

Rename the surviving views to H, O, S for clarity in later dropdowns.

12Build the ImageContainer

Right-click the workspace to create an ImageContainer (or Ctrl+Alt+I), then click Add Views — the icon with the green plus:

Add Views button
Select Views

Select All, leave Previews and Main Views ticked, OK.

The container drives the next four processes — configure each process, then drag the ImageContainer's triangle onto the bottom bar of the process dialog and all three channels get identical parameters in one action.

13BlurXTerminator

BlurXTerminator

v2.0.4, AI v4:

Setting Value
Sharpen Stars 0.50
Adjust Star Halos −0.26
Automatic PSF ✓
PSF Diameter 0.00 (greyed)
Sharpen Nonstellar 0.50
Correct Only / Correct First / Nonstellar then Stellar ☐
Luminance Only ☐

BXT requires linear data.

14GradientCorrection

GradientCorrection
Setting Value
Low threshold 0.20
Low tolerance 0.50
High threshold 0.05
High tolerance 0.00
Scale 5.00
Smoothness 0.40
Automatic convergence ☐
Generate gradient model ☐
Simplified Model ☐ (degree 1)
Structure Protection ✓ threshold 0.10, amount 0.50
Generate protection masks ☐

15NoiseXTerminator

NoiseXTerminator

v2.3.3, AI v3:

Setting Value
Intensity/color separation ☐
Frequency separation ☐
Denoise 0.90
Iterations 2

Linear stage order: BXT → GradientCorrection → NXT.

These three settings sets have been identical across every documented project — they're standing values, not per-image tuning.


Part 5 — Star separation

16StarXTerminator

StarXTerminator

v2.3.11, AI v11. Run via the ImageContainer, same as the previous three — not the built-in Process Batch button, which exists but isn't used here.

Setting Value
Generate Star Image ✓
Unscreen Stars ✓
Large Overlap ☐

Generate Star Image produces the separate stars-only images — without it you'd have nothing to feed NB to RGB Stars at Step 20.

Unscreen Stars extracts stars via an unscreen operation rather than a straight subtraction, which is what makes them recombine cleanly with Screen mode at Step 21. The two settings are a matched pair.

Result: six images

Six images after StarX
MasterLight_H          MasterLight_H_stars
MasterLight_O          MasterLight_O_stars
MasterLight_S          MasterLight_S_stars

Left column: the original views, now starless — StarXTerminator modified them in place. Right column: extracted stars, auto-named with _stars.

Naming is unambiguous here, unlike most stages in this workflow. No renaming needed.

The starless images keep the XISF badge because they're still backed by files; the star images are memory-only until saved.

Both sets are still linear.


Part 6 — Palette and stretch

17PerfectPalettePicker

Script → SetiAstro → PerfectPalettePicker, or right-click the workspace and execute in the global context.

Perfect Palette Picker

v1.3, Franklin Marek (setiastro.com).

Field Value
Ha MasterLight_H
OIII MasterLight_O
SII MasterLight_S
OSC HaO3 Dual — None —
OSC S2O3 Dual — None —
Linear Input Data ✓

Linear Input Data must be ticked. StarXTerminator ran on linear data and nothing has stretched these yet. This checkbox is the mechanism behind "PPP does the stretch" — it performs the linear-to-non-linear conversion as part of building the palette.

Click Create Palettes to generate all sixteen previews, then click the one you want — SHO in these projects.

Available: HOO, HOS, HSO, HSS, OHH, OHS, OSH, OSS, SHH, SHO, SOH, SOO, Realistic1, Realistic2, Foraxx, Dynamic Inverse.

Zoom In / Zoom Out adjust the preview tiles; the UI resizes by dragging the lower corner.

Now non-linear.

18GeneralizedHyperbolicStretch

Open the real-time preview — the round circle button at the bottom — and work with it open so both passes can be judged visually.

Pass 1 — Linear (black point)

GHS linear pass

Set transformation type to Linear and bring the black point up to the foot of the histogram — where the data begins, not into it. Then Apply (the square button).

Setting Value
Mode RGB
Clip type / Colour blend RGBBlend / 1.000 (greyed)
Use RGB working space ☐
Transformation type Linear
Invert ☐
Blackpoint (BP) 0.039200
Low clip (LCP) 0.000175
Whitepoint (WP) 1.000000
High clip (HCP) 0.000000
Adjust parameter BP
Use highest sensitivity ☐

Watch Low clip. LCP of 0.000175 means a small fraction of pixels are being clipped. Normal and harmless at this level, but it's the number that tells you how much you're throwing away if BP goes too far.

Pass 2 — Generalised Hyperbolic

GHS hyperbolic pass

Switch transformation type to Generalised Hyperbolic, move the symmetry point to the histogram peak, adjust the stretch, Apply, then close the preview.

Setting Value
Transformation type Generalised Hyperbolic
Invert ☐
Stretch factor (ln(D+1)) 1.242
Local intensity (b) 0.970
Symmetry point (SP) 0.260000
Protect shadows (LP) 0.020000
Protect highlights (HP) 1.000000
Adjust parameter D
Use highest sensitivity ☐

The curve rises steeply from the origin and flattens toward the top — lifting shadows and midtones hard while compressing highlights.

Symmetry point marks where the stretch is centred. Placing it at the main histogram peak (0.26 after the linear pass) is what pulls that peak rightward into the midtones.

Protect shadows at 0.02 holds the darkest end down so the background doesn't lift with the nebulosity — this is what keeps the sky from going milky.

The Readout button changes from "Send to BP" in pass 1 to "Send to SP" here — it targets whichever parameter suits the current transformation type, so you can click on the image to set the value directly.

19NarrowbandNormalization

NarrowbandNormalization
Section Setting RCW 33 RCW 108
Palette Palette SHO SHO
Lightness Lightness Off Off
Synthetic green blend Blend mode / amount Mode1 / 0.600 (greyed) same
Channel controls SCNR 0.102 0.163
OIII boost 1.234 1.572
SII boost 1.453 1.482
Adjustments Shadow point 0.970 1.000
Highlight reduction 1.000 1.026
Brightness 1.000 1.055

Every value is per-image, but the pattern holds across both projects: SCNR stays low, SII boost carries the most weight.

⚠ Be careful with SCNR

SCNR removes green rather than rebalancing it, so it takes real signal with it and loses detail.

Push the SII boost first — raising the SII contribution suppresses green by changing the balance, discarding nothing. Then use SCNR only to clean up what remains. Both documented runs sit near the bottom of the SCNR slider.

Synthetic green blend is greyed out — it becomes available under different palette or lightness settings. Not used.


Part 7 — Stars and recombination

20NB to RGB Stars

From the menu, or execute on the active view.

NB to RGB Stars
Field Value
Ha Stars Image MasterLight_H_stars
OIII Stars Image MasterLight_O_stars
SII Stars Image (optional) MasterLight_S_stars
OSC (for dual band filter) Image — None —
Green Channel Blend Ratio ☐
Apply Star Stretch (Recommended) ✓
Stretch Factor 5.00
Color Boost 1.00
Show Preview ☐

Converts narrowband stars into natural-looking RGB. Narrowband stars are otherwise badly coloured — magenta or cyan depending on palette — because the filters don't sample the visual spectrum.

⚠ Don't forget the star stretch

Apply Star Stretch must be ticked. The star images came out of StarXTerminator linear and nothing has touched them since — PerfectPalettePicker and GHS only worked on the starless side.

This is where the stars cross to non-linear. Leave it unticked and they'll be nearly invisible against the stretched background at Step 21.

Ticking the box is what reveals Stretch Factor and Color Boost.

Use Refresh Preview to check, then Execute.

21Combine Images

Scripts → Toolbox → Combine Images (v1.11, Jürgen Terpe)

Combine Images
Setting RCW 33 RCW 108
Image #1 Final_SHO1 (starless) Final_SHO
Image #2 NBtoRGB_stars NBtoRGB_stars
Combine Method Screen Screen
Amount Image #1 1.00000 1.00000
Amount Image #2 1.44882 1.61417
Vibrance Image #1 0.000 0.000
Vibrance Image #2 0.442 0.562
Intensity Mask ☐ ☐
Auto-STF preview ☐ ☐
Replace image #1 ☐ ☐

Order matters. Image #1 is the starless base, Image #2 the stars. Use Swap images if they load the wrong way round.

Screen is the right method for adding stars back — it adds light without clipping, so bright stars sit on top of the nebulosity rather than replacing it. It also pairs with Unscreen Stars at Step 16.

Boosting the stars

This is where the stars get their final character, not just where they're pasted back:

  • Amount Image #2 above 1.0 makes them brighter and more prominent. Both documented runs sit around 1.4–1.6; left at 1.0 they look weak against a heavily stretched background.
  • Vibrance Image #2 saturates star colour. Both runs around 0.44–0.56.

Image #1 stays at 1.000 / 0.000 every time. The asymmetry is the technique — saturate the stars while leaving the palette exactly as tuned at Step 19.

Judge against the live preview, then commit with the green tick at bottom left. Leave Replace image #1 unticked to keep the starless version intact.


Part 8 — Finishing

22ImageSolver

Script → Astrometry → ImageSolver (v6.4.2)

ImageSolver
Section Setting Value
Target Image Active window
Image Parameters Right Ascension e.g. 8h 49m 44.890s
Declination e.g. −42° 17′ 35.56″ (S ticked)
Date and time 2000-01-01 12:00:00
Topocentric ☐
Image scale Resolution 0.671 ″/px
Pixel size 3.76 µm
Model Parameters Reference system ICRS
Catalog Local XPSD server — Gaia DR3 (XPSD)
Automatic limit magnitude ✓
Distortion Correction ✓

The Search button resolves a target name to coordinates — easier than typing RA/Dec by hand.

⚠ Open question — the Gaia DR3 selection doesn't persist

ImageSolver doesn't remember the catalog choice between sessions. Some of its settings appear to be stored per-instance rather than globally, so what you get on opening depends on how the script was launched.

Likely workaround: configure it, drag the triangle to the workspace to make a process icon, and include it in the saved icon set from Step 1 — the same approach already used for every other tool. Worth confirming on the PixInsight forum for a definitive answer.


Relationship to the mosaic workflow

Parts 1–4 are shared. The mosaic workflow inserts astrometry, reprojection, trimming and the photometric join between the linear stage and star separation:

STANDARD                          MOSAIC
─────────────────────────────────────────────────────────────
Process icon set (one-off)        Process icon set (one-off)
Blink — cull bad frames           Blink — cull bad frames
WBPP                              WBPP (+ PANEL grouping keyword)
_autocrop masters                 _autocrop masters
BXT → GC → NXT                    BXT → GC → NXT
                                  ├─ ImageSolver         → _ast
                                  ├─ MosaicByCoordinates → _ra
                                  ├─ TrimMosaicTile      → _trim
                                  ├─ PhotometricMosaic ×3
                                  ├─ DynamicCrop ×3
                                  └─ FastRotation + re-solve
StarXTerminator (linear)          StarXTerminator (linear)
PerfectPalettePicker (+ stretch)  PerfectPalettePicker (+ stretch)
GeneralizedHyperbolicStretch      GeneralizedHyperbolicStretch
NarrowbandNormalization           NarrowbandNormalization
NB to RGB Stars                   NB to RGB Stars
Combine Images                    Combine Images

Everything from StarXTerminator onward is identical — by that point a mosaic is just a larger image.


Where the stretch happens

There is no single stretch step. The two halves of the image cross from linear to non-linear in different places:

Stretched by At step
Starless channels PerfectPalettePicker (Linear Input Data ✓) 17
Star images NB to RGB Stars (Apply Star Stretch ✓) 20

Both halves must be non-linear before Step 21 combines them. Forgetting the star stretch is the easiest mistake in this workflow.


Quick reference

1.  ONE-OFF SETUP — install processes/scripts, arrange icons in run order,
      Process Icons → Save Process Icons…   (reload each session)
2.  Blink — cull cloud, trails, tracking failures. Keep slightly soft frames.
3.  WBPP: Reset → Clear file lists ✓ + Purge cache ✓, parameters ☐
4.  Output directory = project root
5.  + Directory  (only if the root is clean)
6.  Diagnostics — found must equal added
7.  Post-Calibration tab — verify filter and frame counts
8.  Run
9.  Execution Monitor — all rows success; astrometry runs automatically
10. Save the Smart Report to the log folder, then Exit
    ─── linear ───
11. Open the three _autocrop masters; close the empty twin of each
12. ImageContainer → Add Views → Select All
13. BXT                  0.50 / −0.26 / auto PSF / 0.50
14. GradientCorrection   0.20 0.50 0.05 0.00 / scale 5 / smooth 0.40
15. NXT                  denoise 0.90, iterations 2
16. StarXTerminator      Generate Star Image ✓  Unscreen Stars ✓  → 6 images
    ─── PPP crosses to non-linear ───
17. PerfectPalettePicker — LINEAR INPUT DATA ✓ → Create Palettes → SHO
18. GHS  pass 1 Linear:   BP 0.0392  (foot of histogram)
         pass 2 Gen.Hyp:  D 1.242  b 0.970  SP 0.260  LP 0.020
19. NarrowbandNormalization — SHO; SII boost first, SCNR low (~0.10)
20. NB to RGB Stars — APPLY STAR STRETCH ✓ (stars are still linear!)
         factor 5.00, colour boost 1.00
21. Combine Images — #1 starless, #2 stars, Screen
         Amount #2 ~1.45   Vibrance #2 ~0.44   (#1 stays 1.000 / 0.000)
22. ImageSolver — 0.671 ″/px, 3.76 µm, Gaia DR3, distortion ✓

Gotchas index

# Gotcha
1 _autocrop files each open as two images — close the empty one. Standard behaviour, no known way to disable it.
2 Blink's per-image stretch button matters — a global stretch hides variation between frames
3 Don't add the whole directory if the project root has previous output in it
4 Diagnostics: found ≠ added means frames were silently rejected
5 WBPP solves the masters automatically — ImageSolver is usually unnecessary
6 The PANEL grouping keyword persists but greys out when unticked — re-tick, don't re-enter
7 PerfectPalettePicker performs the stretch — there is no HistogramTransformation step
8 GHS Low clip tells you how much you're clipping — watch it when moving BP
9 SCNR removes green and loses detail — boost SII first
10 Apply Star Stretch must be ticked — star images are still linear at Step 20
11 Combine Images: boost only Image #2; #1 stays at 1.000 / 0.000
12 ImageSolver doesn't remember the Gaia DR3 selection — save it as a process icon