L'efficacité d'un réseau de neurones dépend en grande partie de la qualité du prétraitement des données d'entrée. Dans le cadre de la vision par ordinateur, et plus particulièrement pour des architectures comme Mask R-CNN, l'ajustement du contraste s'avère être un levier de performance majeur. En accetnuant les contours et en différenciant plus nettement les objets de leur arrière-plan, ces techniques facilitent l'extraction de caractéristiques par les couches convolutionnelles.
- Étalement de contraste par centiles (Normalisation)
L'étalement de contraste vise à étendre la plage dynamique des intensités de pixels. Pour une image couleur, cette opération est appliquée sur les trois canaux : Rouge (R), Vert (V) et Bleu (B), où chaque pixel possède une valeur comprise entre 0 (noir) et 255 (blanc).
Approche mathématique
Plutôt que d'utiliser les valeurs minimales et maximales absolues d'une image, ce qui rendrait le système vulnérable aux valeurs aberrantes (bruit), on utilise généralement les 2ème et 98ème centiles. La transformation d'un pixel x s'effectue selon la formule suivante :
x_out = ((x - p_low) / (p_high - p_low)) * 255
Où p_low est le 2ème centile et p_high le 98ème. Après transformation, les valeurs inférieures à 0 sont ramenées à 0 et celles supérieures à 255 sont plafonnées à 255. Bien que cela entraîne une légère perte d'information aux extrémités, le gain en contraste global est significatif.
Pour quantifier cet effet, on observe l'écart-type (σ) de la distribution des intensités. Une augmentation de l'écart-type traduit une meilleure dispersion des couleurs et donc une image plus riche en détails exploitables par un algorithme de détection.
- Égalisation d'Histogramme (HE)
L'égalisation d'histogramme (Histogram Equalization) est une méthode qui cherche à redistribuer les itnensités des pixels de manière uniforme sur toute la plage disponible [0, 255]. Contrairement à l'étalement linéaire, elle modifie la répartition statistique des données.
Modélisation probabiliste
On considère l'intensité des pixels comme une variable aléatoire. En utilisant la fonction de répartition (CDF - Cumulative Distribution Function), on peut transformer la distribution originale en une distribution uniforme. Si p(k) est la probabilité d'occurrence d'une intensité k, la transformation Y = f(X) permet d'obtenir un histogramme plat, maximisant ainsi l'entropie de l'image.
- Égalisation d'Histogramme Adaptive Limitée par Contraste (CLAHE)
L'égalisation globale (HE) présente deux défauts majeurs :
- Elle ne tient pas compte des variations locales (zones trop claires ou trop sombres).
- Elle a tendance à amplifier le bruit de fond dans les zones homogènes.
L'algorithme CLAHE résout ces problèmes en divisant l'image en blocs (tuiles). L'égalisation est calculée localement, et une limite de contraste est appliquée pour éviter l'amplification excessive du bruit. Enfin, une interpolation bilinéaire est utilisée pour éliminer les transitions visibles entre les blocs.
Mise en œuvre pratique avec OpenCV
Voici comment implémenter ces techniques pour améliorer le rendu visuel et la détection d'objets.
Exemple en Python
import cv2
import numpy as np
def process_image_clahe(input_path):
# Chargement de l'image en couleur
img = cv2.imread(input_path)
# Séparation des canaux
b, g, r = cv2.split(img)
# Configuration de CLAHE (limite de clip et taille de grille)
clahe_engine = cv2.createCLAHE(clipLimit=2.5, tileGridSize=(8, 8))
# Traitement individuel des canaux
ch_b = clahe_engine.apply(b)
ch_g = clahe_engine.apply(g)
ch_r = clahe_engine.apply(r)
# Reconstitution de l'image
result = cv2.merge((ch_b, ch_g, ch_r))
return result
# Exemple pour une image en niveaux de gris
gray_img = cv2.imread('source.jpg', 0)
standard_he = cv2.equalizeHist(gray_img)
Exemple en C++
#include <opencv2/opencv.hpp>
int main() {
cv::Mat source = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
if(source.empty()) return -1;
cv::Mat enhanced;
// Initialisation du pointeur CLAHE
cv::Ptr<cv::CLAHE> p_clahe = cv::createCLAHE();
p_clahe->setClipLimit(3.0);
p_clahe->setTilesGridSize(cv::Size(10, 10));
// Application de l'algorithme
p_clahe->apply(source, enhanced);
cv::imshow("Original", source);
cv::imshow("Resultat CLAHE", enhanced);
cv::waitKey(0);
return 0;
}
Analyse des résultats
L'utilisation de CLAHE permet d'obtenir une image où les détails fins (comme les structures urbaines ou les petits objets dans des environnements complexes) sont bien plus visibles sans pour autant "brûler" les zones déjà claires. Dans un pipeline de détection d'objets, ce prétraitement réduit souvent le taux de faux négatifs en rendant les caractéristiques discriminantes plus accessibles au réseau de neurones.