Introduction à la classification hyperspectrale
La classification d'images hyperspectrales repose sur l'exploitation de techniques de vision par ordinateur et d'apprentissage automatique pour identifier et catégoriser automatiquement les éléments d'une scène. Contrairement aux images RGB classiques, les données hyperspectrales capturent des informations spectrales continues sur des centaines de bandes, allant du visible à l'infrarouge. Cette richesse spectrale permet de distinguer des matériaux ayant des signatures chimiques ou physiques très similaires.
Cette technologie est cruciale dans des domaines tels que la télédétection, l'agriculture de précision (évaluation de la santé des cultures) et la surveillance environnementale. L'évolution des méthodes de classification est passée de règles heuristiques manuelles à des modèles statistiques avancés et des réseaux de neurones profonds, bien que les algorithmes non supervisés comme le K-Means restent des outils fondamentaux pour l'exploration de données non étiquetées.
Fondements de l'algorithme K-Means
Principes et mécanique
Le K-Means est un algorithme de partitionnement qui divise un ensemble de $n$ observations en $k$ groupes (clusters) en minimisant la variance intra-cluster. Le processus itératif se décompose ainsi :
- Initialisation : Sélection de $k$ centroïdes initiaux.
- Affectation : Chaque point est assigné au centroïde le plus proche (généralement via la distance euclidienne).
- Mise à jour : Recalcul des centroïdes comme la moyenne des points de chaque cluster.
- Convergence : Répétition jusqu'à stabilisation des centroïdes ou atteinte d'un nombre maximal d'itérations.
Stratégies d'initialisation et convergence
Le choix des centroïdes initiaux impacte fortement la qualité finale et le risque de converger vers un minimum local. L'approche K-Means++ est souvent préférée à l'initialisation aléatoire pure, car elle disperse les centroïdes initiaux de manière probabiliste.
import numpy as np
from sklearn.cluster import KMeans
# Génération d'un jeu de données synthétique bidimensionnel
dataset = np.random.uniform(low=0.0, high=10.0, size=(200, 2))
# Configuration du modèle avec l'initialisation K-Means++
model = KMeans(n_clusters=4, init='k-means++', n_init=10, random_state=42)
model.fit(dataset)
La condition d'arrêt est contrôlée par des paramètres tels que le nombre maximal d'itérations et un seuil de tolérance pour le déplacement des centroïdes.
# Ajustement des critères de convergence
cluster_model = KMeans(n_clusters=4, max_iter=500, tol=1e-5, random_state=42)
Extraction de caractéristiques et représentation des données
Sélection et réduction de dimensionnalité
Les cubes hyperspectraux souffrent souvent du fléau de la dimensionnalité. Toutes les bandes spectrales ne sont pas pertinentes et certaines sont fortement corrélées. Les techniques de sélection de caractéristiques (filtrage, méthodes enveloppantes ou intégrées) et de réduction de dimensionnalité, comme l'Analyse en Composantes Principales (ACP), sont essentielles pour isoler l'information discriminante et réduire le bruit.
Vectorisation et normalisation
Avant d'appliquer le K-Means, les pixels doivent être transformés en vecteurs de caractéristiques. Il est impératif de normaliser ces vecteurs (par exemple, via une mise à l'échelle Min-Max ou une standardisation Z-score) afin que les bandes spectrales avec des valeurs absolues élevées ne dominent pas le calcul des distances.
Pipeline de classification et post-traitement
Prétraitement et exécution du K-Means
Le flux de travail typique commence par le nettoyage des données (suppression des bandes absorbées par l'atmosphère, filtrage spatial), suivi de la mise en forme des données pour l'algorithme.
from sklearn.cluster import KMeans
import numpy as np
# Supposons que 'hyperspectral_cube' soit notre donnée prétraitée de forme (pixels, bandes)
num_classes = 6
segmentation_model = KMeans(n_clusters=num_classes, init='k-means++', random_state=99)
segmentation_model.fit(hyperspectral_cube)
# Récupération des étiquettes et des centres
pixel_labels = segmentation_model.labels_
cluster_centers = segmentation_model.cluster_centers_
print(f"Coordonnées des centroïdes finaux :\n{cluster_centers}")
Post-traitement et visualisation
Les résultats bruts du K-Means peuvent contenir du bruit spatial (pixels isolés mal classés). L'application de filtres morphologiques ou de filtres médians sur la carte d'étiquettes permet de lisser les frontières des régions. Pour l'interprétation visuelle, une carte de couleurs pseudo-aléatoire est assignée à chaque cluster.
import matplotlib.pyplot as plt
# Création d'une image RGB vide pour la visualisation
height, width = 256, 256
segmented_image = np.zeros((height, width, 3), dtype=np.uint8)
# Palette de couleurs personnalisée pour les clusters
palette = [
[220, 50, 50], [50, 220, 50], [50, 50, 220],
[220, 220, 50], [220, 50, 220], [50, 220, 220]
]
# Application des couleurs selon les étiquettes
for cluster_idx in range(num_classes):
mask = (pixel_labels.reshape(height, width) == cluster_idx)
segmented_image[mask] = palette[cluster_idx]
# Affichage comparatif
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
axes[0].imshow(original_rgb_image)
axes[0].set_title("Image RGB Originale")
axes[0].axis('off')
axes[1].imshow(segmented_image)
axes[1].set_title("Segmentation K-Means")
axes[1].axis('off')
plt.tight_layout()
plt.show()
Résumé des techniques de préparation
| Étape | Technique | Objectif |
|---|---|---|
| Réduction | ACP / MNF | Diminuer la complexité computationnelle et le bruit |
| Extraction | Indices spectraux (NDVI, etc.) | Mettre en évidence des caractéristiques physiques spécifiques |
| Mise à l'échelle | Standardisation Z-score | Uniformiser l'influence de chaque bande spectrale |
| Lissage | Filtrage morphologique | Éliminer les artefacts spatiaux post-classification |
Évaluation, optimisation et implémentation MATLAB
Métriques de performance
Bien que le K-Means soit non supervisé, l'évaluation de la qualité de la segmentation peut être réalisée si des vérités terrain sont disponibles. Les métriques standards incluent la précision globale, le rappel, et le score F1.
% Calcul des métriques à partir des vecteurs de vérité terrain (ground_truth) et prédits (predictions)
% Supposons que la classe d'intérêt (positive) soit étiquetée comme 1
true_positives = sum(predictions == 1 & ground_truth == 1);
false_positives = sum(predictions == 1 & ground_truth ~= 1);
false_negatives = sum(predictions ~= 1 & ground_truth == 1);
precision_val = true_positives / (true_positives + false_positives + eps);
recall_val = true_positives / (true_positives + false_negatives + eps);
f1_metric = 2 * (precision_val * recall_val) / (precision_val + recall_val + eps);
fprintf('Précision: %.4f, Rappel: %.4f, F1: %.4f\n', precision_val, recall_val, f1_metric);
La matrice de confusion offre une vue détaillée des erreurs de classification entre toutes les paires de classes.
% Génération et affichage de la matrice de confusion
confusion_chart = confusionmat(ground_truth, predictions);
disp('Matrice de Confusion:');
disp(confusion_chart);
Optimisation et scripts dédiés
L'optimisation du K-Means pour les données hyperspectrales passe par la recherche du nombre optimal de clusters (via la méthode du coude ou l'indice de silhouette) et l'hybridation avec des classifieurs supervisés. Dans l'écosystème MATLAB, des scripts personnalisés permettent d'automatiser le chargement des cubes de données, l'application de l'ACP, l'exécution de la fonction kmeans native, et la génération de cartes thématiques. L'intégration de boîtes à outils spécialisées enrichit considérablement les capacités d'analyse spectrale et spatiale pour résoudre des problèmes complexes de télédétection.