Lunar image registration

Every pixel, in its true place.

Sub-pixel registration for lunar imagery that holds across Sun angle, scale and viewpoint.

Sources
PRADAN · LRO · SELENE · USGS
Models
DINOv2 · SuperPoint · LightGlue
Runs
Fully offline

001 / 006

A controlled map stays true.

Decades of orbital imagery have been stitched into mosaics tied to laser-altimeter ground control. At the south pole that map is accurate to metres — it is the fixed reference everything else is measured against.

002 / 006

A new image arrives in the wrong place.

A fresh high-resolution image is placed on the Moon using predicted orbit and pointing. Small errors in those predictions move it away from the ground it actually shows — close enough to look right, too far to be trusted.

003 / 006

Sun angle changes everything.

Near the pole the Sun never climbs far above the horizon. The same crater throws a different shadow on every pass, so two images of the same ground can share almost no pixels that look alike.

004 / 006

Matching finds the same ground.

Contrast is normalised, then learned features propose tie-points: places where the new image and the map show the same ground. When shading defeats keypoints, foundation-model embeddings and area correlation take over.

005 / 006

Verification rejects what disagrees.

Not every tie-point is right. RANSAC keeps only those that agree on one geometric transform, then checks they spread across the whole frame instead of clustering in one corner.

006 / 006

Registered.

The verified transform moves the image onto the map's grid. It is exported as a GeoTIFF that opens on the right ground in any GIS, alongside a report of how accurate the fit is.

Try it

Put it in the wrong place.

This strip of the lunar south pole starts where predicted orbit put it. Drag it anywhere near its ground and let go — the tie-points from a real LunarLens run find where it belongs.

Drag the strip, or focus it and press Enter.

Under the hood

Five stages, one transform.

Every registration runs the same pipeline, on your machine, with open-source models and no cloud calls. Each stage can refuse a bad answer instead of passing it on.

  1. 01

    Ingest

    Loads both images at a working resolution and reads each sensor's ground sample distance when the product declares it.

    PDS4 · GeoTIFF · PNG
  2. 02

    Normalise

    Local contrast equalisation flattens harsh polar shadows so two passes under different Sun angles become comparable.

    CLAHE
  3. 03

    Match

    A foundation model recognises the same terrain; learned keypoints pair up across it; area correlation takes over when shading defeats them.

    DINOv2 · SuperPoint · LightGlue
  4. 04

    Verify

    RANSAC keeps only tie-points that agree on one transform; degeneracy and coverage gates refuse fits that only look right.

    USAC · 4×4 coverage
  5. 05

    Warp & export

    Resamples the image onto the reference grid and writes a GeoTIFF in the reference's projection, with a full JSON report.

    GeoTIFF · JSON

Proof

Measured, not claimed.

Ground-truth error from the benchmark suite: every pair has an exactly known transform, so accuracy is measured against the truth rather than the engine's own fit.

22 / 22

benchmark runs produced an accepted transform

0.27 px

median error when the truth is unambiguous

3.5×

lower error with scale bridging at 2–12× resolution gaps

Median ground-truth error by pair kindpx

Cross-mission pairs settle near 3 px because two archives disagree about where the same ground is — the control pairs isolate the engine's own error.

Error vs resolution gapno bridge scale bridge

Beyond a 16× gap the reference is too small to carry the detail, and the engine refuses rather than guesses.