--- title: I4 Traitement d'images tags: ESIEE --- I4 Traitement d'images === :::spoiler ``` function res = appli(im, l) res = im; for i=1: size(im,1), for j=1: size(im, 2), res(i,j)=l(im(i,j)+1)*255 end end end ``` ```function T = lutinverse() T=zeros(256,1); for i=0:255 T= ``` ``` a=imred('cameraman.gif') imshow(a) [b,c] = histeq(a,256) d=fcumul(a); e=appli(a,d); figure; imshow(e); figure; imshow(b); function h = hcumul(im) v=zeros(256,1) for i=1:size(im,1), for j=1:size(im,2), v(im(i,j)+1) = v(im(i,j)+1)+1; end end h=v; for i=2:256, h(i)=h(i)+h(i-1) end for i=1:256, h(i)=h(i)/h(256); end end ``` ::: # Approfondissement Jean-Baptiste.Masson@u-picardie.fr - Diplomé à Ensimag - Doctorat à l'UTC - Enseignant à l'UPJV, IUT Amiens - Membre du laboratoire LTI - Equipe Systemes Intelligents - Analyse de données - Statistiques avancées ## Méthode d'Otsu *cf poly Traitement d'images* Cas particulier de l'analyse de variance (ANOVA) ![](https://i.imgur.com/HZmniqv.png) image en **niveau de gris** chaque pixel $(x,y) \rightarrow G(x,y)$ entre 0 et 255. Création d'un "histogramme": ![](https://i.imgur.com/1aHl5ZS.png) But: Trouver $k$ qui sépare "statistiquement" les "gris foncé" des "gris clairs". **Critère d'Otsu** Calculer $$ s^{2}(k) = \frac{[mu_{t}w(k) - mu(k)]^{2}}{w(k)[1-w(k)]} $$ pour $k$ de 1 à 255 et retenir $k_{opti}$ maximisant $S^{2}(k)$ (critère de séparation) Il y a une "récurrence" pour $k \rightarrow k+1$ $w(k) = \sum_{i=0}^{k}p_{i}$ où $p_{i}$ est le % de pixel tel que $G(x,y) = i$ $w(k) =$ % de pixel tel que $G(x,y) \leq k$ $mu_{k} = \sum_{i=0}^{k}i.p_{i}$ Multiplie chaque valeur de gris à son pourcentage. Cela ressemble au calcul d'une moyenne pondérée. Facile à mettre à jour. **Remarque :** $\frac{mu(k)}{w(k)} =$ moyenne des $G(x,y)$ tel que $G(x,y) \leq k$ $mu_{T} = mu(255) \Rightarrow$ Calculé une seule fois ### Définition C'est une analyse de variance avec 2 classes ( $\leq k$ vs $>k$)et données en 1 dimension (ici l'intervale des niveaux de gris). ANOVA peut gérer plus de 2 classes. En revanche la gestion de plusieurs dimensions complexifie grandements son exploitation. Pour les couleurs RGB, se sont des données en 3 dimensions on devra utiliser une autre méthode. :::warning Les notations suivantes sont différentes. Certaines lettres peuvent être pareilles mais ne représentent plus la même chose ::: #### Notation ANOVA : notation classique ($\neq$ Otsu) ![](https://i.imgur.com/7LBVHqr.png) **ex-aquo autorisé** Potentiellement, chaque $x_{i}$ est dans une classe (différente) $C_{j}$. Par exemple en fonction de la source de données. - $i \in [1,n]$ - $j \in [1,J]$ #### Classe Chaque classe $C_{j}$ est un sous-ensemble de $x_{i}$. Les $C_{j}$ partionnent les données. Chaque $x_{i}$ est dans une classe $C_{j}$ unique. Pour chaque classe, on peut calculer 3 choses : - effectif : $n_{j} =$ nombre de $i$ tq $x_{i} \in C_{j}$ - moyenne : $m_{j} = \frac{1}{n_{j}} \sum_{i \in C_{j}} x_{i}$ - variance : $V_{j} = \frac{1}{n_{j}} \sum_{i \in C_{j}} (x_{i} - m_{j})^{2}$ #### Population On a aussi les mêmes indicateurs sur la population entière : - effectif : $n$ - moyenne : $m = \frac{1}{n} \sum_{i = 0}^{n} x_{i}$ - variance : $V = \frac{1}{n} \sum_{i=0}^{n} (x_{i} - m)^{2}$ #### Relation entre classes et population Relation entre ces indicateurs - effectif : $n = \sum_{j=1}^{J} n_{j}$ - moyenne : $m = \frac{1}{n} \sum_{j=1}^{J}n_{j}.m_{j}$ **Formule de décomposition de la variance** variance : $V = \frac{1}{n}(SSW + SSB)$ - **SSW** : *Sum of Square Within* (classes) ~= "intra classes" $SSW = \sum_{j\in C_{j}}\sum_{x_{i}\in C_{j}}(x_{i} - m_{j})^{2}$ où $\sum_{x_{i}\in C_{j}}(x_{i} - m_{j})^{2} = n_{i}.V_{j}$ On utilise ainsi la moyenne de classe au lieu de la moyenne générale. - **SSB** : *Sum of Square Between* (classes) ~= "inter classes" $SSB = \sum_{j\in C_{j}}n_{j}(m_{j} - m)^{2}$ **Exemple visuel où $SSW >> SSB$** ![](https://i.imgur.com/ptNrggQ.png) **Exemple visuel où $SSW << SSB$** ![](https://i.imgur.com/m4NAOMZ.png) Si SSB est "grand", les classes sont bien "séparées". **Otsu** ![](https://i.imgur.com/ULIwyxe.png) Cette valeur de $k$ sépare *mal* esl classes. SSB est "petit". alors que: ![](https://i.imgur.com/9qUj9BU.png) Cette valeur de $k$ sépare *mieux* les classes. Le $S^{2}(k)$ de Otsu est en fait $\frac{SSB}{n}$. $k$ change les classes SSB et SSW mais **pas V** (ni $n$ ni $m$). Dernier avantage : Pas besoin de calculer les $v_{j}$ ni $V \rightarrow$ seulement les moyennes SSB sont calculable et "SSW le compense" (SSB + SSW = constante) **Otsu** : On cherche $k$ qui maximise $\frac{SSB}{n}$. #### Démonstration de la formule de décomposition de la variance (générale) $$ V = \frac{1}{N} \sum_{i=1}{n}\Big((x_{i}-m_{classe})(m_{classe}-m)\Big)^{2} $$ Vérification de $S^{2}(k) = \frac{SSB}{n}$ avec $p_{i} =$ % de pixel $= i$ - classe 1 : - effectif $n_{1} = w(k) * n$ - moyenne $m_{1} = \frac{mu(k)}{w(k)} - classe 2 : - effectif $n_{2} = n - n_{1}$ - moyenne $m_{2} = \frac{n.m - n_{1}.m_{1}}{n_{2}}$ Car $m = \frac{1}{n}(n_{1}.m_{1}+n_{2}.m_{2})$ $\frac{SSB}{n} = \frac{n_{1}}{n}(m_{1}-m)^{2}+\frac{n_{2}}{n}(m_{2}-m)^{2}$ où $\frac{n_{1}}{n} = w(k)$ et $\frac{n_{2}}{n} = 1 - w(k)$ On montre que : - $m_{1}-m = \frac{mu(k)-mu_{T}.w(k)}{w(k)}$ - $m_{2}-m = \frac{mu_{T}.w(k) - mu(k)}{1-w(k)}$ Avec $C_{1},C_{2}...C_{J}$ imposées "**Y a-t-il une différence significative entre au moins certaines classes ?**" **Otsu :** Reprend ce critère pour comparer des classifications ($C_{1},C_{2}$) nombreuses. Pour les niveaux de gris, il y a environ 254 possibilités pour $k$. C'est la différence entre: - la méthode **supervisée**: On connait les classes. Dont fait partie la **classification supervisée**. On connait les classes et on cherche à les reproduire pour les généraliser et pouvoir traiter des nouvelles données non-classifiées. - la méthode **non-supervisée**: On cherche les classes. Dont fait partie le **clustering** ## Algorithme des $k$ moyens (KMEANS) *Cas particulier de clustering* ### Définition **Données :** $n$ points en dimension $d$. Exemple: $d = 2$. Objectif: Définir les classes. ![](https://i.imgur.com/P5YxZ8j.png) Les classes doivent regrouper les "points proches" et séparer les "points éloignées". K-MEANS raisonne avec $K$ (fixé) = nombre de classes représentées par leur centre = moyenne des coordonnées (barycentre = centre de gravité) *Algorithmique*: - Initialiser les $K$ centres : $M_{1}, M_{2}...M_{K}$ - Répeter jusqu'à stabilisation $\Rightarrow$ Classification: Chaque point $X_{i}$ est classé dans $C_{j}$ tel que $M_{j}$ est le centre **le plus proche** de $X_{i}$. $\Rightarrow$ Mise à jour chaque $M_{j}$ est écrasé par le centre de la classe $C_{j}$. ### Exemple numérique $1~d$ ![](https://i.imgur.com/W0aKz9R.png) #### Fonctionnement - $k = 2$ - Initialisation au hasard: $M_{1} = 9$ et $M_{2} = 14$. $\Rightarrow$ Premier passage dans la boucle : Calcul de distances | | $x_{1}$ | $x_{2}$ | ... | $x_{16}$ | | ------- | ---- | -------- | - | - | | $M_{1}$ | 8 | 7 | | 5 | | $M_{2}$ | 13 | 12 | | 2 | $C_{1} = \{1;2;3;4;10;11\}$ $C_{2} = \{15;16\}$ Mise à jour : - $M_{1}=moy(C_{1}) = \frac{32}{6} = 5$ - $M_{2} = moy(C_{2}) = \frac{31}{2} = 15$ :::info Les centres $M_{x}$ ne doivent pas être arrondis. Dans l'exemple, c'est pour un soucis de facilité. ::: $\Rightarrow$ Deuxième passage dans la boucle : Calcul de distances | | $x_{1}$ | $x_{2}$ | ... | $x_{16}$ | | ------- | ---- | -------- | - | - | | $M_{1}$ | 4 | 3 | | 11 | | $M_{2}$ | 14 | 13 | | 1 | $C_{1} = \{1;2;3;4\}$ $C_{2} = \{10;11;15;16\}$ Mise à jour : - $M_{1}=moy(C_{1}) = \frac{10}{4} = 2$ - $M_{2} = moy(C_{2}) = \frac{52}{4} = 13$ Lorsque les centres ne bougent (presque) plus, l'algorithme se termine. #### Avantages - Rapide (cas général) - Fonctionne en dimension $d$ quelconque (contrairement à V, SSW, SSB... deviennent des matrices de dimension $d*d$) ex: pixels couleurs $(x,y) \rightarrow \Big(R(x,y),V(x,y),B(x,y)\Big)$ qui est un clusteur 5D de zones dans l'images avec : $R(x,y),V(x,y),B(x,y)$ un clusteur 3D de couleurs #### Limitations 1. Le calcul de distance en dim $d$ peut être "perturbé" si les dimensions sont dans des échelles différentes. ex: $(x,y,R,V,B)$ avec - $(x,y) \in \mathbb{N}^{2}$ - $(R,V,B) \in \{0,255\}^{3}$ **Solution**: Faire un prétraitement = Changement d'échelle pour "homogénéiser". ex: - Centrer et réduire chaque axe ($\mu$ et $\sigma$) - Ramener à $[0,1]$ avec min et max 2. Dans l'exemple précédent, $x_{10}$ est équidistant de $M_{1}$ et $M_{2}$. Dans quelle classe mettre $x_{10}$ ? **Solutions:** - Tirage au sort (peut perturber la convergence) - Appartenance partielle (ici 50/50) avec une moyenne pondérée $\Rightarrow x_{10}$ sera dans $M_{1}$ et $M_{2}$ mais avec un coeficient de $\frac{1}{2}$ 3. L'initialisation peut avoir une influence importante **Stratégie classique :** - Tirer au sort les $M_{j}$ initiaux parmi les $x_{i}$ - Faire plusieurs essais de ce type + un critère de selection 4. Si une classe $C_{j}$ est vide, $mxy$ de $M_{j}$ ? **Solution :** $M_{j}$ reste identique avec "warning". (peut-être que $K$ est trop grand) 5. **La plus importante:** $K$ est fixé à l'avance, l'algo ne peut pas le modifier. Il faut donc avoir une idée fiable de la valeur de $K$ "approximative" mais si la dimension est grande, il sera difficile de le visualiser. **Stratégie classique:** Essayer avec $k=2$, puis $k=3$... (rester "raisonnable" + critère de sélection). Variante **complexe** qui modifie $K$ "en cours de route". (Xmeans 2000-2005) ### Généralisation Chaque classe $C_{j}$ représentée par la loi normale multidimensionnelle : $$ N_{d} = \Big(M_{j}; \sum j) $$ où $\sum j$ est la matrice de variance et de covariance Il s'agit du **Modèle de mélange gaussien** (*Gaussian Mixture Model* + algorithme EM)