As we make more observations on one region of the sky and add/combine the observations into one dataset, both the signal and the noise increase. However, the signal increases much faster than the noise: Assuming you add \(N\) datasets with equal exposure times, the signal will increases as a multiple of \(N\), while noise increases as \(\sqrt{N}\). Therefore the signal-to-noise ratio increases by a factor of \(\sqrt{N}\). Visually, fainter (per pixel) parts of the objects/signal in the image will become more visible/detectable. The noise-level is known as the dataset’s surface brightness limit.
You can think of the noise as muddy water in a pond (the “sky” will be the bottom of the pond). The signal (coming from astronomical objects in real data) will be the rocks and their peaks can sometimes reach above the muddy water. Let’s assume that in your first observation the muddy water has just been stirred and except a few small peaks, you cannot see anything through the mud. As you wait (and make more observations/exposures), the mud settles down and the depth of the transparent water increases. As a result, more and more summits become visible and the lower parts of the rocks (parts with lower surface brightness) can be seen more clearly. In this analogy226, height (from the ground) is the surface brightness and the height of the muddy water at the moment you do your measurements, is your surface brightness limit.
On different instruments, pixels cover different spatial angles over the sky. For example, the width of each pixel on the ACS camera on the Hubble Space Telescope (HST) is roughly 0.05 seconds of arc, while the pixels of SDSS are each 0.396 seconds of arc (almost eight times wider227). Nevertheless, irrespective of its sky coverage, a pixel is our unit of data collection.
To start with, we define the low-level Surface brightness limit or depth, in units of magnitude/pixel with the equation below (assuming the image has zero point magnitude \(z\) and we want the \(n\)th multiple of \(\sigma_p\)). Where \(\sigma_p\) is the per-pixel standard deviation (for example median of the measured sky standard deviation in the image).
$$SB_{n\sigma,\rm pixel}=-2.5\times\log_{10}{(n\sigma_p)}+z \quad\quad [mag/pixel]$$
As an example, the XDF survey covers part of the sky that the HST has observed the most (for 85 orbits) and is consequently very small (\(\sim4\) minutes of arc, squared). On the other hand, the CANDELS survey, is one of the widest multi-color surveys done by the HST covering several fields (about 720 arcmin\(^2\)) but its deepest fields have only 9 orbits observation. The \(1\sigma\) depth of the XDF and CANDELS-deep surveys in the near infrared WFC3/F160W filter are respectively 34.40 and 32.45 magnitudes/pixel. In a single orbit image, this same field has a \(1\sigma\) depth of 31.32 magnitudes/pixel. Recall that a larger magnitude corresponds to fainter objects, see Brightness, Flux, Magnitude and Surface brightness.
The low-level magnitude/pixel measurement above is only useful when all the datasets you want to use, or compare, have the same pixel size. However, you will often find yourself using, or comparing, datasets from various instruments with different pixel scales (projected pixel width, in arc-seconds). If we know the pixel scale, we can obtain a more easily comparable surface brightness limit in units of: magnitude/arcsec\(^2\). But another complication is that astronomical objects are usually larger than 1 arcsec\(^2\). As a result, it is common to measure the surface brightness limit over a larger (but fixed, depending on context) area.
Let’s assume that every pixel is \(p\) arcsec\(^2\) and we want the surface brightness limit for an object covering A arcsec\(^2\) (so \(A/p\) is the number of pixels that cover an area of \(A\) arcsec\(^2\)). On the other hand, noise is added in RMS228, hence the noise level in \(A\) arcsec\(^2\) is \(n\sigma_p\sqrt{A/p}\). But we want the result in units of arcsec\(^2\), so we should divide this by \(A\) arcsec\(^2\): \(n\sigma_p\sqrt{A/p}/A=n\sigma_p\sqrt{A/(pA^2)}=n\sigma_p/\sqrt{pA}\). Plugging this into the magnitude equation, we get the \(n\sigma\) surface brightness limit, over an area of A arcsec\(^2\), in units of magnitudes/arcsec\(^2\) (see the end of this section on how to derive this using Gnuastro):
$$SB_{{n\sigma,\rm A arcsec}^2}=-2.5\times\log_{10}{\left(n\sigma_p\over \sqrt{pA}\right)+z} \quad\quad [mag/arcsec^2]$$
As you saw in its derivation, the calculation above extrapolates the noise in one pixel over all the input’s pixels! In other words, all pixels are treated independently in the measurement of the standard deviation. It therefore implicitly assumes that the noise is the same in all of the pixels. But this only happens in individual exposures: reduced data will have correlated noise because they are a coadd of many individual exposures that have been warped (thus mixing the pixel values). A more accurate measure which will provide a realistic value for every labeled region is known as the upper-limit magnitude, which is discussed in the next section (Upper limit surface brightness of image).
Within Gnuastro, measuring the surface brightness limit of the image is very easy: the outputs of NoiseChisel include the Sky standard deviation (\(\sigma\)) on every group of pixels (a tile) that were calculated from the undetected pixels in each tile, see Tessellation and NoiseChisel output.
The \(\sigma_p\) used above is recorded in the MEDSTD keyword of the SKY_STD extension of NoiseChisel’s output.
Therefore, the first thing you need to do is to run NoiseChisel on the image.
When MakeCatalog is called with --meta-measurements, it will calculate the input dataset’s \(SB_{{n\sigma,\rm A arcsec}^2}\) and will write it SBL keywords the 0th HDU of the output, see MakeCatalog output keywords.
You can set your desired \(n\)-th multiple of \(\sigma\) and the \(A\) arcsec\(^2\) area using the following two options respectively: --sbl-sigma and --sbl-area (see MakeCatalog output keywords).
Just note that \(SB_{{n\sigma,\rm A arcsec}^2}\) is only calculated if the input has World Coordinate System (WCS).
Without WCS, the pixel scale cannot be derived.
In case you just want the surface brightness limit of an image without separating the objects and clumps within the image or doing any measurements, you can use the series of commands below. They assume your image is called image.fits and its zero point magnitude is 25. For a more detailed hands-on understanding of the surface brightness limit, see Image surface brightness limit (which is part of a larger tutorial).
$ zp=25.0
$ astnoisechisel image.fits -o nc.fits
$ astmkcatalog nc.fits -hDETECTIONS --sn --zeropoint=$zp \
--output=cat.fits --meta-measures
$ astfits cat.fits --keyvalue=SBL --quiet | asttable -Y
Because the surface brightness limit is just an extrapolation of the noise level, we can extend the concept to use a reference surface brightness limit to find the expected surface brightness limit of another telescope (in a similar location), or a different exposure time for the same telescope. This is discussed more fully in Expected surface brightness limit.
Note that this muddy water analogy is not perfect, because while the water-level remains the same all over a peak, in data analysis, the Poisson noise increases with the level of data.
Ground-based instruments like the SDSS suffer from strong smoothing due to the atmosphere. Therefore, increasing the pixel resolution (or decreasing the width of a pixel) will not increase the received information).
If you add three datasets with noise \(\sigma_1\), \(\sigma_2\) and \(\sigma_3\), the resulting noise level is \(\sigma_t=\sqrt{\sigma_1^2+\sigma_2^2+\sigma_3^2}\), so when \(\sigma_1=\sigma_2=\sigma_3\equiv\sigma\), then \(\sigma_t=\sigma\sqrt{3}\). In this case, the area \(A\) is covered by \(A/p\) pixels, so the noise level is \(\sigma_t=\sigma\sqrt{A/p}\).
JavaScript license information
GNU Astronomy Utilities 0.24 manual, November 2025.