The classic Semi-Automatic Classification Plugin algorithm set — Spectral Angle Mapping, Minimum Distance, Maximum Likelihood (Mahalanobis via Cholesky), Parallelepiped, and unsupervised K-means — implemented in pure C#, plus Random Forest / SVM / XGBoost via an optional ML sidecar. Train on ROI polygons or GPS points, render through the existing ImageServer as just another raster function, and trust the result with a confusion matrix + Overall Accuracy + Kappa. No Python required for the core classifiers.
Classification isn't a separate application — it's a renderingRule on the existing ImageServer. Swap the rule and the ImageryTileLayer re-renders classified. exportImage, tile caching, and every SDK client serve it unchanged.
# classify with a trained signature set ?renderingRule={ "rasterFunction": "Classify", "rasterFunctionArguments": { "signatureSetId": "set-7", "smoothRadius": 2, "calibrate": "dos1" } } # inline K-means preview (no training, per-tile) ?renderingRule={ "rasterFunction": "KMeans", "rasterFunctionArguments": {"k":5} }
The SCP-parity supervised + unsupervised classifiers are pure C# (air-gapped). RF/SVM/XGBoost add a small ML sidecar when installed; the engine dispatches on the algorithm string and the surface is identical.
θ = acos(p·m / ‖p‖‖m‖) — scale-invariant, works on raw DN or reflectance. Optional max-angle threshold → unclassified.
Euclidean distance to the class mean in band space. The fast baseline.
Mahalanobis distance via Cholesky (Σ = LLᵀ) with a ridge guard that rescues near-singular and single-sample covariances.
Box test per band (mean ± k·stddev). The quick reject filter.
k-means++ seeding + Lloyd iteration. Produces centroids you can persist as a named signature set for coherent cross-tile classification.
Ensemble classifiers via an optional :8006 scikit-learn sidecar. The trained tree ensemble runs in-process via a C# tree-walker — no Python at inference time.
Holds out a test fraction (seeded Fisher-Yates, default seed 7 to match ml4qgis), classifies each held-out vector, and reports Overall Accuracy, per-class Producer's/User's accuracy, and Cohen's Kappa. A Plotly heatmap renders in-map.
Convert raw DN to reflectance before classifying. Reads Landsat .MTL + Sentinel-2 MTD_MSIL*.xml sidecars (which GDAL doesn't auto-parse). MaxLik and the ensemble benefit; SAM is scale-invariant so it's a harmless no-op.
Two signature sets over the same raster → a change map + a from→to transition tally. Deforestation, urban growth, flood extent — the classic remote-sensing workflow.
Classify SEGMENTS (not pixels) to eliminate salt-and-pepper noise by construction. Spectral mean/std per band + shape metrics + GLCM texture per segment.
Per-class mean ± 1σ band curves so you can judge separability BEFORE classifying — well-separated curves = good classes; overlapping bands = pick different bands or merge.
Optional post-classification smoothing — each pixel becomes the majority class in its window, gated by a threshold so thin linear features (roads, rivers) survive.
The SCP algorithm set, the modern ensemble stack, and the credibility reporting — all air-gapped. Pair with IMINT exploitation and annotated reporting.
Get Started