Sensor emulation and harmonization for Earth Observation (Sentinel-2 → Landsat MSS).
Project description
🛰️ SatHarmony
Sensor emulation and harmonization for Earth Observation.
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file satharmony-0.1.12.tar.gz.
File metadata
- Download URL: satharmony-0.1.12.tar.gz
- Upload date:
- Size: 14.0 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
786bc1fe8ca31e264dbfb13a41ccb41d1ea3178290d6836b97ee2ce0a059e2fd
|
|
| MD5 |
88abd1c2987204a55fb79f156f41b8a1
|
|
| BLAKE2b-256 |
27b7b5a7477494b985a11f7aa05aee46f4b121aa75eeda4f1cff7ddc2cde13a9
|
File details
Details for the file satharmony-0.1.12-py3-none-any.whl.
File metadata
- Download URL: satharmony-0.1.12-py3-none-any.whl
- Upload date:
- Size: 18.2 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3574ec7dfe732754699b74b660342bd502179b975ff3f393b69f66abcabf0c2f
|
|
| MD5 |
e00efb3f57780a69b5f7954394ad654f
|
|
| BLAKE2b-256 |
f95ffb4d7678b76f85c8f5ba66e10e79b50887236b6720f0a6865aac1c3e2076
|