Single-image 3D stereo, depth maps, and wiggle animations for PixInsight, with tools designed to handle astroimages. [more]
Categories: DeepSkyColors, Render
Keywords: 3D, stereo, parallax, depth map, anaglyph, wigglegram, single-image 3D, nebula, galaxy, narrowband cue, star layer, depth painting, real-time preview, animation, GIF, AVI, APNG, MP4, VR 180, ffmpeg, circular wiggle.
[hide]
[hide]
DeepParallax is a sophisticated, highly customizable tool that turns a single 2D image into a variety of 3D representations and animations: an interactive depth map, a stereoscopic side-by-side pair, a red/cyan anaglyph, separate left/right views, and a looping wigglegram, all from one input frame. A floating Dynamic Preview window follows every adjustment we make, showing the current result live and looping the wiggle animation as we tune.
The tool is general-purpose: it works on everyday photographs, landscapes, portraits, and any subject where a single image is all we have. On top of that, DeepParallax includes specific tools designed to deal with the particular and complex case of astroimages: where a flat 2D nebula or galaxy hides a rich structure that the eye reads as depth, where stars (being point sources at infinity) need to be treated specially, and where channel balance in narrowband palettes carries depth information of its own. A narrowband cue uses the Ha/OIII channel balance to push emission features forward and ionized regions back, an external star mask can float stars onto a clean, consistent plane instead of letting them spike the depth map, and a depth painting input lets us import a hand-corrected or AI-generated depth map to override the computed one in regions where we know better than the algorithm.
Everything is parameter-driven and instance-serializable, so a recipe that works on one frame can be reused on others; ready-made Presets for Nebula, Narrowband, and Galaxy targets give us sensible starting points. The depth pipeline is cached behind the scenes, so adjusting stereo or animation controls re-renders without recomputing the depth, keeping previews responsive even on large frames.
[hide]
The only official distribution of DeepParallax is via a PixInsight repository. This is the safest way to install a module or script, as the installation is handled by PixInsight itself, which will fetch the module directly and safely from our PixInsight repository at
https://repo.deepskycolors.com/DeepParallax/
Make sure the trailing / is part of the URL. Also, be sure to keep our repository URL in our list of PixInsight repositories to receive timely updates.
By distributing DeepParallax only via our PixInsight repository, installation comes with the guarantee of our Developer and Repository certificates, verified by PixInsight itself from the moment it connects to our repository, until it validates and completes installation of the DeepParallax module.
If we ever want to be sure that we have the latest version available to us, we go to PixInsight's RESOURCES menu, select Updates, then Manage Repositories to make sure our repository is still there, then RESOURCES > Updates > Check for Updates.
DeepParallax is a standard PixInsight process: we set its parameters on the process dialog and apply it to a view. To launch it:
Applying the process never modifies the target image; instead it creates new windows with the result: a <view>_depth grayscale image in depth-map mode, a <view>_sbs in side-by-side mode, a <view>_anaglyph in anaglyph mode, or a pair of <view>_left and <view>_right windows in two-views mode. The animation toolbar (see 3.8) writes an animated video file directly to disk.
DeepParallax runs on a trial-then-registered licensing model with two features reserved for registered users. During the 30-day trial the tool is fully usable for exploring and creating depth maps, stereo output, and animations, with the following two restrictions:
Registering the module removes the GIF watermark and unlocks AVI, APNG, and MP4 export. When the 30-day trial expires, DeepParallax will display a notice at startup and will not open until a valid registration key is entered (see 3.9 Registration and licensing). No internet connection is needed: keys are validated offline.
[hide]
The panel is organized as a series of collapsible groups that follow the natural order of building a 3D scene: Presets for a quick start, then Depth cues and Depth shaping (which decide what the depth map looks like), Stereo output (which decides how that depth is turned into a 3D view), the optional Narrowband, Star layer, and Depth painting refinements (collapsed at startup), and finally Animation with the previews and export buttons.
A note on responsiveness. Adjusting any parameter does not immediately recompute the previews; instead a short debounce collapses a burst of slider movements into a single re-render about 150 milliseconds after we settle. While we drag a slider, the numeric edit field updates live so we see the value we are about to set; the heavy depth/stereo work fires once when we pause or release.
The depth pipeline is cached behind the scenes: as long as no depth-affecting parameter changes (Depth cues, Narrowband, Depth shaping, Star layer, Depth painting), the depth map is reused. Stereo and animation controls (Parallax amount, Convergence, Max disparity, Anaglyph color, Swap eyes, Frames, Frame rate, Amplitude) only re-render the stereo from the cached depth, so they feel instant even on large images.
The complete DeepParallax Interface:
Top to bottom: Presets, Depth cues, Narrowband, Depth shaping, Stereo output, Star layer, Depth painting, and Animation, with the preview/export toolbar at the bottom.
The Presets row at the top of the panel is the fastest way to get to a reasonable starting point. Three buttons load workflow-tested values for the most common target types: we pick one, then refine from there using the controls below.
Applying a preset leaves the output mode, the animation controls, and the optional Star mask and Depth map view selections unchanged: we can stamp a preset over an in-progress scene without losing those choices. From any preset we then adjust the panel below to taste.
This group decides what the algorithm sees as depth in our image. There is no actual depth information in a single 2D frame, so DeepParallax estimates it from visual cues: how bright a region is, how much local detail it carries, and (in the optional Narrowband group, see 3.3) which emission lines dominate it. We weight these cues against each other to get the depth assignment we want.
This optional group adds a depth cue specific to narrowband astroimages. In palettes such as HOO or SHO, channel balance carries information that the luminance and structure cues alone cannot reach: Ha-dominant regions (typically denser, hotter ionization fronts) read closer; OIII-dominant regions (often more diffuse, cooler ionized gas) read farther away. With this cue active we get depth assignments that follow the physics of the target, not just its brightness.
The group is collapsed at startup since broadband targets do not need it; expand it for narrowband work. The cue is mathematically a per-pixel ratio of the chosen near and far channels, so it is robust to the absolute level of those channels and reads the relative balance instead.
The raw depth map produced by the cues is correct in spirit but rough on the surface: noisy in the dim sky, full of small variations that would translate into visible jitter in the stereo pass. This group cleans it up while keeping the edges that matter, and lets us redistribute the available depth where we want it.
Like all other parameters in the depth pipeline, these are debounced and cached: dragging Smoothness up does not rebuild the depth on every tick.
Once we have a depth map, this group decides what kind of 3D output we produce from it and how strong the 3D effect should be. The stereo pass is fast and does not touch the depth map, so we can experiment with these settings freely: changing the output type or strength does not trigger a depth rebuild.
Output selects the kind of result we want when we apply the process:
Parallax amount sets the maximum total horizontal disparity, in pixels: the overall strength of the 3D effect. Higher values give a stronger feeling of depth, but at the cost of more eye strain and more visible smearing in the disocclusion areas where the background was hidden behind the foreground in the original image. A value of 15 to 25 pixels is usually a good place to start; we raise it for shareable video animations where the effect needs to be obvious and lower it for comfortable still-image viewing.
Auto convergence (default on) places the screen plane, the depth at which there is no parallax, at the median depth of the scene, so most of the image sits comfortably at the screen and roughly half pops forward while the other half recedes. This is the right default for almost every scene. When it is on, the manual Convergence slider is disabled. When we want manual control, we untick it and:
Max disparity caps the total separation that any pixel can have between the left and right views, regardless of how much the Parallax amount and depth would otherwise produce. This is the comfort dial: a deep scene with strong parallax can produce separations that are simply too wide to fuse, and this control caps the extremes without changing the overall feel. 0 disables the clamp.
Anaglyph color chooses how the red and cyan halves of the anaglyph are composited. The choice is visible immediately in the previews and in the anaglyph output:
Swap eyes flips the left and right halves. Use this to switch between parallel and cross-eyed free-viewing techniques, or to correct a reversed-depth result.
Stars are point sources at effectively infinite distance, but their high brightness fools the depth cues into placing them in the foreground. The result is a depth map peppered with per-star spikes and a stereo pass full of stars that visibly jump from frame to frame in animations. The Star layer group provides the fix, in two flavors selected by Star handling:
Star mask mode controls:
Stars on their own plane:
Left: depth map with stars spiking the foreground. Right: with a star mask and floatation, stars sit on one clean plane.
Starless + stars mode controls:
A starfield with real volume:

In Starless + stars mode the depth is built from the starless image while the stars are composited back at their own depths. As the viewpoint changes, the near stars parallax more than the far ones, giving a stronger impression of a 3D space rather than a flat pane. With the right masks, stars with spikes parallax nicely, leaving no trace.
Producing the inputs with StarNet2. StarNet2 generates all three images we need in a single run. We enable both its Create star mask and Unscreen stars options, run it on the source, and then feed the three results straight into the Star layer fields:
| StarNet2 output | DeepParallax field | Role |
|---|---|---|
| Starless image | Starless | Source of the (star-free) depth map. |
| Unscreen stars image | Stars | The star light composited back, each star at its own depth. |
| Create star mask image | Star mask | Locates the individual stars for depth assignment (optional but recommended). |
The Unscreen stars option matters: it gives a properly unscreened stars-only image, which composites back cleanly over the starless scene. The star mask is optional here (without it the stars are detected from the stars image directly), but providing StarNet2's mask gives the most reliable per-star detection. The same mapping applies to StarXTerminator's starless and stars outputs.
A note on realism: the per-star depths in Starless + stars mode are artistic, not measured. There is no real distance information in a star's brightness; the effect reads convincingly as space, but it is not astrometry. We use it because it looks good, not because it is physically true.
Applying in this mode: because the Starless and Stars views (and the optional Star mask) supply everything DeepParallax needs, there is no separate image to drag the instance onto. In Starless + stars mode we can therefore use the Apply Global button (the circle at the bottom of the process window) to run the process directly; the output windows are named after the starless view. In the other modes the source is whatever image we drag the instance onto, so Apply Global is disabled there.
The group is collapsed at startup. We expand it when we want to keep stars from spiking the depth, or to give them volume.
Even the best cue-driven depth map gets some regions wrong. Depth painting is the escape hatch: we import an external depth map and let it override the computed one, either partially or completely. This is how we hand-correct a specific region, how we use a depth map produced by another tool (for example an AI monocular depth estimator), and how we lock in a creative depth assignment that the cues cannot reach.
A typical hand-correction loop:
<view>_depth grayscale image.The external map is sampled at the resolution of the source view; if its dimensions differ, it is rescaled on the fly. The group is collapsed at startup; expand it only when we have an external map to import.
The Animation group produces a wigglegram: a small looping video that sweeps the viewpoint side to side. Because the eyes see successively different perspectives, the brain reconstructs depth from motion parallax alone, with no glasses, no stereoscope, no special display. Wigglegrams are the easiest 3D output to share: they play in any browser and on any social platform.
The group has three parts: the Motion frame with the animation parameters, the two preview buttons in the toolbar below it, and the five export buttons on the right side of that toolbar.
Motion parameters. These sliders and toggle define the sweep itself:
Previews. Two complementary preview options let us judge the result as we tune, both opened from the Animation toolbar:
Both preview buttons are toggles: they highlight with a soft blue tint when active, and they reset themselves when we close the floating window from its own close button. The Dynamic Preview window opens in Smooth interpolation quality, which suits the continuous-tone depth and stereo previews; we can switch it to Precise from the window's own toolbar at any time.
Exporting the animation. The five buttons on the right side of the toolbar each write a complete file at full source resolution, in the chosen format:
_VR180_SBS filename hint that dedicated VR media players auto-detect. With ffmpeg configured, it writes a short MP4 with full VR 180 spatial-media metadata (the Spherical/Stereo tags and the stereoscopic and spherical-video boxes) baked into the container, which is what YouTube and dedicated VR players need to recognize an upload as 3D (these platforms accept video for VR 180, not still images). Facebook and Google Photos may not reliably auto-detect VR 180. The JPEG form is unrestricted; the MP4 form follows the same licensing as the Export MP4 button.The GIF, AVI, and APNG encoders are self-contained in the module: no external dependencies, no tools to install. The MP4 export and the MP4 form of the VR 180 export use a local ffmpeg executable, configured once (see below).
Optional ffmpeg setup. The Export MP4 button and the MP4 form of the Export VR 180 button call a local copy of the open-source ffmpeg utility. DeepParallax does not bundle ffmpeg, so the path to the executable is configured once and remembered across sessions.
C:\Tools\ffmpeg\bin\ffmpeg.exe on Windows, /usr/local/bin/ffmpeg on Linux, or the path produced by a Homebrew install on macOS.ffmpeg -version and checks the output), then click Save.The path is persisted in PixInsight's settings and re-read on every Launch of the process, so once it is set the MP4 outputs are simply available. Right-clicking either button at any time reopens the same dialog so we can change the path if ffmpeg moves. Without ffmpeg configured, GIF, AVI, APNG, and VR 180 (JPEG) all still work; only the MP4 outputs are unavailable.
The Animation toolbar's Dynamic Preview button opens the Dynamic Preview, a real-time preview window shared across all Deep Sky Colors modules. It is our own live-preview engine, a replacement for PixInsight's built-in Real-Time Preview, rebuilt from the ground up to be far more capable. Where the native Real-Time Preview is a single fixed panel that can only show one rendition of the result, the Dynamic Preview is a true, freely resizable and movable window that adds its own zoom, pan, pixel readout, screen-stretch toggle, pixel grid, render-quality control and one-click extraction to a new image. Everything updates live as we work.
For DeepParallax, what the window shows follows the Output mode: in Depth map mode it shows the live grayscale depth map, and in any stereo mode it shows a live red/cyan anaglyph of the current result. An in-place preview can only show renditions that share the source geometry, so side-by-side and two-views outputs are previewed as an anaglyph; the actual side-by-side or two-views windows are produced when we apply the process. The preview refreshes after every parameter change (a short debounce collapses a burst of slider movements into one update), so we can judge the depth and the 3D effect as we tune. The companion Animation Preview button loops the wiggle animation in this same window.
The toolbar is what we expect from a capable viewer:
The Dynamic Preview is a normal floating window: we resize it, move it, and leave it open wherever it is convenient while we keep working on the image. Click the Dynamic Preview button again, or close the window, to dismiss it; clicking once more brings it back where we left it. Closing the window also resets the two preview toggles in the Animation toolbar.
The Preferences button (the wrench icon on the process interface bar) opens the DeepParallax license information dialog. This dialog reports the current license state:
When the module is not yet licensed, the dialog shows a “Click here to register” link. Clicking it opens the registration dialog, where we enter our email and license key. The fields are validated as we type, and the Register button enables only once a valid email/key pair is entered. After a successful registration the info dialog refreshes in place to the “licensed to” state: no need to reopen it. The same registration dialog is also offered from the AVI, APNG, and MP4 export buttons during the trial, so we can upgrade at the moment we need those formats without leaving our work.
[hide]
A get-results-quick session looks like this:
Open a stretched image. A non-linear, well-stretched frame works best, because every depth cue reads perceptual brightness. A linear image is mostly black and gives a flat, uninteresting depth map.
Pick a preset. Click Nebula, Narrowband, or Galaxy at the top of the panel depending on the target.
Give each star their own depth. In the Star layer section, select Starless + stars (volumetric). Run a star removal tool, like StarNet2, instructing the tool to also create the stars-only image, and star mask, if possible.
Then, assign the three output images from StarNet2 according to the table in Section 3.6.
Done! Open the Dynamic or Animation Preview. Or directly export a video, a stereo pair, or the anaglyph.
A thorough session looks like this:
Open a stretched image. A non-linear, well-stretched frame works best, because every depth cue reads perceptual brightness. A linear image is mostly black and gives a flat, uninteresting depth map.
Pick a preset. Click Nebula, Narrowband, or Galaxy at the top of the panel depending on the target. These set sensible Depth cue, Shaping, Stereo, and Star plane values to start from, and (in Narrowband's case) enable the channel-balance cue with Ha/OIII roles assigned to Red/Blue.
Work in Depth map mode first. Set Output = Depth map and turn on the Dynamic Preview. Depth is much easier to judge as a grayscale image than as a 3D effect, and every cue/shaping control changes the depth directly, so this is where we do the tuning.
Refine the cues. Watch the depth map as we adjust Luminance weight, Structure weight, and Structure scale. For narrowband targets, expand the Narrowband section and tune the channel weight and roles. Tick Invert depth if the brightest regions of our particular target should recede instead of coming forward.
Shape the depth. Raise Smoothness until the dim background reads as cleanly continuous, raise Edge preservation until the depth follows the visible structure faithfully, and use Depth gamma to redistribute the depth range: values above 1 give more separation, values below 1 compress the back of the scene.
Tame the stars (astroimages). If the target has bright stars sitting on a soft nebula or galaxy, the depth map will show per-star spikes. Build a star mask with DeepStarMask (or any other tool), select it in the Star layer section, set a Star plane around 0.85 to 0.95, and raise Star floatation toward 1 for a single clean star plane.
Hand-correct anything wrong (optional). Apply DeepParallax in Depth map mode to get a paintable <view>_depth image, paint corrections on it (brighter = nearer), then bring that image back via the Depth painting section and raise Blend.
Switch to a stereo Output mode. Now we look at the 3D itself. Anaglyph is the most convenient for tuning if we have red/cyan glasses; Side-by-side is the most flexible for downstream use. With Auto convergence on, the scene opens centered; raise or lower Parallax amount until the strength is right. Set Max disparity to a moderate value (around 20 pixels of total separation) if a deep scene is hard to fuse, otherwise leave it at 0.
Set up the wiggle. Open the Animation Preview from the toolbar. Tune Frames (12 to 20), Frame rate (8 to 12 fps), and Amplitude (1.5 to 3) until the motion reads as a clear depth cue without too much smearing in the revealed-background areas. The Amplitude multiplies Parallax amount, so we raise the latter too for a stronger swing. If the subject's depth runs along a particular direction (a horizontally elongated nebula, a vertically inclined galaxy), set Wiggle path angle across that direction; tick Circular for a continuous turntable-like motion instead of a back-and-forth swing.
Export. Click Export GIF for a small, universally compatible wigglegram. Registered users can also click Export AVI for an uncompressed video, Export APNG for a full-color animated PNG, or Export MP4 for an H.264 video suitable for YouTube, Facebook, and embedding in web pages. The Export VR 180 button writes a stereoscopic still for VR headset viewing (a side-by-side JPEG by default, or an MP4 with VR 180 metadata when ffmpeg is configured). The MP4 outputs require a local ffmpeg executable, configured once by right-clicking the MP4 or VR 180 button (see 3.8). The save dialog asks for a file name, and the encoder writes the file directly.
Saving the recipe. The full parameter set is serialized into the process instance, so we can drag the instance to a process icon and re-apply the same DeepParallax recipe to other frames of the same target series, or use it as a starting point for related targets.
The Presets buttons load these starting values; the table is here so we can see them at a glance and tweak from there:
| Nebula (broadband) | Nebula (narrowband) | Galaxy | |
|---|---|---|---|
| Luminance / Structure | 1.0 / 0.35 | 0.6 / 0.25 | 1.0 / 0.30 |
| Narrowband weight | 0 | 0.5 (Ha/OIII) | 0 |
| Smoothness / Edge preservation | 10 / 0.7 | 10 / 0.7 | 12 / 0.8 |
| Parallax amount | 20 | 20 | 16 |
| Star plane / Star floatation | 0.9 / 1.0 | 0.9 / 1.0 | 0.85 / 0.8 |
Convergence is automatic by default in all three presets; we untick Auto convergence only when we want to set it by hand. Max disparity is left at 0 unless a particular scene is hard to fuse.
[hide]
Tune depth on grayscale, judge stereo in stereo. Stay in Depth map output mode while setting Depth cues and Depth shaping. The grayscale depth is much easier to read than a 3D effect, and we will spot wrong assignments (a brighter star reading as foreground, a galaxy core that should recede, a noisy sky) much faster.
Stretched images give the best depth. All cues read perceptual brightness. If we feed in a linear image the depth map is almost flat (most pixels are near zero) and no amount of tuning will recover relief. Stretch the image first; for narrowband, prefer a linked or permanent stretch so the Ha/OIII ratio is preserved.
Stereo controls are cache hits. Parallax amount, Convergence, Max disparity, Anaglyph color, Swap eyes, and all the Animation parameters re-render quickly because they reuse the cached depth map. Move them freely; only Depth cues, Narrowband, Depth shaping, Star layer, and Depth painting trigger a depth rebuild.
Use the star layer instead of fighting the stars. Bright stars are point sources at infinity but read as foreground to the cues, producing depth spikes. A star mask plus Star floatation around 1 floats them onto a clean plane that reads correctly in both still stereo and animation. Even better, use the starless + stars mode, so each star can be assigned its own depth, and they rarely leave any trails.
Auto convergence first, then Max disparity if needed. Auto convergence opens every scene centered on its median depth, which is comfortable for almost any subject. Reach for Max disparity only when a particular deep scene strains the eyes to fuse.
Anaglyph color modes matter on emission nebulae. Saturated reds cause noticeable red/cyan rivalry under colored glasses, especially on Ha-dominant nebulae. Switching from Color to Half-color or Optimized (Dubois) often makes the same scene fuse cleanly.
Strong wiggle amplitude reveals background. The hole-fill stretches the background flat across the disocclusion area, which is fine at moderate settings but reads as a soft smear at very strong Amplitude or Parallax amount. If a wiggle has visible smearing, lower Amplitude before raising it.
Pick the right export format for the destination. GIF is small and plays everywhere but is 256-color quantized: the default for casual sharing. AVI is full-color and lossless but very large: the choice for archival or color-critical output. APNG is a lossless middle path that browsers loop natively but older viewers do not. MP4 (registered users with ffmpeg configured) is the best choice for YouTube, Facebook, mobile, and web embedding: small files, modern H.264 quality, plays everywhere. For VR headset viewing, the Export VR 180 button writes a side-by-side stereoscopic still: a JPEG by default that works in dedicated VR media players, and an MP4 form (with ffmpeg configured) carrying the VR 180 metadata that YouTube and dedicated VR players recognize. Facebook and Google Photos may not reliably auto-detect VR 180.
Wiggle path angle and Circular open new motions. The classic horizontal wiggle is a great default, but a vertical (90°) wiggle reads beautifully on horizontally elongated nebulae, and a 45° diagonal sweep often gives the strongest depth cue for galaxies. Ticking Circular turns any path angle into a smooth orbit that avoids the brief pause at the swing extremes: particularly effective when sharing on social media, where the eye latches onto the continuous motion.
Save instances as process icons. The full parameter set is serialized in the instance, so a working recipe can be dragged to a process icon and applied to other frames of the same target later, or used as a starting point on related targets.
Copyright © 2026 Deep Sky Colors. All Rights Reserved.