Skip to main content

Sensor emulation and harmonization for Earth Observation (Sentinel-2 → Landsat MSS).

Project description

🛰️ SatHarmony

Sensor emulation and harmonization for Earth Observation.

PyPI Python License

SatHarmony provides physically-based sensor emulation to create synthetic historical satellite imagery from modern sensors. Currently supports Sentinel-2 → Landsat MSS emulation with realistic degradation modeling.

Installation

pip install satharmony

# With GeoTIFF I/O support
pip install satharmony[io]

Quick Start

import numpy as np
import satharmony

# Load your Sentinel-2 image (C, H, W) and CloudSEN12 labels (H, W)
s2_image = ...      # shape: (13, 512, 512), float32, [0, 1]
s2_labels = ...     # shape: (512, 512), uint8, classes 0-3

# Emulate both together (recommended - guarantees matching dimensions)
mss, mss_labels, scale_factor = satharmony.emulate_s2_with_labels(
    s2_image, s2_labels, seed=42
)
# mss.shape:        (4, 73, 73)
# mss_labels.shape: (73, 73)

# Or emulate separately (must pass scale_factor to labels)
mss, sf = satharmony.emulate_s2(s2_image, seed=42)
mss_labels = satharmony.emulate_labels(s2_labels, scale_factor=sf)

Features

The MSS emulator applies physically-motivated degradations:

Degradation Description
Spectral Band selection (B3, B4, B7, B8 → MSS 4 bands)
Spatial PSF convolution + downsampling (10m → 60-80m)
Radiometric 6-bit quantization, sqrt compression, saturation
Striping 6-detector gain/offset mismatch artifacts
Memory Effect Bright target recovery trailing
Noise Coherent (periodic) + random (gaussian/poisson)
Scan Artifacts Line dropouts and transmission errors

API Reference

# Combined emulation (recommended)
mss, labels, sf = satharmony.emulate_s2_with_labels(image, labels, seed=42)

# Independent emulation
mss, sf = satharmony.emulate_s2(image, seed=42)
mss, sf = satharmony.emulate_s2(image, scale_factor=8)  # fixed scale
labels = satharmony.emulate_labels(labels, scale_factor=sf)

# Low-level access
from satharmony import MSSEmulator, PipelineConfig

config = PipelineConfig()
config.spatial.target_gsd.min = 60.0
config.spatial.target_gsd.max = 60.0  # fixed 60m

emulator = MSSEmulator(config)
mss = emulator(image)

Label Aggregation

CloudSEN12 labels (10m) are aggregated using conservative criteria from Roy et al.:

  • Precedence: cloud > shadow > thin_cloud > clear
  • Classes: 0=clear, 1=thin_cloud, 2=cloud, 3=shadow

Citation

@software{satharmony2025,
  author  = {Contreras, Julio},
  title   = {SatHarmony: Sensor Emulation for Earth Observation},
  year    = {2025},
  url     = {https://github.com/IPL-UV/satharmony}
}

License

MIT License - see LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

satharmony-0.1.3.tar.gz (11.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

satharmony-0.1.3-py3-none-any.whl (15.4 kB view details)

Uploaded Python 3

File details

Details for the file satharmony-0.1.3.tar.gz.

File metadata

  • Download URL: satharmony-0.1.3.tar.gz
  • Upload date:
  • Size: 11.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.12.3 Linux/6.14.0-24-generic

File hashes

Hashes for satharmony-0.1.3.tar.gz
Algorithm Hash digest
SHA256 1be21251de49bb96e6090cde61d0ffae9472b47b92bb69cfad924ea323371742
MD5 40260285f223b861ce2d6bf64360515a
BLAKE2b-256 9ddf2e30c06ea7583682b4ca002600b85f0e6aa6cd983570b2b7d67ea9c08abe

See more details on using hashes here.

File details

Details for the file satharmony-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: satharmony-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 15.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.12.3 Linux/6.14.0-24-generic

File hashes

Hashes for satharmony-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 74d5e9bac3c87f20dff724e8bcdbdba5d238197f7af97f68f04366d5549a208c
MD5 d5f8943ae53d2ecd43108f5038e19f55
BLAKE2b-256 97a6c1a3f9d1dbb60a79cfdb8c612d3942a31b6146910e2eca19d5b33213ffa8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page