Catalog PyPI
PACKAGE EXPLORERView in registry

adjeff

PyPI

Library that provides utilities to simulate adjacency effects.

Versions collected1
Direct dependencies12From release 1.2.7
Last observed20 Oct, 19:35 UTC

README

Version 1.2.7 documentation

Adjeff

Adjeff simulates and corrects the adjacency effect in Sentinel-2 imagery: the light that the atmosphere scatters from neighbouring pixels into the one observed.

  • Forward simulation: top-of-atmosphere reflectance of any surface, by GPU Monte Carlo radiative transfer (Smart-G).
  • PSF learning: the atmospheric point spread function $P$, fitted per band and atmospheric state as an analytical kernel.
  • Correction: surface reflectance recovered from an observed scene, with the learned PSF.

$$\rho_{toa} = \rho_{atm} + T^\downarrow \frac{T^\uparrow_{dir},\rho_s + T^\uparrow_{dif},(\rho_s \ast P)}{1 - s,(\rho_s \ast P)}$$

Installation

Adjeff is managed with pixi: Smart-G and part of its dependencies come from conda-forge.

git clone https://github.com/walcark/Adjeff.git && cd Adjeff
pixi install -e gpu          # or -e cpu, without Smart-G simulations
export SMARTG_DIR_AUXDATA=/path/to/smartg/auxdata

Simulations need a CUDA 12.6 GPU and the Smart-G auxiliary data. Analysis, PSF models and the 5S formulas run on CPU.

Example

import adjeff
from adjeff.core import KingPSF, S2Band, disk_image_dict
from adjeff.modules.models import Unif2Surface
from adjeff.optim import TrainingImages

bands = [S2Band.B03]
cfg = adjeff.make_full_config(bands, aot=0.2, rh=50.0, h=0.0, sza=30.0, vza=5.0)

# Bright disks of 1, 5 and 50 km on a dark ground, 120 m pixels.
disks = [
    disk_image_dict(radius=r, res_km=0.12, rho_max=0.5, bands=bands, n=1999)
    for r in (1.0, 5.0, 50.0)
]

# Simulate their radiative terms, rho_toa and rho_unif (GPU).
disks = adjeff.run_forward_pipeline(disks, **cfg)

# Fit the King PSF that recovers rho_s from rho_unif.
model = adjeff.make_model(
    Unif2Surface, KingPSF, bands, res_km=0.12, n=1999,
    init_parameters={"sigma": 0.5, "gamma": 2.0},
)
tree = adjeff.fit(model, TrainingImages(disks))

# Correct a scene carrying rho_unif and the radiative terms.
corrected = adjeff.apply_psf(disks[0], tree, S2Band.B03)

adjeff.fit_psf(scene, bands, KingPSF, ...) does the same in one call, at the mean atmosphere of a loaded product.

Documentation

User guideConcepts, configuration, samplers, PSF, fitting, cache, logging
NotebooksSix worked examples, from a synthetic scene to a PSF fitted and measured
ChangelogWhat changed, and why
RoadmapOpen questions and planned work

Development

pixi install -e dev
pixi run -e dev all                    # format, lint, mypy --strict, tests
pixi run -e dev-gpu test-integration   # Smart-G tests, on GPU

License

Apache-2.0.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
1.2.720 Oct 202612

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
walcark/adjeff

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 19:35 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:02ede4fc18521cc88250a398627a08a830e914e86648e23d05ce84a77ecc6c59