Remote Sensing Change Detection
Purpose
Remote Sensing Change Detection identifies areas where spectral, thermal, or structural properties have changed between two or more satellite, aerial, or SAR image acquisitions. Applications include urban growth mapping, vegetation dynamics assessment, post-disaster impact analysis, and environmental monitoring.
This tool is designed for:
- Bi-temporal analysis — Comparing two image acquisitions to isolate change
- Multi-temporal stacking — Analyzing 3+ images in temporal sequence
- Multi-sensor comparison — Detecting changes across different sensor modalities (optical, thermal, SAR)
- Threshold-based and statistical methods — Flexible detection algorithms tuned to application requirements
Typical Questions This Tool Helps Answer
- Where has significant land surface change occurred between these two acquisition dates, and how large is the affected area?
- Which change classes — vegetation gain or vegetation loss — dominate the scene, and what is their spatial distribution and relative fraction across the study area?
- Does the detected change pattern match known event footprints such as fire perimeters, flood extents, harvest units, or construction boundaries?
Background
Change detection leverages the principle that unchanged areas remain spectrally or radiometrically similar between acquisitions, while changed areas show measurable differences. Key methodological approaches include:
Differencing (Absolute Change)
$$\Delta I = I_{t_2} - I_{t_1}$$
Simple subtraction identifies magnitude of change but is sensitive to illumination and atmospheric differences.
Ratio (Relative Change)
$$R = \frac{I_{t_2}}{I_{t_1}}$$
Reduces atmospheric effects and sensor calibration bias; particularly effective for vegetation indices.
Normalized Difference Index (NDI)
For multispectral data with Red and Near-Infrared bands: $$\text{NDI} = \frac{\text{NIR} - \text{Red}}{\text{NIR} + \text{Red}}$$
Then compute change as: $$\Delta \text{NDI} = \text{NDI}{t_2} - \text{NDI}{t_1}$$
Reduces atmospheric and illumination variation while emphasizing vegetation dynamics.
Spectral Angle Mapper (SAM)
For hyperspectral or multispectral data, compute the spectral angle between two pixels: $$\theta = \arccos\left(\frac{\mathbf{s}_1 \cdot \mathbf{s}_2}{|\mathbf{s}_1| |\mathbf{s}_2|}\right)$$
Smaller angles indicate spectral similarity (no change); larger angles indicate spectral difference (change).
Statistical Testing
For time series analysis, hypothesis tests (e.g., t-test, Mann-Whitney) determine if differences are statistically significant or within expected noise.
Inputs
| Argument | Type | Required | Geometry / Type Constraints | Description |
|---|---|---|---|---|
| baseline_bundle | Multiband raster | Yes | Must be a readable multiband raster with accessible red and NIR bands. | Baseline scene bundle. |
| change_bundle | Multiband raster | Yes | Must be a readable multiband raster with accessible red and NIR bands. | Change-date scene bundle. |
| intermediate_ndvi | Single-band raster | No | Must be a readable raster. If provided, it is harmonized to the baseline NDVI grid. | Optional intermediate-date NDVI for temporal validation. |
Parameters
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| baseline_red_band_index | Integer | No | 0 | Zero-based red-band index in baseline_bundle. |
| baseline_nir_band_index | Integer | No | 1 | Zero-based NIR-band index in baseline_bundle. |
| change_red_band_index | Integer | No | 0 | Zero-based red-band index in change_bundle. |
| change_nir_band_index | Integer | No | 1 | Zero-based NIR-band index in change_bundle. |
| profile | String | No | balanced | aggressive, balanced, or conservative. |
| high_confidence_threshold | Float | No | 0.85 | Threshold used for high-confidence summary counts. Must be in [0, 1]. |
| output | String | No | change_detection | Output prefix for generated artifacts. |
Parameters baseline_red, baseline_nir, change_red, and change_nir are not part of this workflow and are rejected.
Outputs
Output artifact keys below are runtime outputs, not input parameters.
| Artifact | Runtime Output Key | Type | What It Contains |
|---|---|---|---|
Change map (${prefix}_change.tif) | change_map | GeoTIFF raster | Signed NDVI change surface. |
Confidence map (${prefix}_confidence.tif) | confidence | GeoTIFF raster | Confidence score raster in [0, 1]. |
Class-area table (${prefix}_class_area_table.csv) | class_area_table | CSV | Per-class area accounting for vegetation_loss, vegetation_gain, and unchanged with fractions over valid pixels. |
Summary contract (${prefix}_summary.json) | summary | JSON | Summary contract including workflow metadata, profile, inputs, parameters, summary statistics, interpretation, outputs, and a timings_ms block. |
Optional report (${prefix}_report.html) | html_report | HTML | HTML rendering of the summary JSON. |
Important summary fields
| Key | Meaning |
|---|---|
inputs.input_description | Bundle-mode description including selected band indices. |
inputs.intermediate_ndvi | Path to the optional intermediate NDVI raster, or null. |
parameters.min_change_threshold | Profile-specific minimum NDVI change threshold. |
parameters.magnitude_scale | Profile-specific magnitude scaling value. |
parameters.high_confidence_threshold | Threshold used for summary counts. |
parameters.temporal_validation_enabled | true when intermediate_ndvi was provided. |
summary.valid_pixels | Number of valid analyzed pixels. |
summary.pixels_with_change | Number of changed pixels. |
summary.change_fraction_of_image | Percent-string fraction of the image showing change. |
summary.vegetation_loss_pixels | Count of loss pixels. |
summary.vegetation_gain_pixels | Count of gain pixels. |
summary.unchanged_pixels | Count of valid pixels below the profile change threshold. |
summary.vegetation_loss_fraction_of_valid_pixels | Fraction of valid pixels in the vegetation_loss class. |
summary.vegetation_gain_fraction_of_valid_pixels | Fraction of valid pixels in the vegetation_gain class. |
summary.unchanged_fraction_of_valid_pixels | Fraction of valid pixels in the unchanged class. |
summary.high_confidence_change | Percent-string share of changed pixels above the high-confidence threshold. |
summary.high_confidence_change_pixels | Count of high-confidence changed pixels. |
summary.mean_confidence | Mean confidence over valid pixels. |
summary.mean_temporal_consistency | Mean temporal consistency over valid pixels. |
class_definitions | Explicit class rules for vegetation_loss, vegetation_gain, and unchanged. |
class_area_accounting | Reconciliation block ensuring class totals equal valid pixels. |
output_semantics | Machine-readable semantics tags per output key. |
confidence_contract | Standardized confidence method and low-confidence summary fields. |
interpretation_warnings | Explicit warning statements about class and confidence interpretation constraints. |
interpretation | Contains dominant_trend, confidence_assessment, and temporal_consistency. |
outputs | Contains change_map, confidence, and class_area_table. |
timings_ms.step5g_write_summary | Test-required timing key present in the timing block. |
Returned payload keys
The workflow returns these output keys:
change_mapconfidenceclass_area_tablesummaryhtml_report
Example
import whitebox_workflows as wbw
env = wbw.WbEnvironment()
env.remote_sensing_change_detection(
baseline_bundle="baseline_scene.tif",
baseline_red_band_index=0,
baseline_nir_band_index=1,
change_bundle="change_scene.tif",
change_red_band_index=0,
change_nir_band_index=1,
intermediate_ndvi="intermediate_ndvi.tif",
profile="balanced",
high_confidence_threshold=0.85,
output="forest_change_2026",
)
References
- Bovolo, F., & Bruzzone, L. (2005). Unsupervised change detection based on change vector analysis. IEEE Transactions on Geoscience and Remote Sensing.
- Zhu, Z., & Woodcock, C. E. (2014). Continuous change detection and classification using Landsat data. Remote Sensing of Environment.
Parameter Interaction Notes
- The four band-index parameters are part of the core contract; wrong indices will produce wrong NDVI change even if the workflow runs successfully.
profilechanges the minimum change threshold and the weighting of magnitude versus temporal consistency, so it materially affects confidence scoring.high_confidence_thresholdchanges summary counts only; it does not reclassify the confidence raster itself.- Adding
intermediate_ndvican substantially change temporal consistency and the narrative in the interpretation block.
QA and Acceptance Criteria
- Verify
baseline_bundleandchange_bundleare treated as required inputs. - Verify the example uses bundle-mode arguments exactly.
- Verify the summary JSON contains the documented keys, including
interpretationandtimings_ms. - Verify the returned payload contains
change_map,confidence,summary, andhtml_report. - Verify
timings_ms.step5g_write_summaryexists in the summary. - If
intermediate_ndviis supplied, verifyparameters.temporal_validation_enabled=true.
The workflow fails if unsupported per-band parameters are used, if required bundles are missing, if rasters cannot be read, if harmonization requires missing CRS EPSG metadata, if a band index is out of range, if profile is invalid, or if high_confidence_threshold falls outside [0, 1].
Advanced Operational Guidance
- Treat the band indices as part of the deliverable record; they are essential for auditability.
- Use
intermediate_ndviwhen seasonality or cloud contamination could make two-date comparison ambiguous. - Review the confidence raster together with the change raster before field or regulatory use.
- Use distinct output prefixes for scenario comparison runs.
Implementation Patterns
- Two-date screening run: baseline and change bundles only.
- Three-date validation run: add
intermediate_ndvifor stronger temporal support. - Profile sensitivity run: compare
aggressive,balanced, andconservative. - Delivery run: publish change, confidence, summary, and HTML report together.
Related Tools
multi_sensor_fusion_monitoringtime_series_change_intelligencesar_analysis_readiness
When To Use This Workflow
Use this workflow when you need a repeatable NDVI change package from multiband scene bundles and you want confidence-aware reporting instead of a generic menu of change methods.
What this workflow helps you do:
- Compare two multiband scenes with explicit red/NIR band control.
- Add optional temporal validation from an intermediate NDVI surface.
- Deliver both signed change and confidence outputs with a report-ready summary.
Results Delivery Checklist
- Deliver the change raster, confidence raster, summary JSON, and HTML report together.
- Record the exact band indices used for both bundles.
- State whether
intermediate_ndviwas used. - Review the interpretation block before operational or regulatory use.
- Confirm
timings_msand summary keys are present before handoff.
Common Questions
Q: Why can confidence stay low even when the signed change looks strong?
A: Because confidence is not based on magnitude alone. It also reflects spectral quality and temporal consistency.
Q: What is the main misinterpretation risk here?
A: Treating this as a generic change-detection engine. The implementation is specifically bundle-based NDVI change detection with explicit red/NIR indexing.
Q: Which setting matters most for scenario sensitivity?
A: profile, because it changes the minimum change threshold and the weighting between magnitude and temporal consistency.
Q: When should operations add intermediate_ndvi?
A: Add it when seasonal effects, clouds, or transient disturbance could otherwise make a two-date comparison ambiguous.