Publié le 20 octobre 2026 Mis à jour le 20 octobre 2026
Améliorer une image avec OpenCV ne consiste pas à pousser trois curseurs jusqu’à ce que les pixels demandent grâce. Il faut d’abord identifier le défaut : contraste trop faible, bruit, dominante de couleur ou manque de netteté. OpenCV fournit des outils distincts pour chaque problème.
Ce guide Python a été entièrement réécrit et vérifié le 20 octobre 2026 à partir de la documentation OpenCV 4.x. Les exemples partent d’une image nommée image.jpg et enregistrent chaque résultat dans un nouveau fichier afin de ne jamais écraser l’original.
Préparer l’environnement Python
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install opencv-python numpy
Chargez l’image et vérifiez que la lecture a réussi :
import cv2 as cv
image = cv.imread("image.jpg")
if image is None:
raise FileNotFoundError("OpenCV ne peut pas lire image.jpg")
print(image.shape)
OpenCV lit par défaut les images couleur dans l’ordre BGR, pas RGB. Cette différence compte dès que vous mélangez OpenCV avec Pillow ou Matplotlib.
1. Ajuster luminosité et contraste
cv.convertScaleAbs() applique la formule sortie = alpha × image + beta. alpha règle le contraste et beta décale la luminosité.
amelioree = cv.convertScaleAbs(image, alpha=1.15, beta=10)
cv.imwrite("image-contraste.jpg", amelioree)
Commencez avec des valeurs modérées. Un contraste trop fort écrase les ombres et brûle les hautes lumières.
2. Égaliser l’histogramme en niveaux de gris
cv.equalizeHist() attend une image 8 bits à un seul canal :
gris = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
egalisee = cv.equalizeHist(gris)
cv.imwrite("image-egalisee.jpg", egalisee)
L’égalisation globale peut améliorer une image terne, mais aussi surexposer certaines zones. La documentation OpenCV montre cette limite : le fond gagne parfois du contraste tandis que des détails locaux disparaissent.
3. Renforcer le contraste local avec CLAHE
CLAHE signifie « Contrast Limited Adaptive Histogram Equalization ». L’image est divisée en tuiles, puis le contraste est égalisé localement avec une limite qui freine l’amplification du bruit.
gris = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
resultat = clahe.apply(gris)
cv.imwrite("image-clahe.jpg", resultat)
Les valeurs 2.0 et (8, 8) sont un point de départ, pas une recette universelle.
4. Appliquer CLAHE sans déformer les couleurs
Égaliser séparément les canaux bleu, vert et rouge produit souvent des couleurs artificielles. Modifiez plutôt la luminance dans l’espace LAB :
lab = cv.cvtColor(image, cv.COLOR_BGR2LAB)
l, a, b = cv.split(lab)
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
l_amelioree = clahe.apply(l)
lab_ameliore = cv.merge((l_amelioree, a, b))
resultat = cv.cvtColor(lab_ameliore, cv.COLOR_LAB2BGR)
cv.imwrite("image-clahe-couleur.jpg", resultat)
Normaliser une image avec cv.normalize
cv.normalize() permet de remettre les valeurs d’une matrice dans une plage déterminée. Pour une image en niveaux de gris, la normalisation min-max étire les intensités entre 0 et 255 :
gris = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
normalisee = cv.normalize(gris, None, 0, 255, cv.NORM_MINMAX)
normalisee = normalisee.astype("uint8")
cv.imwrite("image-normalisee.jpg", normalisee)
Cette opération change l’échelle des valeurs, mais n’analyse pas localement le contraste comme CLAHE. Elle est utile lorsque les données occupent une plage trop étroite ou avant certaines étapes de traitement. Vérifiez toujours le type de sortie : une fonction suivante peut attendre une matrice 8 bits.
5. Réduire le bruit avant d’accentuer
Une accentuation appliquée sur une image bruitée accentue aussi le bruit. Pour un lissage léger :
lisse = cv.GaussianBlur(image, (5, 5), 0)
cv.imwrite("image-lissee.jpg", lisse)
Les dimensions du noyau doivent être positives et impaires. Un noyau plus grand lisse davantage, mais efface aussi les détails.
Pour préserver davantage les contours, le filtre bilatéral peut être utile, au prix d’un calcul plus lourd :
lisse = cv.bilateralFilter(image, d=9, sigmaColor=75, sigmaSpace=75)
cv.imwrite("image-bilateral.jpg", lisse)
6. Accentuer avec un masque flou
floue = cv.GaussianBlur(image, (0, 0), 2.0)
accentuee = cv.addWeighted(image, 1.5, floue, -0.5, 0)
cv.imwrite("image-accentuee.jpg", accentuee)
Observez le résultat à 100 %. Des halos autour des contours indiquent généralement une accentuation excessive.
7. Construire une chaîne complète
Voici une chaîne prudente : réduction légère du bruit, amélioration locale de la luminance, puis accentuation modérée.
import cv2 as cv
image = cv.imread("image.jpg")
if image is None:
raise FileNotFoundError("Image introuvable ou illisible")
lisse = cv.GaussianBlur(image, (3, 3), 0)
lab = cv.cvtColor(lisse, cv.COLOR_BGR2LAB)
l, a, b = cv.split(lab)
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
l = clahe.apply(l)
contraste = cv.cvtColor(cv.merge((l, a, b)), cv.COLOR_LAB2BGR)
floue = cv.GaussianBlur(contraste, (0, 0), 1.2)
finale = cv.addWeighted(contraste, 1.35, floue, -0.35, 0)
if not cv.imwrite("image-finale.jpg", finale):
raise RuntimeError("Échec de l’enregistrement")
En production, mesurez le résultat : histogramme, bruit, couleurs, détails et taille du fichier. Une image plus spectaculaire n’est pas forcément plus fidèle.
Quelle technique choisir ?
- Image globalement terne :
convertScaleAbs. - Image en niveaux de gris peu contrastée :
equalizeHist. - Contraste local insuffisant : CLAHE.
- Bruit visible : filtre gaussien, médian ou bilatéral selon le bruit.
- Détails mous : masque flou après réduction du bruit.
- Image couleur : modifier la luminance plutôt que chaque canal BGR.
Les erreurs à éviter
- Écraser le fichier original.
- Oublier de vérifier le retour de
cv.imread()oucv.imwrite(). - Confondre BGR et RGB.
- Appliquer CLAHE à chaque canal couleur sans contrôler les dérives.
- Accentuer avant de réduire le bruit.
- Copier des paramètres « universels » : il n’en existe pas.
Cette vidéo montre le principe de l’histogramme et de son égalisation avec OpenCV. Elle complète les exemples ; la documentation officielle reste la référence.
Retrouvez d’autres tutoriels dans la rubrique Technologie.
Sources consultées
- Égalisation d’histogramme et CLAHE — OpenCV, consultée le 20 octobre 2026.
- Lissage d’images — OpenCV, consultée le 20 octobre 2026.
- Luminosité et contraste — OpenCV, consultée le 20 octobre 2026.
- Conversions colorimétriques — OpenCV, consultée le 20 octobre 2026.
