Skip to content

Cloud masks

Clouds and their shadows would pull an index towards meaningless values, so AgroSat masks them before computing statistics. Masked pixels are left out of mean, median and the other values, and counted in cloud_fraction.

Each Sentinel-2 statistics row says which mask produced it, in cloud_mask:

cloud_mask Built from When
scl_cld The scene classification layer plus the cloud-probability layer Scenes that have a cloud-probability layer. This is the normal case for current imagery.
scl The scene classification layer only Scenes without a cloud-probability layer, mostly older than 2025.

scl masks cloud edges and thin cloud less strictly than scl_cld, so an scl date can keep a few hazy pixels that scl_cld would remove. A scene without the cloud-probability layer still produces statistics instead of failing.

{
"date": "2022-06-18",
"mean": 0.6402, "median": 0.6611, "min": 0.1937, "max": 0.8124,
"std": 0.0877, "p10": 0.5263, "p90": 0.7408,
"valid_fraction": 0.9615, "cloud_fraction": 0.0385, "cloud_mask": "scl"
}
  • When you compare seasons before and after 2025, expect the older dates, which are more likely to carry scl, to be slightly noisier.
  • If you flag sudden drops in an index, require a higher valid_fraction for scl dates, or confirm the drop on the next clear date.
  • cloud_fraction is the share of the field masked as cloud; valid_fraction is the share of the field actually used. The two need not add up to 1: pixels can be left out for reasons other than cloud.

scene_cloud_cover from dates is a different number: the cloud cover reported for the whole satellite scene, which covers far more than your field. Use it to skip obviously cloudy days, and the per-field values above to judge the data you actually got.