Couleur, histogramme et seuillage
Cours
Traitements classiques couleur
où
Quelques espaces couleur et applications
- RGB : acquisition/restitution écran
- CMY : impression
- XYZ : modélisation des couleurs
- YUV/YCbCr : transmission et codage
- HSV/HSL : espace intuitif, vision humaine
- Lab/Luv : espace uniforme, distance entre les couleurs
Contraste et histogramme
- Contraste : caractérisation des différences (variations) de niveau de gris
- maximale :
- écart type : avec
- Histogramme : description de la répartition des niveaux de gris, distribution statistique, bornes de la répartition
- Il ne code pas l'information spatiale, 2 images sémantiquement différentes peuvent avoir le même histogramme
- Il n'est pas possible de reconstruire une image à partir de son histogramme
- Contraste histogramme : des valeurs concentrées près de 0 ou de 255 correspondent à une image sombre ou claire ; des valeurs tassées ou étalées correspondent à un contraste faible ou élevé.
- Éclaircir une image sombre : correction logarithmique (suivie d'une renormalisation)
- Assombrir une image claire : correction exponentielle (suivie d'une renormalisation)
- Translation d'histogramme : conserver le contraste mais modifier la luminosité
- Normalisation : étirement d'histogramme
- Modifier l'intervalle de variation
- Général
- Particulier ,
Équilibrage d'histogramme
Définitions : pour une intensité d'une image de taille à intensités :
- Histogramme normalisé : c'est une loi de probabilité : la probabilité qu'un pixel ait le niveau de gris vaut , avec et
- Histogramme cumulé :
- Histogramme cumulé normalisé : c'est-à-dire la fonction de répartition de la loi de probabilité
- , l'intensité initiale, la nouvelle
- une intensité maximale (par exemple 255). La transformation d'égalisation est alors :
Seuillage (Thresholding)
- Ramener l'image à quelques niveaux de gris dans une bande
- Mettre en avant des régions ou des détails, sans améliorer l'image
Quelques variantes sur le seuillage global
Cas particulier : binarisation
Seuillage adaptatif local
Le paramètre de seuillage dépend d'un voisinage autour du pixel (transformation locale) :
- Le seuillage est principalement utilisé en niveaux de gris
- Difficulté de trouver les valeurs de seuillage, très dépendant de l'application, de nombreuses méthodes existent
Otsu
Minimiser la variance intra-classe : pour de taille à intensités, un seuil sépare deux classes et , et , où est la variance de la classe : avec les probabilités d'appartenance aux classes et . Le seuil optimal est .
Maximisation de la variance inter-classe : minimiser revient à maximiser où , sont les moyennes des classes et . Le seuil optimal est .
Maximiser est plus efficace algorithmiquement que minimiser : la variance totale est constante, et les quantités et se mettent à jour incrémentalement lorsque augmente, puisque et , avec la moyenne globale de l'image .
Mise en pratique
color-convert <ims>
Écrire le programme color-convert.cpp qui :
- affiche les canaux R,G et B dans 3 images monochromes
- convertit l'image couleur en niveaux de gris et l'affiche
- convertit l'image RGB en YCbCr et la reconvertit en RGB, afficher l'image résultat
- affiche les canaux Y, Cb et Cr
- y a-t-il une différence entre l'image en niveaux de gris et le canal Y ?
- y a-t-il une différence entre l'image initiale et l'image reconvertie en RGB ?
- Note 1 : pour convertir les images dans d'autres espaces couleurs utiliser la fonction
cvtColor - Note 2 : pour pouvoir voir les différences, il est conseillé de faire attention aux types de données
hsv-modification <h> <s> <v> <ims> <imd>
Écrire le programme hsv-modification.cpp
- ce programme permet de charger une image donnée en paramètre
<ims> - convertit l'image dans l'espace HSV
- affiche les canaux , et (si applicable, attention aux problèmes de normalisation)
- modifie les canaux HSV en fonction des valeurs , et données en paramètres en les ajoutant aux valeurs initiales
- sauvegarde la nouvelle image avec le nom donné en paramètre
<imd> - visualiser l'image produite via
pvisu
eq-histogram <ims>
Écrire le programme eq-histogram.cpp
- ce programme permet de charger une image donnée en paramètre
<ims> - réalise la méthode d'équilibrage d'histogramme de l'image source
- la méthode considère que l'image est en niveaux de gris
- la construction des histogrammes se fait "à la main"
- sauve l'image dans un fichier
eq.png - utiliser la fonction OpenCV
equalizeHist; sauver le résultat dans une imageeq-ocv.png - calculer une image de différence :
diff.png - visualiser les images produites via
pvisu
adaptative-th <ims> <radius> <const>
Écrire le programme adaptative-th.cpp
- ce programme permet de charger une image donnée en paramètre
<ims> - réalise un seuillage adaptatif avec la moyenne, où le voisinage est déterminé par le paramètre
<radius>(voisinage de taille ) et paramétré par la constante<const> - sauve l'image dans un fichier
th.png - utiliser la fonction
adaptiveThresholdet réaliser le même seuillage. Sauver dans une imageth-ocv-mean.png - calculer une image de différence
diff.png - tester l'option
ADAPTIVE_THRESH_GAUSSIAN_Cet sauver l'image dansth-ocv-gauss.png - visualiser l'image produite en la visualisant via
pvisu
otsu <ims>
Écrire le programme otsu.cpp
- ce programme permet de charger une image donnée en paramètre
<ims>. L'image est traitée comme une image en niveaux de gris - réalise une binarisation en utilisant le calcul d'un seuil automatique par la méthode d'Otsu
- affiche l'image binaire et la sauve dans un fichier nommé
otsu-th.png - utilise la fonction
thresholdavec le paramètreTHRESH_BINARY + THRESH_OTSUafin de réaliser la même opération. Afficher l'image binaire et la sauver dans un fichierotsu-th-ocv.png - affiche une image de différence entre les deux méthodes
- affiche sur la sortie standard les valeurs de seuil trouvées par votre implémentation et par OpenCV. Comparer les valeurs
- visualiser les images résultats via pvisu
- Remarque importante : en analysant l'algorithme, les équations de la méthode d'Otsu et les propriétés suivantes : et , une implémentation plus efficace peut être réalisée par rapport à une version naïve de l'algorithme. Il est fortement conseillé de produire une telle implémentation.