Winter night-time all-sky view

This is a winter night-time all-sky view (almost all-sky, anyway), captured on 30 December 2019. It is the result of a proof of concept run using my all-sky plate-solving, reprojection, alignment and stacking software, developed in Python with Astropy, OpenCV and Skimage. I was not completely happy with the data set (too many trees, telegraph poles and cables, and city glow near the horizon), but this was just an initial run to see how well it would work. Nevertheless, I’m generally pretty happy with the result after some additional processing in Photoshop. The Milky Way runs vertically across the middle. There are various deep sky objects just visible: The Rosette Nebula (between Gemini, Orion and Monoceros), the Orion Nebula, Barnard’s loop (to the left of Orion), the California Nebula (crossing Perseus’s ‘leg’), the Flaming Star Nebula (in Auriga), etc. The right of the image suffers from sky glow from a nearby city, which I largely cropped out.

I set out to collect a series of 30-s frames over the course of a few hours, and then due to the apparent rotation of the sky around the pole, derotate and align each frame with a reference frame, and stack/average them. By doing this, the signal-to-noise ratio is increased, allowing fainter detail to be lifted out without raising the noise to an unacceptable level. The images were collected using a wide field of view with a fisheye lens: This means the distortion is high, the stars are small, and there are buildings, trees, telegraph poles and cables. Off-the-shelf stacking software, which is generally intended for much higher focal lengths with low distortion, isn’t appropriate.

My solution was to first fit a rough horizontal world coordinate system (WCS) by identifying a handful of bright stars; and to then refine the fit using the simple image polynomials (SIP) convention. With the horizontal (altitude-azimuth) WCS determined (which applies to every image captured), each image then can be reprojected into the equatorial (right ascension-declination) WCS of the reference frame. The ‘stack’ of aligned images is then averaged pixel-by-pixel by using a simple mean. I should really use a more advanced technique like kappa-sigma averaging, but a simple mean seems to have worked well enough.

Note that since the rotating sky is derotated in order to appear stationary, the buildings, telegraph poles and cables, and trees move instead, and blur across the sky. To avoid this, I used a mask to block out the horizon clutter. This has a favourable side effect: Some initially blocked parts of the sky gradually fill in as the night progresses leaving an unobstructed view. One other negative side effect of this, however, is that the light-polluted western sky spreads across the stacked output image (because the images of the rotating sky are derotated to align with the reference frame). I therefore made a second image in which I restricted the size of the stack (limiting the spread of light pollution across the image) and blended the western sky of the second image over the first image (yes, this section is fractionally noisier, but definitely a vast improvement in comparison the light pollution from the city glow).

The video below shows the process of how the image was gradually built up by aligning and stacking. Note that I refined the averaging and masking technique somewhat since first making the video, and so only the general process is shown. In particular, the issue with the mask streaking and leaving shadows (on the right of the image) has been fixed since the video was created.


  • 165× 30-s light frames
  • 30× dark frames


  • Altair GPCAM BASIC Colour camera
  • Altair GPCAM Wide Angle Meteor Lens Kit 150 degree FOV


  • Sharpcap
  • PIPP (to produce the master dark)
  • Python with Astropy, Scipy, Skimage, OpenCV

1 thought on “Winter night-time all-sky view”

Leave a comment