Skip to main content

Bases

Cours

Traitements classiques couleur

(A,B,C)=M.(R,G,B)(A,B,C)(RGB)=M1.(A,B,C)\\{(A,B,C)= M.(R,G,B)\\} \rightarrow (A', B', C') \rightarrow \\{(R'G'B') = M^{-1}.(A',B',C')\\}

M=(abcdefghi)M = \begin{pmatrix} a & b & c \\\\ d & e & f \\\\ g & h & i \end{pmatrix}

Quelques espaces couleur et application

  • 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

  1. Contraste : Caractérisation des différences (variations) de niveau de gris
    • maximale : C=maxIminImaxI+minIC = \dfrac{max_I - min_I}{max_I + min_I}
    • écart type : C=1MNi,jMN(I(i,j)B)2C = \sqrt{\dfrac{1}{MN} \sum \limits_{i,j}^{MN} (I(i,j) - B)^2} avec B=1MNi,jMNI(i,j)B= \dfrac{1}{MN} \sum \limits_{i,j}^{MN} I(i,j)
  2. Histogramme : Description de la répartition desn iveaux de gris, distribution statistique, bornes de la répartition
    • H(k) = \\#\\{(i,j) \in M \times N : I(i,j) = k\\}
    • 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
  3. Contraste \leftrightarrow histogramme : Les valeurs proches de 0 ou 255 correspondent à une image sombre ou claire. Les valeurs tassées ou réparties cela correspond à un contracte faible ou élevé
  4. Éclaircir une image sombre : correction logarithmique I=log(1+I)I' = \log(1+I)
  5. Assombrir une image claire : correction exponentielle I=exp(I)I' = \exp(I)
  6. Translation d'histogramme : conserver le contraste mais modifier la luminosité
  7. Normalisation : étirement d'histogramme
    • Modifier l'intervalle de variation [min,max][min,max][min, max] \rightarrow [min', max']
    • Général I(i,j)=maxminmaxminI(i,j)+min.maxmax.minmaxminI'(i,j) = \dfrac{max' - min'}{max - min} I(i,j) + \dfrac{min'.max - max'.min}{max-min}
    • Particulier [min,max][0,255][min, max] \rightarrow [0,255], I(i,j)=255maxmin(I(i,j)min)I'(i,j) = \dfrac{255}{max - min}(I(i,j) - min)

Équilibrage d'histogramme

Définitions : pour une intensité kk d'une image II de taille MNMN à KK intensités

  • Histogramme normalisé : Hn(k)=H(k)MNH_n(k) = \dfrac{H(k)}{MN} c'est une loi de probabilité. La probabilité qu'un pixel ait le niveau de gris kk vaut donc k=0K1Hn(k)=1\sum \limits_{k=0}^{K-1} H_n(k)=1, avec Hn(k)0H_n(k) \geq 0
  • Histogramme cumulé : Hc(k)=l=0kH(l)H_c(k) = \sum \limits_{l=0}^k H(l)
  • Histogramme cumulé normalisé : Hcn(k)=l=0kHn(l)H_{cn}(k) = \sum \limits_{l=0}^k H_n(l) c'est à dire la réparticion de la loi de probabilité
  • k=I(i,j)k = I(i,j), l'intensité initiale, k=I(i,j)k' = I'(i,j) la nouvelle
  • ImaxI_{max} une intensité maximale (par exemple 255) k=ImaxHcn(k)=Imaxl=0kHn(l)=Imaxl=0kH(l)MNk' = I_{max} H_{cn}(k) = I_{max} \sum \limits_{l=0}^k H_n(l) = I_{max} \sum \limits_{l=0}^k \dfrac{H(l)}{MN}

Seuillage (Thresholding)

  • Ramener l'image à quelques niveaux de gris dans une bande
  • Mettre en avant des régions / détails mais n'améliore pas l'image

Quelques variantes sur le seuillage global

I[imin,imax](p)={i1;si;iminI(p)imaxi2;sinon;ou;{i1,;si;iminI(p)imaxI(p),;sinon I_{[i_min, i_max]}(p) = \begin{cases} i_1 \\; \text{si} \\; i_min \leq I(p) \leq i_max \\\\ i_2 \\; \text{sinon} \end{cases} \\; \text{ou} \\; \begin{cases} i_1, \\; \text{si} \\; i_{min} \leq I(p) \leq i_{max} \\\\ I(p), \\; \text{sinon} \end{cases}

Cas particulier : binarisation

I[imin,imax](p)={1;si;iminI(p)imax0;sinonI_{[i_{min}, i_{max}]}(p) = \begin{cases} 1 \\; \text{si} \\; i_min \leq I(p) \leq i_max \\\\ 0 \\; \text{sinon} \end{cases}

Seuillage adaptatif local

Le paramètre de seuillage dépend d'un voisinage VV autour du pixel pp (transformation local) I(p)={i1,;si;I(p)F(V(p))i2 I(p) = \begin{cases} i_1, \\; \text{si} \\; I(p) \leq F(V(p)) \\\\ i_2 \end{cases}

  • Le seuillage est principalement utilisé en niveaux de gris
  • Difficultés de trouver les valeurs de seuillage, très dépendant de l'application, de nombreuses méthodes existent

OTsu

Minimiser la variance intra-classe vw(t)v_w(t) pour II de taille MNMN à KK intensités un seuil tt et C1C_1 et C2vw(t)=p1(t)v1(t)+p2(t)v2(t)C_2 \rightarrow v_w(t) = p_1(t) v_1(t) + p_2(t) v_2(t) : variance de la classe CiC_i. p1(t)=1MNi=0tH(i)=i=0tHn(i);et;p2(t)=1MNi=t+1K1H(i)=i=t+1K1Hn(i)p_1(t) = \dfrac{1}{MN} \sum \limits_{*i = 0}^t H(i) = \sum \limits_{i=0}^t H_n(i) \\; \text{et} \\; p_2(t) = \dfrac{1}{MN} \sum \limits_{i=t+1}^{K-1} H(i) = \sum \limits_{i=t+1}^{K-1} H_n(i) avec p1,p2p_1,p_2 les probabilités d'appartenance aux classes C1C_1 et C2C_2 pour le niveau ii. Le seuil optimal T=argminvw(t),t[0,K1]T = argmin\\{v_w(t), \forall t \in [0, K-1]\\}.

Maximisation de la variance inter-classe vb(t)v_b(t) : minimiser vw(t)v_w(t) revient à maximuer vb(t)=p1(t)p2(t)(μ1(t)μ2(t))2v_b(t) = p_1(t) p_2(t)(\mu_1(t) - \mu_2(t))^2 μ1(t)=1i=0tH(i)i=0ti.H(i);et;μ2(t)=1i=t+1K1H(i)i=t+1K1i.H(i)\mu_1(t) = \dfrac{1}{\sum \limits_{i=0}^t H(i)} \sum \limits_{i=0}^t i.H(i) \\; \text{et} \\; \mu_2(t) = \dfrac{1}{\sum \limits_{i=t+1}^{K-1} H(i)} \sum \limits_{i=t+1}^{K-1} i.H(i)μ1\mu_1, μ2\mu_2 sont les moyenne des classes C1C_1 et C2C_2. Le seuil optimal T=argmaxvb(t),t[0,K1]T = argmax\\{v_b(t), \forall t \in [0, K-1]\\}.

Maximiser vbv_b est plus efficace algorithmiquement que de minimiser vmv_m. En effet p1+p2=1p_1 + p_2 = 1 et p1μ1+p2μ2=μIp_1 \mu_1 + p_2 \mu_2 = \mu_I, avec μI\mu_I la moyenne globale de l'image II.

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 couelur en niveaux de gris et l'affiche
  • convertit l'image RGB et 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 niveau de gris et le canal Y ?
  • y a-t-il une différence entre l'image initiale et l'image reconvertit 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-modiciation <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 hh, ss et vv (si applicable, attention aux problèmes de normalisation)
  • modifie les canaux HSV en fonction des valeurs hh, ss et vv 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 niveau de gris
  • la construction des histogrammes se fait "à la main"
  • sauve l'image dans un fichier eq.png
  • utiliser la fonction opencv equalizeHist. Sauver 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 adaptative avec la moyenne où le voisinage est déterminé par le paramètre <radiuis>, (V2radius+1×2radius+1V \in 2 radius + 1 \times 2 radius + 1) et paramétré par la constante <const>
  • sauve l'image dans un fichier th.png
  • utiliser la fonction AdaptiveThreshold et réaliser le même seuillage. Sauver dans une image th-ocv-mean.png
  • calculer une image de différence diff.png
  • test l'option ADAPTIVE_THRESH_GAUSSIAN_C et sauver l'image dans th-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ètre THRESH_BINARY + THRESH_OTSUafin de réaliser la même opération. Afficher l'image binaire et al sauver dans un fichier otsu-th-ocv.png
  • affiche une image de différence entre les deux méthodes
  • affiche sur la sortie standard les valeurs de seuil trouvés par votre implémentation et celle d'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 : p1μ1+p2μ2=μGp_1 \mu_1 + p_2 \mu_2 = \mu_G et p1+p2=1p_1 + p_2 = 1, 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.