Janus / Guides / S-CCD

Change detection · near real time

S-CCD, step by step.

S-CCD is CCDC made for monitoring. It starts the same harmonic model of every band on a pixel's first stable observations. After that, a Kalman filter updates the model a little with each new image, instead of fitting it again. The model follows slow changes, and a new image costs one small update. At the last date, S-CCD also says which pixels have started to depart from their model, before enough images have come in to confirm a change.

01The idea

CCDC models each band of a pixel as a harmonic: a trend plus the annual and semiannual cycles. It looks for a change when several clear observations in a row depart from the model. Each time the segment grows, CCDC fits the model again on all its observations.

S-CCD (Stochastic Continuous Change Detection, Ye et al. 2021) starts its models in the same way, with 18 clear observations over at least a year. After that, the coefficients become the state of a Kalman filter, and they may drift a little from one observation to the next. Each observation that fits the model updates it once, so the model follows a forest growing or a season shifting without being fitted again. The test of a change is CCDC's:

Statistic
An observation's departure from the model's prediction, scaled by each band's RMSE and summed over the five detection bands (green to SWIR2).
Anomaly
An observation whose statistic is above the change threshold: 15.09 for five bands at a probability of 0.99.
Break
Six anomalies in a row (Consecutive anomalies), departing in the same direction. The break is dated on the first of them, and a new model starts after it.
Outlier
A single observation far beyond the threshold (30.9) and not followed by others, such as a cloud the quality band missed. It is left out of the model.
Change in progress
At the last date: the latest observations are anomalies, but fewer than six of them. It may become a break with the next images.
Waiting for a model
After a break, a pixel needs 18 new clear observations over at least a year before it is monitored again.

02The example

The series of the CCDC guide: 125 Landsat 8 and 9 dates of central Rondônia, February 2020 to August 2026, 1690 × 1675 pixels. Two Landsat paths are interleaved, so each pixel is seen on about 60 of the dates. Clear images come almost only from May to October, about nine a year. Here each date is a GeoTIFF of the six reflectance bands, with the pixels that QA_PIXEL marks as cloud or shadow already set to no data. With the QA_PIXEL band in the files instead, choose it as the Quality band in the Display panel.

The Janus window: the NDVI of 23 August 2026 over the Rondônia scene, forest in yellow and pasture in blue and green, one pin, its NDVI series on the chart with S-CCD's model in magenta, and S-CCD's numbers in the Statistics table.
The series in NDVI (NIR as the band, red for the normalized difference), on its last date, 23 August 2026. Pin 1 is the first pixel of this guide; S-CCD is drawn over its series.

03Opening the tool

The S-CCD (stochastic CCDC) window: its description, the six bands mapped to blue, green, red, NIR, SWIR1 and SWIR2, a note that no quality band is set, and the first parameters.
The S-CCD window. Janus maps the bands from their names.

Tools → Change detection → S-CCD (stochastic CCDC), among the change detection tools. The tool needs real dates and the six Landsat-style reflectance bands. They are mapped from the band names when it can. It comes from Zeit (zeit.sccd) and is built into Janus, so there is nothing to install. The units are found from the values: reflectance 0–1, reflectance × 10,000 or Collection 2 digital numbers.

The window notes that there is no quality band. In this series the clouds are already no data, so nothing is lost. In a series with its QA_PIXEL band, set that band as the quality band.

04A confirmed change

With the tool open, S-CCD runs on every series the chart shows: the cursor, the pins and the ROI. Over each one it draws the filtered model (in the units of the series shown, here NDVI) and a vertical line at each break. The numbers go to the Statistics table.

The chart of pin 1: NDVI near 0.85 every dry season from 2020 to 2023, a vertical line in July 2023, then NDVI between 0.4 and 0.85 with a deeper seasonal cycle, and the magenta model following each segment.
Pin 1, a forest cleared in July 2023. The model of the pasture starts after the break.
The Statistics table: 2 segments, 58 clear observations, segment 1 from 2020-05-26 to 2023-06-28 with 22 observations and a break on 2023-07-06 of magnitude 1874, segment 2 from 2023-07-22 to 2026-08-23 with 28 observations, monitoring, latest anomalies 0 of 6, last statistic 12.14.
Its numbers: the segments, the break and the state at the last date.

The forest's model runs from 26 May 2020 to 28 June 2023 on 22 observations. On 6 July 2023 the pixel departs from it, and the next observations confirm the change. The magnitude, 1874, is the length of the change over the five detection bands, in reflectance × 10,000: the NIR fell and the SWIR rose. A second model, the pasture, starts with the observation of 22 July and covers the three years since.

At the last date pixel 1 is monitoring with 0 of 6 anomalies. Its last statistic, 12.14, is below the threshold of 15.09. Some of its 2026 observations sit off the model, but anomalies count only in a row up to the last image, and the latest one fits.

05A change in progress

A second pixel, about 11 km to the north-west (pixel 378, 778):

The chart of the second pixel: NDVI between 0.7 and 0.9 every year from 2020 to 2025, the magenta model following its seasons, then five observations from late June 2026 falling to between 0.4 and 0.55.
A forest whose last five observations fall far below its model.
The Statistics table: 1 segment, 56 clear observations, segment 1 from 2020-05-26 to 2026-06-04 with 48 observations, monitoring, latest anomalies 5 of 6 since 2026-06-28, last statistic 243.7.
5 of 6 anomalies, since 28 June 2026.

For six years this pixel follows its model, through dry seasons that differ from year to year. Then, from 28 June 2026, its NDVI falls from about 0.8 to 0.5. The NIR drops by a third and the SWIR1 rises, which is what a clearing looks like. Each of the five observations since then is far beyond the threshold: the last statistic is 243.7, sixteen times the threshold of 15.09. S-CCD has not yet confirmed a change, because it needs six anomalies. The pixel is a change in progress: 5 of 6 anomalies, since 28 June. One more image like these would confirm a break dated 28 June.

Batch CCDC on the same data has no such state. At the end of a series it either dates a break of the last segment from the partial change, or leaves the pixel in its model.

Check a few pins first

Drop pins on places you know, such as a clearing, a forest left alone and a pasture. Read their charts before running the image. Look for outliers that are clouds the quality band missed: in this stack, the image of 12 February 2023 has clouds left in it. Where a real change follows such an outlier, the break can be dated on the cloud.

06The parameters

ParameterDefaultWhat it does
Reflectance unitsautoThe units of the six bands. S-CCD's valid range and magnitudes are in reflectance × 10,000. Automatic reads them from the values; the files' scale and offset are applied first.
Consecutive anomalies6Anomalies in a row that make a change. Fewer means earlier breaks and more false ones. It also sets how long a change stays "in progress". It counts clear observations, so in this series six of them are six weeks in the dry season but can span a whole rainy season.
Change probability0.99The chi-square probability of the change threshold over the five detection bands (15.09). A lower value is more sensitive.
Outlier probability0.99999Above this threshold (30.9), a single observation is an outlier, left out of the model.
Max angle (degrees)30The largest mean angle between the anomalies' departures and their median one. A change departs in one direction and noise does not, so a wider angle accepts more as change.
Max segments6Segments kept per pixel.

07Running it on the image

Under Run on the raster, choose the Whole image, the Visible area or the ROI, then Run. The run happens in the background on every core, and the map stays usable meanwhile. This guide runs it on a 16 × 16 km ROI around both pins:

The Tasks panel: S-CCD (stochastic CCDC) on the ROI, 596 by 596 pixels, done 100 percent in 10 seconds, with Log, Folder and Remove buttons.
Tasks: the 355,216 pixels of the ROI, with 61 dates each, took 10 s.

The outputs are GeoTIFFs, saved by default in %LOCALAPPDATA%\Janus\results next to the run's job.json and job.log. They open over the map as layers of their own in the Layers panel, and the first one, the number of breaks, is shown. The maps below are drawn over the Esri imagery, with the series dimmed to 25%.

08The maps

MapMeaning
BreaksThe number of confirmed breaks.
First / last / largest break dateThe date of the first, the last and the largest break, as a decimal year.
Largest break magnitudeThe length of the largest break over the five detection bands, in reflectance × 10,000.
Monitoring state (last date)A class map: stable (monitoring, with no anomaly among the latest observations), change in progress (one or more), waiting for a model after a change, or no model (never enough clear observations).
Latest anomaliesHow many of the latest observations in a row are anomalies, up to Consecutive anomalies.
Anomalies sinceThe date of the first of them.
The number of breaks over the ROI: most of it purple for none, large teal patches for one break, scattered yellow for two.
Breaks: none (purple), one (teal) or two (yellow).
The date of the largest break, from 2022 in purple to 2026 in yellow, with fields of one colour each and no colour where there was no break.
Largest break date, 2022 (purple) to 2026 (yellow).

41% of the pixels have at least one break: 36.5% one and 4.5% two. Most of the largest breaks are in 2023 (50,347 pixels) and 2024 (50,055). The breaks follow field edges, but many fall on a few dates: 23 August and 8 September 2023 each hold a few percent of the pixels. That looks like the drought and fires of 2023 on the pastures more than like new clearings. S-CCD reports any lasting departure from a pixel's own seasons, not only a change of land cover. The magnitude map and the charts tell them apart.

The monitoring state on 23 August 2026: grey for stable over most of the ROI, red patches for a change in progress, mostly in the north, orange fields waiting for a model after a change, and a few near-white pixels with no model; the two pins.
Monitoring state on 23 August 2026, with the Alerts colormap: stable (grey), change in progress (red), waiting for a model after a change (orange), no model (near-white).

On the last date, 58.1% of the ROI is stable, 13.4% has a change in progress, 27.3% is waiting for a model after a change, and 1.2% has no model.

  • Waiting is long with dry-season data. A new model needs 18 clear observations over at least a year. With nine a year, that means two dry seasons, so every pixel that broke in 2025 or 2026 is still orange. Until it has a model again, such a pixel cannot signal a new change.
  • Not every red pixel is a clearing. A change in progress starts with a single anomaly. The two maps below say how far along it is and since when.
The latest anomalies, 0 in dark blue over most of the ROI, up to 5 in yellow, in patches mostly in the north and along field edges.
Latest anomalies, 0 (blue) to 5 (yellow).
The date of the first of the latest anomalies, over the Esri imagery: blue and green for June and July 2026, yellow for August 2026, scattered across the ROI.
Anomalies since, June (blue) to August 2026 (yellow); the range set by hand, 2026.42 to 2026.65.

29,058 pixels (8.2%) have three or more anomalies. Their first anomalies cluster on a few dates: 14 July (12,654 pixels) and 7 August 2026 (9,761). When so many start on the same day, the whole landscape is departing at once: pastures drying faster than in the years their models learned, or smoke from the season's fires. A clearing such as the second pin's stands out by its size: five anomalies far beyond the threshold, with the NIR down and the SWIR up. Read the state with its anomalies and its chart, or wait for the next images.

The other maps are layers of their own in the Layers panel. Show one with its eye, or hover the map: the chart keeps the pixel's series and its S-CCD model, so every colour can be checked against the chart behind it.

09S-CCD or CCDC

Both tools take the same series and the same bands, and their models start in the same way. The differences:

  • The model. CCDC's model is the best fit of a whole segment. S-CCD's is a running estimate that gives more weight to recent observations, so it often absorbs a dry season unlike the others rather than opening a new segment. On this ROI, 41% of the pixels have an S-CCD break, against 54% with CCDC (both run in Zeit, on the same pixels).
  • The end of the series. CCDC dates a change that is not yet complete at the last date as a break. S-CCD reports it as a change in progress, with its anomalies and their start, and dates a break only once it is confirmed.
  • Speed. On this series of about 60 dates the two are close: in Zeit, 14 s for these pixels against 20 s for CCDC, because starting each model takes the same work in both. On long, dense series, S-CCD is about ten times faster than CCDC: each new image costs one update per pixel.
  • A cloud-free image of any date, and classifying the segments, are in the CCDC tool.

The algorithm was written in Zeit from the paper. The authors' package, pyxccd, served only as a black box to compare against. On 4096 pixels of this stack, 85% of the pixels have as many breaks in both, and three quarters of pyxccd's breaks are within one observation of Zeit's. The magnitudes of the breaks both find correlate at 0.99. Zeit finds about 20% more breaks, all of them near the threshold. pyxccd takes 10.1 s on those pixels, and Zeit 1.1 s on one thread.

10What next

  • Other ways to read every date: CCDC for the whole history and its synthetic images, EWMACD for control charts on one index, and CODED to tell degradation from deforestation with the NDFI.
  • Compare it. Tools → Change detection → Agreement of change maps takes several maps of dates (S-CCD's largest break date, CCDC, LandTrendr) and maps where and when they agree.
  • Validate it. The break dates make a map of events. The Validation guide shows how to sample it and estimate its accuracy and areas.
  • Script it. The same algorithm is zeit.sccd in Python; Zeit's S-CCD tutorial follows the same pixels.

11References

  • Ye, S., Rogan, J., Zhu, Z., Eastman, J. R. (2021). A near-real-time approach for monitoring forest disturbance using Landsat time series: stochastic continuous change detection. Remote Sensing of Environment, 252, 112167.
  • Zhu, Z., Woodcock, C. E. (2014). Continuous change detection and classification of land cover using all available Landsat data. Remote Sensing of Environment, 144, 152–171.
  • Zhu, Z., Zhang, J., Yang, Z., Aljaddani, A. H., Cohen, W. B., Qiu, S., Zhou, C. (2020). Continuous monitoring of land disturbance based on Landsat time series. Remote Sensing of Environment, 238, 111116.
  • Zeit: the change detection library behind the tools of Janus.