PSR-NET

Chandrayaan-2 OHRC · permanent shadow recovery

000 reading the frame

Chandrayaan-2 · Orbiter High Resolution Camera

There is a place
the sun has never reached.

Not once in two billion years. Scroll — we are going there.

Begin descent

01 · Approach

The south pole turns toward us.

The Moon's axis is tilted 1.54°. With almost no obliquity there is no polar summer: the sun stays pinned to the horizon and rakes the landscape at grazing incidence forever.

02 · Permanent shadow

These floors never get lit.

Any depression deep enough to hide behind its own rim stays dark in every season. Below 110 K, cold enough to trap water ice for geological time — and we have almost no pictures of the ground.

03 · The orbiter

OHRC comes over the horizon.

Twenty-five centimetres per pixel from a hundred kilometres up — the sharpest eye ever flown to the Moon. It was built to find the boulder that would tip a lander over, before the lander found it.

04 · Target

Shackleton. 89.9° south.

The reticle drops onto a crater floor inside an Artemis candidate region. The craft slews, locks, and opens the shutter on ground that has never been photographed in reflected sunlight, because there has never been any.

05 · Descent

Down the beam.

Through the rim shadow, onto the floor.

06 · Surface

A rover, working in the dark.

Its lamp reaches a few metres. Everything past that is lit only by sunlight that bounced off the crater wall above — about a thousandth of the light falling on the rim.

07 · The picture

This is what the camera got.

A 256-metre patch of floor at 25 cm per pixel, twelve bits deep, and almost all of it sitting on the noise floor. The rest of this page is about getting the terrain back out of it.

Chandrayaan-2 · Orbiter High Resolution Camera

This image
is not empty.

It is a 256-metre patch of the floor of a crater at the lunar south pole, at 25 cm per pixel. The sun has not risen on it in two billion years. Every photon in it bounced off a sunlit wall first.

Pixel values present
0–12 of 4095
Frame signal-to-noise
3.4
Below DN 8
94.9%

Scroll. The frame is going to open up.

Shaded relief of the lunar south pole from LOLA altimetry
Measured Lunar south pole, 170 km across. Shaded relief from the LOLA gridded DEM. The violet is every pixel that stays in shadow when the horizon is tested from six azimuths at a 1.54° sun — the permanently shadowed regions, computed here, not traced from a figure.

Where this happens

The Moon's axis is tilted 1.54°. Earth's is 23.4°.

That single number is the whole story. With almost no obliquity there is no polar summer to speak of: near the poles the sun stays pinned to the horizon and rakes across the landscape at grazing incidence forever. Any depression deep enough to hide behind its own rim never gets lit — not in winter, not in summer, not once in the last two billion years.

These are cold traps. Surface temperatures inside them sit below 110 K, cold enough that water ice delivered by comets and micrometeorites cannot sublime away on geological timescales. It is the single most valuable real estate in the inner solar system, and we have almost no pictures of the ground.

  • 19.8% of this field is permanently shadowed
  • 7.96km of relief across the frame
  • <110K floor temperature — a water-ice cold trap

Why the frame is nearly black

There is light down there. There is just about a thousandth of it.

No direct beam, by definition

A PSR is defined by never receiving direct sunlight. Whatever reaches the floor has scattered off an illuminated wall above, or arrived as Earthshine, or come from starlight and the zodiacal glow. Published estimates put the secondary irradiance between 10−3 and 10−5 of direct solar, depending on how much sunlit wall the spot can see.

The exposure cannot be lengthened

OHRC is a push-broom instrument on a spacecraft moving at 1.6 km/s. Integration time per line is fixed by ground speed and the along-track sample spacing — stare longer and the image smears. Time delay integration buys back a factor of 64 by shifting charge down the array in step with the ground, and that is the entire margin available.

So the signal lands on the noise floor

At these irradiances a pixel collects a handful of electrons. Read noise is 28 e− RMS, about 1.2 DN. The scene's whole dynamic range inside the shadow is roughly 12 DN out of a 4095-count well. The information is there — it is simply the same size as the noise, which is a different problem from being absent.

Direct sunlit terrain~2400 DN
PSR floor, wall-scattered~5 DN
Read noise, per pixel1.2 DN

Bars are logarithmic. The linear picture is a 500:1 contrast ratio, which is why a single global stretch cannot show both.

The sensor

OHRC is the sharpest eye ever flown to the Moon.

Twenty-five centimetres per pixel from a 100 km orbit. It was flown to certify landing sites — to find the boulder that would tip a lander over before the lander found it. Inside a PSR it is being asked to do that job with a thousandth of the light it was designed around, which is precisely why the recovery problem is worth solving rather than working around.

Every figure below is used directly by the sensor model that generated the frames on this page, so the simulation cannot quietly disagree with the specification it claims to follow.

Chandrayaan-2 OHRC — parameters used by the sensor model
Ground sample distance0.25 m at 100 km
Swath3.0 km
Spectral band400–750 nm, panchromatic
DetectorTDI CCD, 64 stages
Line time290 µs
Quantisation12 bit (0–4095 DN)
Full well95 000 e−
Read noise28 e− RMS ≈ 1.2 DN
Dark signal180 e−/s → 3.3 e− per integration
PRNU1.2 %
Along-track smear2.4 px, TDI rate mismatch
00 · RAW 1024 × 1024 · 0.25 m/px · 256 m field
Running the pipeline…
—dB
—
—
—

PSNR and SSIM are measured live against the paired target: the same scene under the same wall-scattered light, rendered with a perfect sensor. Both images are put on a common scale by a least-squares affine fit first, so the score measures recovered structure rather than a tone-curve preference.

Stage 00

The frame as downlinked

Twelve-bit digital numbers, displayed across their true range. The column striping is the sensor's own: each image column reads through its own amplifier chain, and the offsets differ. The mottling is photon shot noise plus 28 e− of read noise. Somewhere under it is a crater floor.

Stage 01

Radiometric correction

Bias and dark current are added to every pixel whether or not a photon arrived, so they come off first. The offset is estimated from the mode of the frame's own low tail rather than a calibration table, which keeps the method usable on data whose ancillary files you do not have.

Why first: every later estimator assumes zero-mean noise about a physical signal.

Stage 02

Column fixed-pattern removal

The stripes are constant down each column; real terrain is not. Taking the column-wise median of the residual against a horizontally smoothed copy isolates the electronic offset and leaves vertical geology intact. Watch the vertical banding leave without the ridges going with it.

Why here: striping is structured noise. A denoiser tuned for white noise treats it as signal and preserves it.

Stage 03

Edge-preserving denoise

A guided filter fits a local linear model of the image against itself. Where the local variance is pure noise the model collapses to the local mean; where it is a crater rim, the edge passes through untouched. Linear time in pixel count, and no gradient reversal at the boulder edges this whole exercise exists to protect.

Why before deblurring: Richardson–Lucy amplifies whatever noise you hand it, without bound.

Stage 04

Illumination correction

Inside a PSR the light comes from whatever patch of sunlit wall a spot can see, so irradiance falls by more than a decade across one frame. Multi-scale retinex divides out the illumination field at three scales at once and leaves reflectance — the property of the rock rather than of the geometry.

This is the step that makes a single global stretch work at all.

Stage 05

Deconvolution

The blur is not anyone's mistake. It is the optical point spread function convolved with 2.4 pixels of along-track smear, because a TDI line rate never exactly matches ground speed. Richardson–Lucy is the maximum-likelihood inverse for Poisson data — which is what a photon-starved frame is — and it cannot return negative radiance, so rims sharpen instead of ringing into ghost pairs.

Iterations are capped at 24. Past that it stops recovering structure and starts inventing it.

Stage 06

Local contrast, clipped

CLAHE equalises tile by tile so a bright patch of wall-lit floor cannot crush the shadowed half of the frame. The clip limit caps the transfer slope, which is the honesty parameter of the entire pipeline: without it, a tile of flat noise gets stretched into convincing texture.

Clip limit 2.6. Raise it and the picture gets prettier and less true.

Stage 07

The trained network

Everything above is the deterministic chain — operators anyone can audit, each one doing a thing you can name. This stage is PSR-Net: 714 000 parameters trained on synthetic frames whose sensor was re-randomised on every single sample, so it never saw the same noise, blur, gain or column pattern twice.

Running here, in your browser, on the same array the chain got. —

On 24 held-out scenes it scores 20.28 dB against the chain's 17.47. Held out means scenes and noise seeds it never trained on — but from the same generator, so it proves the network inverts this calibrated degradation better than a fixed operator chain, not that it works on real OHRC frames.

Stage 08

Detection, with a hallucination test

Laplacian-of-Gaussian blobs across a scale octave, scored on the block-and-shadow pair rather than on brightness — a noise spike has no shadow. Then the part that matters: every candidate is re-tested against independent noise realisations of the same scene. Real blocks survive resampling because they are in the signal. Hallucinations do not.

— detections retained, — rejected as unstable. Ring size is scale; opacity is confidence.

Stage 09 · Result

Against the target

The right-hand half is the paired target: the same scene under the same light, rendered with a noiseless, smear-free sensor. Nothing in the pipeline has ever seen it. It exists so the numbers underneath the viewport can be measured rather than asserted.

Drag the divider, or focus the frame and use the arrow keys.

The model

A network trained on physics it cannot argue with.

There is no ground truth inside a PSR. Nobody has ever photographed the floor of Shackleton in reflected sunlight, so there is no clean image to regress toward. The published approach — and the one taken here — inverts the problem: model the scene and the sensor precisely enough that you can generate as many exactly-paired examples as you need, then learn the inverse of a degradation you defined.

Backbone

A NAFNet-style U-Net: three scales, depthwise convolution, SimpleGate, channel attention, no batch norm. 714 401 parameters — deliberately small. A frame whose entire dynamic range is a dozen DN does not support a large model, and capacity beyond what the data supports is capacity available for inventing detail. No diffusion prior and no adversarial head, because both produce plausible texture, and plausible is exactly what a landing-site product must not contain.

Training data

Synthetic pairs generated by the same renderer that made this page's frames: crater populations on a d−2.6 size-frequency slope, boulders on d−3, illumination from a single-bounce wall-scattering model, and the full sensor chain — shot noise, dark, read noise, PRNU, column offsets, TDI smear, 12-bit quantisation.

Loss

Charbonnier on radiance, plus a gradient term on the log domain so faint edges count as much as bright ones, plus a Poisson likelihood term that ties the output back to the photon statistics of the input. No adversarial term: a discriminator rewards convincing texture, which is the failure mode being designed against.

Uncertainty

The final layer predicts per-pixel variance as well as radiance (heteroscedastic regression), and Monte-Carlo dropout at inference gives an epistemic band on top. Every delivered product carries a confidence raster; a pixel the model is unsure about is marked, not smoothed over.

Honest scope

What is running on this page

Both halves run here, on your machine, against the same 12-bit array: the deterministic operator chain, and the trained network. PSR-Net is 714,401 parameters — small enough to be a 2.9 MB static file, which is the only reason a web page can honestly claim to be running the model rather than describing it. It was trained on synthetic frames whose sensor was re-randomised every sample; the generator, the training script and the checkpoint are all in this repository.

Checking for weights…

Ablation

Learned versus deterministic, on held-out scenes

Both methods get the same input, both are scored after the same affine fit to the target, and the held-out scenes are degraded with fixed seeds so the comparison is reproducible. Run python psr/train/evaluate.py to regenerate it.

MethodPSNR (dB)SSIMΔ vs raw
No benchmark file yet — train the model to produce one.

Ablation, measured live

Each row removes one stage and re-runs everything else against the paired target. These figures are computed in your browser when this section scrolls into view — if you change the demo parameters further down, they change too.

ConfigurationPSNR (dB)SSIMCNRΔ PSNR
Scroll here to run the ablation…

Two rows in that table look wrong. They are not.

Removing radiometric correction changes PSNR by 0.00 dB. It should: the affine fit used before scoring absorbs any constant offset, and bias is a constant offset. The stage still matters — every downstream estimator assumes noise is zero-mean about a physical signal, and the detector's shadow test compares absolute levels — but this particular metric is blind to it by construction. A metric that cannot see a stage is a fact about the metric.

Removing deconvolution improves PSNR slightly while SSIM falls. That gap is the whole argument of this page in one row. Richardson–Lucy trades pixel-wise error for structural fidelity: it sharpens rims, which SSIM rewards and squared error punishes, because a sharpened edge that is half a pixel off costs more MSE than a blurred edge that is centred. If you optimise a PSR pipeline on PSNR alone you will delete the deconvolution and ship a blurrier product that scores better.

Validation

How do you check an image of something nobody has ever seen?

1 · Paired synthetic truth

Degrade a known scene through the calibrated sensor model, recover it, and measure PSNR, SSIM and LPIPS against the original. This is the only place full-reference metrics are legitimate, and it tests the inverse of exactly the degradation you modelled — no more.

2 · Real frames, no reference

On actual OHRC data there is nothing to compare to, so the metrics change shape: contrast-to-noise ratio, gradient energy, and BRISQUE/NIQE-class no-reference scores. They cannot tell you the picture is correct. They can tell you it stopped being noise.

3 · Cross-sensor agreement

ShadowCam on KPLO images PSRs directly at 200× the sensitivity of a conventional camera. Where its coverage overlaps an enhanced OHRC frame, the recovered structure has to match a genuinely independent observation. This is the strongest external check available, and the one a reviewer should ask for.

Validation, continued

Three more ways to be wrong, checked.

4 · Topographic consistency

Recovered slopes and shadow directions must be consistent with LOLA altimetry and with the illumination geometry at the time of acquisition. A boulder whose shadow points the wrong way relative to the sunlit wall is a detection error, and this test finds it without any reference image at all.

5 · Ensemble stability

Re-run detection across independent noise realisations of the same frame and keep only what recurs. This converts "is it real?" from an aesthetic judgement into a measurable frequency, and it is what produces the confidence value attached to every detection above.

6 · Injection recovery

Plant synthetic boulders of known size and position into real frames, run the pipeline blind, and measure what fraction come back and at what size limit. Borrowed from observational astronomy, where it is the standard way to calibrate a detection completeness curve.

The failure mode that matters

A generative model asked to enhance a dark image will produce a beautiful, confident, entirely fictional boulder field. If that product certifies a landing site, the error is not aesthetic. Every design decision on this page — no adversarial loss, clipped contrast limits, capped deconvolution iterations, ensemble stability testing, per-pixel uncertainty — exists to make the pipeline prefer saying "I don't know" over saying something plausible.

Provenance

What on this page is measured, and what is modelled.

A reviewer's first question is which parts are data. Answering it before being asked is the difference between a demonstration and a claim.

ElementStatusSource and treatment
South-pole topography Measured LOLA gridded DEM at 16 px/deg, NASA/GSFC SVS CGI Moon Kit. Resampled to a polar stereographic frame at 189 m/px and smoothed at 3 px, still four times finer than the source grid.
PSR extent map Derived Horizon marching on that DEM from six azimuths at a 1.54° sun. Computed by this project; agrees with published PSR maps in extent and location, not traced from them.
OHRC instrument parameters Published GSD, swath, TDI stages, line time, quantisation and band from the mission instrument description. Noise figures are representative of a TDI CCD of this class.
The 256 m crater-floor frame Synthetic No altimetry resolves terrain at 0.25 m. Craters drawn from a d−2.6 size-frequency law, boulders from d−3, both scaled to a polar crater floor. Statistics, not terrain.
Illumination inside the PSR Modelled Single-bounce wall scattering at 3×10−3 of direct, gated by sky visibility. A first-order radiosity stand-in, good to a factor of a few — the accuracy published irradiance estimates themselves carry.
Sensor degradation Modelled Shot noise, dark, read noise, PRNU, column offset and gain, TDI smear, 12-bit quantisation, applied in sensor order — blur before noise, because the optics smear photons before the detector counts them.
Every metric on this page Computed live PSNR, SSIM, CNR, sharpness and the ablation table run in your browser against the paired target. Nothing is quoted from a results table.
Trained network weights Trained here PSR-Net was trained on this project's own generator — 384 cached scenes, sensor re-randomised every sample — and exported to ONNX with a numerical check against the PyTorch graph before shipping. The page loads the weights and runs them; if they are absent it says so in the model section rather than pretending. Generator, training script, checkpoint and benchmark are all in psr/train.
The learned-vs-deterministic table Measured Produced by evaluate.py on scenes held out of training, with fixed degradation seeds, both methods scored identically. The page reads that file; it does not restate it.

Try to break it

Blur it. Bury it in noise. Then look again.

The controls degrade the frame further, beyond what the sensor model already did, and the pipeline re-runs on the result. The metrics underneath are recomputed against the same untouched target every time, so you can find the point where recovery stops working — and it does have one.

Degraded input
Recovered
Target · never seen by the pipeline
PSNR
— dB
SSIM
—
CNR
—
Stable detections
—

Push blur past 2.5 px σ with a few DN of extra noise and watch SSIM collapse while the detection count climbs. Those are not recovered boulders — they are Richardson–Lucy amplifying noise into blocks, and the ensemble stability test is the only thing standing between that texture and a hazard map. Drop the iterations to 8 and the invented blocks disappear along with some real ones. That trade is the entire engineering problem.

Where it goes

This is a ground-segment product, not a camera setting.

Landing-site certification

Chandrayaan-3 landed at 69.4°S. Artemis III candidate regions sit within 6° of the pole, and several have PSR floors inside the landing ellipse. A boulder-and-slope hazard map inside those shadows is currently a gap in the mission-planning chain, filled today by inference from LOLA altimetry at 5 m/px — twenty times coarser than OHRC.

Ice prospecting

Surface frost signatures, sublimation pits and blocky ejecta exposing buried volatiles are all morphological. They need images, not just spectra, and the places worth looking are exactly the places that are dark.

Runs on the ground segment

The full chain is roughly 1.2 GFLOP per megapixel and processes an OHRC strip in seconds on one GPU. Nothing needs to fly: it consumes the archived radiometrically corrected product and emits an enhanced raster plus a confidence raster in the same projection.

Readiness, stated plainly

  1. Done — end-to-end physical scene and sensor model, and the operator chain running against it, both reproducible from this repository.
  2. Next — train the network on real OHRC PSR frames from the ISRO PRADAN archive, which requires data access rather than new method.
  3. Then — cross-validate against ShadowCam coverage of the same PSRs and publish a detection completeness curve from injection-recovery.
  4. Gate — no product goes into a landing-site decision without the completeness curve and the confidence raster attached to it.