SAR Interferogram and Coherence
Purpose
SAR Interferogram and Coherence computes spatial and temporal coherence from SAR image pairs, quantifying phase stability for interferometric analysis. High coherence indicates reliable phase information; low coherence suggests volume scattering or temporal decorrelation.
Typical Questions This Tool Helps Answer
- Which areas of the scene have stable coherence suitable for surface displacement mapping or subsidence monitoring?
- Where is temporal or volumetric decorrelation too severe to produce reliable interferometric phase, and should those zones be masked?
- Are the coherence values consistent with the expected land-cover behavior — strong in urban areas, lower in vegetated and agricultural zones?
When To Use This Workflow
Use SAR Interferogram and Coherence when:
- You have a registered (or registerable) SAR pair and need coherence and/or interferogram products
- You need embedded acceptance gates in your deliverable for governance or QA purposes
- You want a compact inline pipeline that handles coregistration and coherence in a single step
For best results, run sar_analysis_readiness on the pair before this tool to confirm scene compatibility.
Background
Coherence quantifies phase stability between two SAR acquisitions:
$$\gamma = \frac{\left|E[s_1 s_2^*]\right|}{\sqrt{E[|s_1|^2]E[|s_2|^2]}}$$
With $\gamma\in[0,1]$, high values indicate stable scattering and reliable interferometric support, while low values suggest decorrelation or poor registration/support.
Physical Decorrelation Components
Observed coherence is often interpreted as the product of multiple effects:
$$\gamma_{obs} \approx \gamma_{geom},\gamma_{temp},\gamma_{vol},\gamma_{snr},\gamma_{proc}$$
Where geometric baseline, temporal change, volumetric scattering, SNR, and processing quality each contribute to coherence loss.
Estimation Trade-Offs
Coherence is estimated over finite windows (or multilook neighborhoods). Larger windows reduce variance but blur fine features; smaller windows preserve detail but increase estimator noise. Production choices should match the scale of the decision task.
Methodological Considerations
- Enforce strong coregistration before coherence estimation to avoid artificial decorrelation.
- Use consistent windowing/multilook settings when comparing scenarios or dates.
- Interpret coherence jointly with land-cover and geometry context; low coherence is not a single-cause diagnosis.
Practical Interpretation Pitfalls
Common errors include using fixed coherence thresholds across heterogeneous terrain, confusing low SNR effects with true temporal change, and over-interpreting isolated high-coherence patches without neighborhood continuity.
Inputs
| Argument | Type | Required | Description |
|---|---|---|---|
| reference_sar | String path | Conditional | Reference SAR raster (direct mode). |
| moving_sar | String path | Conditional | Moving SAR raster (direct mode). |
| reference_sar_real | String path | Conditional | Reference real component (complex mode). |
| reference_sar_imag | String path | Conditional | Reference imaginary component (complex mode). |
| moving_sar_real | String path | Conditional | Moving real component (complex mode). |
| moving_sar_imag | String path | Conditional | Moving imaginary component (complex mode). |
| reference_sar_bundle | String path | Conditional | Reference SAR bundle root or archive (bundle mode). |
| moving_sar_bundle | String path | Conditional | Moving SAR bundle root or archive (bundle mode). |
| reference_measurement_key | String | No | Measurement key within reference bundle. |
| moving_measurement_key | String | No | Measurement key within moving bundle. |
| input_dem | String path | No | Optional DEM for terrain-context masking. |
Parameters
| Argument | Type | Default | Description |
|---|---|---|---|
| auto_coregister_pair | Bool | false | Run built-in coregistration before coherence. |
| assume_prealigned_pair | Bool | false | Assert pair is on matching grids; skip coregistration. |
| coreg_mode | String | translation | Coregistration mode for handoff: translation, affine, local_offset_grid. |
| coreg_max_offset_px | Integer | 24 | Max offset searched during auto-coregistration. |
| coreg_decimation | Integer | 4 | Sampling stride during auto-coregistration. |
| coreg_min_overlap_fraction | Float | 0.20 | Minimum valid overlap fraction during auto-coregistration. |
| coherence_window | Integer | 7 | Odd-valued estimation window (px). |
| coherence_decimation | Integer | 1 | Coherence sampling stride; > 1 uses coarser grid. |
| performance_profile | String | balanced | balanced or fast. |
| acceptance_min_valid_fraction | Float | 0.25 | Acceptance gate: min valid-sample fraction. |
| acceptance_min_mean_coherence | Float | 0.20 | Acceptance gate: min mean coherence. |
| acceptance_max_coreg_residual_mae_px | Float | 2.0 | Acceptance gate: max coreg residual MAE (px). |
| write_interferogram | Bool | true | Write interferogram raster. |
| write_coherence | Bool | true | Write coherence raster. |
| write_valid_mask | Bool | true | Write valid-sample mask. |
| write_html_report | Bool | true | Write HTML report. |
| output_layout | String | standard | GeoTIFF layout: standard or cog. |
| output_compression | String | none | GeoTIFF compression: none or deflate. |
| output_tile_size | Integer | 512 | Tile size for COG layout. |
| output_prefix | String | sar_interferogram_coherence | File name prefix for output artifacts. |
Outputs
| Output | Type | Description |
|---|---|---|
| interferogram | Raster | Phase difference raster. |
| coherence | Raster (Float32) | Per-pixel coherence (0–1). |
| valid_mask | Raster (UInt8) | Binary valid-sample mask. |
| summary | JSON | Run metadata, acceptance gates, spatial statistics. |
| html_report | HTML | Human-readable coherence report. |
Runtime output keys (returned in ToolRunResult.outputs):
| Key | Points to |
|---|---|
interferogram | Interferogram raster (only present when write_interferogram=true) |
coherence | Coherence raster (only present when write_coherence=true) |
valid_mask | Valid-sample mask raster (only present when write_valid_mask=true) |
summary | Summary JSON artifact |
html_report | HTML report (only present when write_html_report=true) |
Summary JSON Schema (summary)
Top-level keys:
workflow:"sar_interferogram_coherence"schema_version:"1.0.0"acceptance_gates:valid_fraction,valid_fraction_threshold,valid_fraction_passmean_coherence,mean_coherence_threshold,mean_coherence_passcoreg_residual_gate_applicable,coreg_residual_mae_px,coreg_residual_mae_threshold_px,coreg_residual_mae_passoverall_pass(bool)
summary:rows,cols,valid_fraction,mean_coherencecoregistration:performed,residual_mae_px,search_best_scoreparameters: echo of all runtime parameter values
Example
import whitebox_workflows as wbw
env = wbw.WbEnvironment()
env.working_directory = "/data/sar_project"
# Pre-aligned pair
result = env.earth_observation_sar.sar_interferogram_coherence(
reference_sar="s1_20260401_vv.tif",
moving_sar="outputs/s1_aligned.tif",
assume_prealigned_pair=True,
coherence_window=7,
output_prefix="outputs/coherence_run"
)
import json
s = json.loads(open(result.outputs["summary"]).read())
print(s["acceptance_gates"]["overall_pass"])
print(s["summary"]["mean_coherence"])
Inline Coregistration Example
result = env.earth_observation_sar.sar_interferogram_coherence(
reference_sar="s1_20260401_vv.tif",
moving_sar="s1_20260413_vv.tif",
auto_coregister_pair=True,
coherence_window=9,
output_prefix="outputs/coherence_run"
)
References
- Rosen, P. A., et al. (2000). Synthetic aperture radar interferometry. Proc. IEEE, 88(3), 333–382.
- Bamler, R., & Hartl, P. (1998). Synthetic aperture radar interferometry. Inverse Problems, 14(4), R1–R54.
- Touzi, R., et al. (1999). Coherence estimation for SAR imagery. IEEE TGRS, 37(1), 135–149.
Parameter Interaction Notes
auto_coregister_pair=trueandassume_prealigned_pair=trueare mutually exclusive — setting both is an error.coherence_windowandcoherence_decimation: large window + decimation > 1 saves runtime at the cost of local spatial detail.acceptance_min_mean_coherenceshould be adjusted for land cover context: vegetated or water-heavy scenes will naturally report lower values.write_interferogram=falsesuppresses the interferogram output — use when only coherence is needed.
QA and Acceptance Criteria
- Input readiness: use
sar_analysis_readinessto confirm scene compatibility first. - Acceptance gate:
summary["acceptance_gates"]["overall_pass"]must betruebefore delivering coherence products. - Mean coherence plausibility: values < 0.2 are expected over vegetation/water; > 0.7 expected over stable urban surfaces.
- Valid fraction: if
valid_fraction< 0.25, check terrain masking extent and DEM/scene overlap. - Visual review: coherence map should show spatial gradients aligned with land cover; uniform blobs indicate artifacts.
Advanced Operational Guidance
- For deformation monitoring, use complex component mode for true interferometric phase.
- Archive
summary.jsonper pair as the canonical processing record. - Fix
coherence_windowandoutput_compressionacross all pairs in a multi-date stack to ensure comparability.
Implementation Patterns
- InSAR prep:
sar_analysis_readiness→sar_coregistration→sar_interferogram_coherence(withassume_prealigned_pair=true) - Inline pipeline:
sar_interferogram_coherencewithauto_coregister_pair=true - Coherence-only:
write_interferogram=falseto skip interferogram output - COG delivery:
output_layout=cog,output_compression=deflate
Related Tools
sar_coregistration— dedicated coregistration step for full per-burst QA recordsar_analysis_readiness— scene pair compatibility validationtime_series_change_intelligence— multi-date coherence-stack change analysis
Results Delivery Checklist
-
acceptance_gates.overall_pass=trueconfirmed -
coherenceraster delivered and visually inspected -
summary.jsonarchived per pair as processing record -
valid_fractionreviewed to confirm masking is not excessive - HTML report reviewed and attached to project record
Common Questions
Q: What does overall_pass: false mean for my deliverable?
A: One or more acceptance gates failed. Check valid_fraction_pass (excessive masking?), mean_coherence_pass (expected for vegetation/water?), and coreg_residual_mae_pass (alignment quality). Each has its own threshold value in the summary for diagnosis.
Q: Mean coherence is 0.12 — is the processing wrong?
A: Not necessarily. Values below 0.2 are normal over dense vegetation, agricultural land, or scenes spanning seasonal change. Check valid_fraction to confirm enough valid samples are present, then consider whether low coherence is physically meaningful given the land cover.
Q: Should I run sar_coregistration first, or use auto_coregister_pair=true?
A: Use the standalone sar_coregistration tool when you need the per-burst diagnostic transform JSON as a separate QA record. Use auto_coregister_pair=true for a compact pipeline when only the coherence product and summary JSON are needed.
Q: What does coherence_window=7 mean for my spatial resolution?
A: Coherence is estimated over a 7×7 pixel neighborhood. Larger windows produce smoother maps at the cost of spatial detail. For Sentinel-1 IW (10 m pixels), the effective resolution of the coherence estimate is ~70 m.