Franck Garnier 85e9645363 fix: remove PIL pixel limit for very large panoramas
1.47 billion pixel image from sol 1769 (56 MCZ images) exceeded
the 500M limit. Mars panoramas can legitimately be this large.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:35:02 -04:00

Mars Panorama Pipeline

Automated panorama stitching for NASA Mars rovers (Perseverance, Curiosity) using Hugin CLI tools in Docker.

Quick Start

# Build the image
docker build -t mars-panorama-pipeline .

# Run a NavCam panorama (sol 1813)
docker run --rm \
  -v /mnt/astro/mars_rovers:/data \
  -v /mnt/astro/mars_rovers/images/panorama/perseverance:/output \
  mars-panorama-pipeline \
  --sol 1813 --camera NAVCAM_LEFT

# Run a Mastcam-Z panorama (sol 1817)
docker run --rm \
  -v /mnt/astro/mars_rovers:/data \
  -v /mnt/astro/mars_rovers/images/panorama/perseverance:/output \
  mars-panorama-pipeline \
  --sol 1817 --camera MCZ_LEFT

# List available sequences for a sol
docker run --rm \
  -v /mnt/astro/mars_rovers:/data \
  mars-panorama-pipeline \
  --sol 1813 --camera NAVCAM_LEFT --list-only

With Docker Compose

docker compose run panorama --sol 1813 --camera NAVCAM_LEFT

Pipeline Steps

  1. Find sequence — Query MySQL for panorama-capable image sequences
  2. Combine tiles — NavCam tiles 01+04 with 16px overlap blending
  3. CLAHE preprocessing — Vignette correction + contrast normalization (for cpfind only)
  4. cpfind — Feature matching on CLAHE images (aggressive params)
  5. cpclean — Remove outlier control points
  6. Swap to originals — Replace CLAHE images with originals in PTO
  7. autooptimiser — Geometry-only optimization (NO photometric -m flag)
  8. nona + verdandi — Remap and blend final panorama (verdandi eliminates overexposure at seams)
  9. Export PNG — Convert TIFF output to PNG

Supported Cameras

Camera Rover FOV Tile combining
NAVCAM_LEFT/RIGHT Perseverance 82.17° (combined) Yes (01+04, 16px overlap)
MCZ_LEFT/RIGHT Perseverance 25.6° (wide zoom) No

Configuration

Environment variables (or .env file):

  • MYSQL_HOST — MySQL server (default: 192.168.1.42)
  • MYSQL_PORT — MySQL port (default: 3306)
  • MYSQL_USER — MySQL user (default: soldan)
  • MYSQL_PASSWORD — MySQL password
  • MYSQL_DATABASE — Database name (default: mars_rovers)
Description
Automated Mars rover panorama stitching pipeline - Docker + Hugin + Python
Readme 100 KiB
Languages
Python 96.4%
Dockerfile 3.6%