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.9.tar.gz (11.7 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.9-py3-none-any.whl (15.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: satharmony-0.1.9.tar.gz
  • Upload date:
  • Size: 11.7 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.9.tar.gz
Algorithm Hash digest
SHA256 eb31d9d8b6395274ad2552add805ba69fda9ecca1ea7089c8e440bf5414cffe8
MD5 670455840d7cfb3b6a02073a229c36ea
BLAKE2b-256 d8570669293704e7a706cbba677a0ac61e090e2b10db387abaafbc072fdda8ca

See more details on using hashes here.

File details

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

File metadata

  • Download URL: satharmony-0.1.9-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.9-py3-none-any.whl
Algorithm Hash digest
SHA256 b1ea06d55aa984fd490ec3ca62e4329e75d18ed63d85ce0173d745acf7a04a87
MD5 56771863ee61bc0a8ce2c36765df0cd5
BLAKE2b-256 cff8eac02f3f553e41c409791d71be71ecfe871dcc3db341d964e952f1cb6ccf

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