Object SNR Tool

Honest, regional signal-to-noise measurement — pick the structure you care about, pick a background, get a per-channel SNR of that region. No "global image SNR" lies.

SASpro-exclusive, scientifically-honest SNR. This tool is original work by Franklin Marek, built on the principle that there is no such thing as "the SNR of an image." Any tool that gives you a single global number is lying. SNR varies spatially — the background of your frame has very low SNR, a bright galaxy core has very high SNR, a faint outer halo sits somewhere in between — and the only meaningful question is: what is the SNR of this specific region I care about, measured against a specific background? This tool answers exactly that question, nothing more, nothing less.
Why "global SNR" numbers are meaningless. A typical deep-sky frame contains pixel SNRs that span three or more orders of magnitude — from near 0 in sparse background sky, to 10-50 in extended nebular emission, to 1000+ in bright star cores. Any single "image SNR" number collapses that entire distribution to one scalar, usually by taking the mean brightness over the noise floor of the whole frame. The result tracks how much of your frame is bright: a frame full of nebula will "score higher" than one with a small object on empty sky, even if their interesting-structure SNRs are identical. This is why side-by-side global-SNR comparisons between stacks or processing steps are usually comparing composition, not quality. The Object SNR tool exists so you can ask the right question instead.

1. The two-step workflow

Step 1 — Select a target region. Open the region picker and draw a Box, Ellipse, or Freehand lasso around the structure you want to measure (a faint arm, an outer halo, a dust lane, a galaxy core). The tool auto-places a background rectangle elsewhere on the frame.
Step 2 — Calculate SNR. One click. The tool reports per-channel signal, background, noise, net signal, and SNR in both linear and dB. The right panel updates three plots: distributions (object vs background histograms), a bar chart of per-channel SNR, and a cropped preview of your region with the masks drawn in.

2. Step 1 — Picking a target region

Click Select Target Region. The picker opens on your active image with the auto-background box drawn in gold.

Three selection modes are available from the dropdown at the top:

Changing the drawing mode or starting a new drag clears the previous selection — you always have exactly one target region.

Picker controls.
Left-click drag — draw a selection.
Mouse wheel — zoom under the cursor.
Zoom In / Out / Fit / 1:1 toolbar — explicit zoom controls.
Enable/Disable Auto-Stretch — toggle a display-only stretch to see dim regions. Never affects the measurement.
Find Background — re-trigger the automatic background box placement, useful after you've moved the view or want to re-roll the placement.
Use Target — commit the selection and return to the main dialog.

The automatic background is a 50×50 pixel source-free box found by scanning the image for the darkest, flattest region a safe distance (100 px by default) from the edges. The box is drawn in gold so you can see where it landed and judge whether it represents a reasonable "nothing-there" background for your target. If it landed somewhere unrepresentative (another faint nebula, a star glow, inside your region of interest), zoom out, click Find Background again (which re-runs the search), or build a more deliberate workflow around the Magnitude tool's four-quadrant verification if you need that level of control over placement.

Choosing a good target region. This is the whole game. The region you draw defines what SNR means for this measurement. If you draw a huge box that catches both nebula and empty sky, the median brightness drops toward the sky level and the SNR number falls — not because the nebula got worse, but because you averaged it with noise. If you draw a tight region on a bright star core, the SNR will be enormous and completely uninformative about anything else in the frame. For meaningful numbers, draw regions that match the structure you actually care about: a loose polygon around the whole dim arm, a tight box inside the faint outer halo you want to compare between stacks, a lasso of the darkest dust lane you want to characterize.

3. Step 2 — Calculating SNR

Click Calculate SNR. The tool reads the native image (mono stays mono, RGB stays RGB — nothing is converted), masks it with your target region and the auto-placed background box, and reports per channel:

For a mono image you get one line labeled L. For an RGB image you get three lines, R, G, B. The results text area is selectable and the Copy Results button sends everything to the clipboard for pasting into a processing log.

3.1 Interpreting the number

The SNR number is a direct answer to the question "how many standard deviations above the sky background does my target sit?" A few reference points:

SNR (linear)dBWhat it means
< 2< 3Buried in noise. Not reliably detectable.
34.77Marginal detection. Visible with averaging/binning.
57.0Rose criterion for reliable visual detection.
1010.0Clean detection. Comfortable for publication.
30-5014.8-17.0Strong signal. Fine structure visible.
100+20+Core / bright-star territory. Essentially noise-free.

The dB value doubles for every tenfold increase in linear SNR (power ratio convention): 10× SNR is +10 dB, 100× is +20 dB. The dB axis is more convenient for comparing processing steps on log-scale structures.

4. The three plot tabs

The right-hand panel has a channel selector at the top and three tabs below.

4.1 Distributions

A pair of overlaid histograms showing the pixel-value distribution inside the Background region (blue) and the Object region (orange), normalised to density so they're directly comparable regardless of area. The channel selector picks which plane to plot (L for mono; R, G, or B for color). The bins span from the 0.5th to 99.5th percentile of the combined data, so outliers don't crush the useful range.

What to look for:

4.2 SNR Chart

A bar chart with per-channel SNR on the left y-axis (linear) and dB on the right y-axis (same bars, different scale). For mono images one bar; for RGB three bars (R, G, B). Fast visual comparison across channels — if your blue SNR sits well below red and green, that's a nudge toward spending more sub-exposure time in blue next session.

4.3 ROI Preview

A cropped view of your target region (expanded by 40 px of context on each side) with the target mask drawn as a translucent red overlay and the background box as a gold tint. Serves one purpose: confirmation that the numbers you're seeing came from where you think they did. The display is autostretched for visibility — it doesn't affect the measurement, which operates on the linear pixels.

5. Choosing a good background

The measured SNR is only as meaningful as the background it's measured against. Three guidelines:

6. Workflow recipes

Before-and-after denoising comparison. This is the strongest use case. Open your image, pick a representative region of a structure you care about (not a star, not pure background — a faint arm or a dust lane). Calculate SNR, record the number. Run your denoiser or NR step. Recalculate on the same region. Honest NR raises SNR by a factor of 1.5-3× on faint extended structure, often more on background-adjacent regions. "Honest NR" is also the only kind — a filter that increases SNR by blurring away the signal will not show gains here because So drops in step with σ. The tool is calibrated to call this out.
Comparing stacks. Load stack A, pick a region, record SNR. Load stack B of the same object (same cropping/scale), pick the same region visually, record SNR. The ratio tells you honestly which stack has more signal in that region. √N scaling applies — if B has 4× the integration time of A, you should see roughly 2× the SNR; if you see less, something in the longer stack is going wrong (bad calibration, gradient from one night, drift in guiding).
Deciding where to stop stretching. Pick a region in your faintest structure of interest while the image is still linear. Record SNR. Apply your stretch. If the SNR on that region didn't change meaningfully, your stretch preserved the information — the structure is still as detectable as it was. If SNR dropped a lot, the stretch is burying your faint structure in the noise, consider a different stretch strategy.
Per-channel integration planning. Measure SNR on an RGB stack and check the three bars. Channels with much lower SNR than the others deserve more sub-exposures next time. For narrowband palettes this is how you decide whether an extra night on [O III] is more valuable than more Hα.

7. Technical details

The math behind every number the tool reports.

7.1 Signal estimation

The signal estimator is the median of pixel values inside the target mask:

S = \mathrm{median}\{I_p : p \in \Omega_{\mathrm{obj}}\}

Median is used instead of mean because real target regions almost always contain some contamination — a star within the lasso, a hot pixel residual, a diffraction spike. The mean is pulled by those outliers; the median shrugs them off, so the number you get reflects the typical brightness of your structure, not whatever the brightest hot pixel happened to be. For a well-chosen region on a smoothly-varying nebula or galaxy arm, median and mean agree to within ~1%; for a region containing even a single star the median is dramatically more honest.

The same median estimator is applied to the background region:

B = \mathrm{median}\{I_p : p \in \Omega_{\mathrm{bg}}\}

and the net signal above background is clamped non-negative:

S_o = \max(S - B,\, 0)

The clamp exists because a region can legitimately be fainter than the background box (a dust lane in front of a nebula, for example), which would yield a negative So and a negative SNR number that doesn't mean anything useful. In that case the tool reports SNR = 0 and the right conclusion is "this region is at or below the measured sky level" — the chart will show it as absent rather than inverted.

7.2 Noise estimation

The noise estimator is the sample standard deviation of the background pixels, using the Bessel-corrected (N-1) denominator:

\bar{I} = \frac{1}{N}\sum_{p \in \Omega_{\mathrm{bg}}} I_p
\sigma = \sqrt{\frac{1}{N-1}\sum_{p \in \Omega_{\mathrm{bg}}}\!\left(I_p - \bar{I}\right)^2}

Standard deviation (not MAD or any other robust estimator) is used here deliberately. In a cleanly-chosen source-free background box, the pixel-value distribution is dominated by Gaussian read-plus-shot noise, and standard deviation is the right estimator of its scale. If stars have leaked in, standard deviation will reflect that — which is correct behavior for an SNR measurement, because those stars are part of what competes with your signal in that part of the frame. A robust MAD estimator would hide the problem and give you an overconfident SNR number; the tool deliberately uses the honest estimator and leaves you to notice (via the distribution plot or the ROI preview) when your background box is dirty.

The Bessel correction (1/(N-1) rather than 1/N) is the unbiased estimator for a sample from a larger population — the usual choice when you're estimating the underlying noise distribution's spread rather than describing the exact pixel population inside the box.

7.3 The SNR definition and the decibel convention

The signal-to-noise ratio is reported as:

\mathrm{SNR} = \frac{S_o}{\sigma}

This is the ratio of the net signal (median above background) to the noise standard deviation — essentially, "how many σ above the sky is my structure?" It's the same quantity underlying the Rose criterion of visibility (SNR ≥ 5), underlying detection significance claims in astronomy ("3σ detection" means SNR = 3), and underlying every statement about faint-source photometric uncertainty.

The decibel version uses the power-ratio convention:

\mathrm{SNR}_{\mathrm{dB}} = 10 \log_{10}(\mathrm{SNR})

This gives +10 dB per factor-of-10 improvement in linear SNR. Equivalently:

\mathrm{SNR} = 10^{\mathrm{SNR}_{\mathrm{dB}}/10}

which inverts the dB value back to a plain ratio. Some image-quality tools use the amplitude-ratio convention 20 log10(SNR) instead; that convention doubles every dB number compared to this tool, so if you're comparing SNR_dB from another tool, verify which convention it uses before concluding anything about relative quality.

7.4 Why SNR varies spatially (and why this tool is honest about that)

The underlying truth every pixel's SNR obeys is:

\mathrm{SNR}(x,y) = \frac{I(x,y) - B}{\sigma}

Both the signal and the noise are properties of a region, not of the whole frame. In a deep-sky frame the quantities take on wildly different values depending on where you look:

A single-number "global SNR" that collapses this to one value will always be dominated by whichever brightness regime occupies the largest number of pixels in the frame — usually the background, sometimes a bright extended object. The number it produces tracks how bright your frame is on average, which is not what you want to know; you want to know how well-detected the structure you care about is.

By asking you to pick the region and the background, this tool keeps both terms of the SNR definition under your control. The number it returns is the real-and-specific SNR of the thing you asked about, measured against a specific reference. That's the only kind of SNR number that means anything.

7.5 Per-channel handling

Each channel is treated as an independent image. A mono image yields one SNR number labeled L; an RGB image yields three independent SNR numbers labeled R, G, B. The tool does not combine channels into a single "colour SNR" (no such concept exists cleanly — color SNR depends on luminance weighting choices and on perceptual-vs-scientific intent). You get three honest numbers, one per channel, and compare them yourself.

For narrowband palettes where each channel is a different line (SHO, HOO, etc.), per-channel SNR is directly interpretable as the detection quality of each emission line and feeds straight into integration-time planning.

7.6 Stacking and the √N scaling

For reference, in the Poisson/Gaussian noise regime that governs deep-sky stacks, SNR grows with the square root of the number of co-added subs:

\mathrm{SNR}_{\mathrm{stack}} \propto \sqrt{N_{\mathrm{sub}}}

So doubling your integration gives a √2 ≈ 1.41× SNR improvement (+1.5 dB); quadrupling it doubles the SNR (+3 dB). If you measure SNR on two stacks of the same object with the same cropping and your observed ratio falls meaningfully short of this prediction, something is wrong with the longer stack — bad calibration, drifting guiding, poor rejection of outliers in integration, or a gradient contaminating one of the nights. This tool is the right instrument to diagnose that.

Credits. The Object SNR Tool — the regional-SNR framing, the picker, the three-plot layout, and the autostretch-safe measurement path — is original work by Franklin Marek for SetiAstro Suite Pro. Standard components credited to the community: the SNR definition and the Rose criterion follow Rose (1948) and standard imaging-science textbooks; the Bessel-corrected sample standard deviation is textbook statistics; the decibel power-ratio convention is standard practice in signal processing. The automatic background-box placement reuses SASpro's auto_rect_box utility (the same source-free scanner that serves the Background Neutralization and Magnitude tools), and the display stretching uses SASpro's canonical stretch_color_image pipeline (preview-only; never baked into measurements).