owned this note
owned this note
Published
Linked with GitHub
# TIP - TP - Image Processing Practice Session
[Slides](https://moodle.insa-lyon.fr/pluginfile.php/61330/mod_resource/content/14/TIP_2021_2022_version_moodle.pdf)
[Sujet du TP](https://moodle.insa-lyon.fr/pluginfile.php/148003/mod_resource/content/3/TPTIP_2021-2022_en_v2.pdf)
###### tags : `TIP` `TP`
## 1) Basic operations on images
### 1.1) Image histogram

1. 
2. **Clef :** L'image est assez homogène ce qui explique que les valeurs soient centrées autour de 128.
**Muscle :** L'image contient plus de niveaux de gris (cellules gris foncé/gris clair, blanc entre les cellules). On a donc un histogramme étalé.
3. D'après l'histogramme, on a l'impression que les fibres musculaires blanches occupent plus d'espace sur l'image. Mais le manque d'homogénéité de leur couleur par rapports aux fibres musculaires rouges rend la lecture plus compliquée.

### 1.2) Arithmetic operations


3. On utilise un bloc *Multiply by scalar* pour s'assurer que le résultat de l'addition des pixels reste compris entre 0 et 255.
Histogrammes :
**Spot :** L'image est en noir et blanc ce qui explique qu'il n'y ai que deux pics sur l'histogramme. L'image étant essentiellement noire, le premier pic de l'histogramme est logiquement plus important.
**Rondelle :** Il y a deux couleurs majoritaires sur cette image (gris foncé et gris clair) donc on a deux valeurs hautes. Les couleurs n'étant pas très homogènes, on a des gaussiennes centrées sur ces valeurs.
**SUM :** L'addition des deux images donne un résultat similaire à l'image *Rondelle* avec une partie claire et une partie foncée. Sur ces zones, la répartition des valeurs est similaire à celle de l'image *Rondelle*. On a donc l'histogramme de *Rondelle* qui apparît 2 fois dans l'histogramme de la somme.
4. L'addition entre la partie blanche de *Spot* et la *Rondelle* donne des valeurs supérieures à 255 (*Spot* étant déjà à 255 sur cette zone) et que la zone est donc blanche. Cela se traduit par un pic en 255 sur l'histogramme et une atténuation des valeurs d'origine de *Rondelle*

5. En connaissant les histogrammes des deux images, il est possible de prédire celui de leur somme.
### 1.3) Negative image


3. Pour chaque pixel, la valeur obtenue est $v_{negative} = 255 - v_{origine}$. 0 devient donc 255, 1 devient 254, etc... On a donc une inversion de l'histogramme.
### 1.4) Quantification


2. L'information est portée par les bits de poids fort
3. 
La quantification est opérée sur 3 bits donc on a 8 niveaux de gris (donc 8 pics sur l'histogramme).
Aussi, l'oeil humain n'étant capable de distinguer seulement 30 niveaux de gris, une quantifiactions sur 5 bits est suffisante.


Le MSB porte davantage d'information que le bit de poids faibles. L'image du LSB est beaucoup plus bruitée que celle du MSB. Ceci s'explique par le seuil de quantification. L'image MSB semble en noir et blanc ; en réalité, ses pixels varient entre 0 et 1.
> :warning: Pas sûr de l'histoire du seuil
## 2) Histogram Transformations
### 2.1) Image enhancement with histogram modification


$u(x) = {255*(x-V_{min})\over{V_{max}-V_{min}}}$


**Orginal histogram :** L'image est plutôt sombre et homogène, d'où un histogramme peu étendu (peu de contraste) dans les petites valeurs.
**Streched histogram :** Le constraste de l'image est augmenté, les valeurs sont plus étalées
**Log transformed histogram :** L'histogramme est encore plus étalé, $s = c*log(1+r)$, avec $s$ la valeur de pixel en sortie, $r$ la valeur du pixel en entrée et $c$ une constante multiplicative. On ajoute $1$ au pixel pour avoir une fonction correctement définie.
> $log(0) \rightarrow \infty$

> La fonction est "plate" ce qui permet de davantage diffuser les valeurs
### 2.2) Histogram Equalization



> L'égalisation d'histogramme est une technique simple qui utilise un opérateur inversible et s'adapte à l'image d'entrée. La méthode fonctionne bien dans les images dont l'arrière-plan et le premier plan sont à la fois clairs et sombres. Elle permet notamment d'obtenir de meilleures vues de la structure osseuse dans les images radiographiques, ainsi que de meilleurs détails dans les photographies surexposées ou sous-exposées.
> En gros on linéarise l'histogramme cumulé.

3. En égalisant, on cherche à obtenir la distribution la plus uniforme possible. Une fois qu'on l'a trouvée, on ne peut pas faire mieux donc une dexième égalisation nous donne le même résultat.
Mathématiquement on a :
- $s_k = T(x_k) = \frac{L-1}{n} \sum_{j=0}^kn_j$
- $s_{k2} = T(s_k) = \frac{L-1}{n} \sum_{j=0}^kn_j$
où $n_j$ vaut la même chose pour les deux histogrammes (original et égalisé) donc le résultat est bien le même.

### 2.3) Thresholding


Avec un seuil fixé à 90, tout ce qui est en dessous devient noir (valeur à 0) et tout ce qui est au dessus devient blanc (valeur à 255). On a donc deux pics pour l'histogramme.
## 3) Linear and non-linear filters
### 3.1) Mean (moving average) filter


1. L'image est quantifiée sur 32 valeurs soit 5 bits.
2. Le *mean filter* va bruiter notre image. On fait un moyennage des valeurs des pixels voisins. La forme générale de l'histogramme reste inchangée mais il n'est plus quantifié.
3. La différence correspond au bruit ajouté.


3. Les résultats sont similaires : l'image est floutée, on perd les détails (hautes fréquences). En appliquant deux filtres 3x3, on obtient un filtre avec des valeurs plus importantes sur le centre : $\begin{bmatrix}
1 & 2 & 3 & 2 & 1\\
2 & 5 & 9 & 5 & 2\\
3 & 7 & 12 & 7 & 3\\
2 & 5 & 9 & 5 & 2\\
1 & 2 & 3 & 2 & 1\\
\end{bmatrix}$
(valeurs purement fictives, à titre d'exemple).
> Twice 3x3 donne ± un filtre à moyenne pondérée
On remarque sur le DFT que le filtre 5x5 élimine plus les hautes fréquences.
### 3.2) Non linear filter


2. Le filtre médian arrive à gommer la dégradation *salt and pepper* alors que le filtre moyenneur ne fait que lisser cette dégradation (il l'étale).
3. **Morpho_unif20** :

Dans ce cas, le filtre moyenneur est plus efficace car il arrive à lisser l'effet du bruit uniforme alors que par zone, la médiane va l'amplifier.
4. **fissure_salt5** :

**fissure_unif20** :

Le filtre médian est plus efficace pour gommer des aspérités locales (*salt and pepper noise* par exemple) car il permet de ne pas prendre en compte les valeurs "aberrantes". Pour les images où le bruit est plus uniforme le filtre médian est moins efficace car en fonction des zones, si beaucoup de valeurs sont aberrantes la valeur renvoyée est erronnée.
On peut avoir le raisonnement inverse avec un filtre moyenneur qui va être affecté par une seule valeur aberrante mais qui va lisser l'effet de plusieurs de ces valeurs
### 3.3) Edge detection linear filters


2. La norme permet de récuperer les contours des élements de l'image. Les gradients permettent d'avoir le sens des variations dans l'image.
### 3.4) Canny Operator


3. Les contours sont davantage visibles lorsque Sobel est appliqué avec un filtre gaussien.
Plusieurs étapes sont appliquées :
- Réduction du bruit : utilisation d'un filtrage Gaussien
- Application du gradien d'intensité : retourne l'intensité des contours (utilisation de deux masques de convolution)
- Direction des contours : ${\theta =\pm \arctan \left({\frac {\mathrm {G} _{y}}{\mathrm {G} _{x}}}\right)}$ on obtient la direction de ces variations (On arrondit aux valeurs suivantes : $[0°, 45°, 90°, 135°]$)
- Suppression des non-maxima : on élimine des variations en ne gardant que les maxima-locaux en appliquant la dérivée au gradient.
On compare l'intensité du gradient du pixel avec celui de ses voisins dans la direction donnée. On garde le pixel si l'intensité du gradient est plus élevée que celle des pixels voisins.
*NB : On compare avec les valeurs dans la direction du gradient pour essayer de réduire au maximum l'épaisseur du contour*
- On fixe deux seuils.
- En dessous du premier seuil on ne garde aucune valeur
- Entre le premier et le deuxième seuil les pixels sont considérées comme *weak edge pixel*
- Au dessus du deuxième seuil les pixels sont considérés comme *strong edge pixel*
- Edge tracking by hysteresis : Si les *weak edge pixel* ont un *strong edge pixel* dans leur voisinage on garde la valeur, sinon on la supprimme



Après modification des seuils de Canny, on arrive a diminuer le bruit. En augmentant le seuil max, on diminue le nombre de fausses détections mais on perd aussi en qualité sur la détection des vrais contours (obtention de contours discontinus)
.


### 3.5) Laplace operator


Le filtre Laplacien n'a pas l'air robuste au Blur. Le contour détecté est lui aussi flou. C'est sûrement dû au fait que le résultat est obtenu en faisant la somme des dérivées secondes de l'image dans deux directions orthogonales (on n'élimine pas le bruit)


Il est plus difficile de distinguer les contours sur l'image filtrée par le Laplacien mais les contours ont l'air plus nets et plus continus que l'image filtrée avec Prewitt


> :warning: A revérifier
Cette méthode permet de réhausser les contours de l'image. Ainsi, on "défloute" l'image originale. On applique le laplacien et on le somme à l'image origniale.
> :warning: Je sais pas si c'est vraiment utile de mettre les matrices ici
$\begin{bmatrix}
0 & -1 & 0 \\
-1 & 4+\alpha & -1\\
0 & -1 & 0\\
\end{bmatrix} = \begin{bmatrix}
0 & -1 & 0 \\
-1 & 4 & -1\\
0 & -1 & 0\\
\end{bmatrix} + \alpha \begin{bmatrix}
0 & 0 & 0 \\
0 & 1 & 0\\
0 & 0 & 0\\
\end{bmatrix}$
## 4) Mathematical morphology


*NB : Il faut imaginer un élément strucurant qui se déplace sur l'image (carré, croix, ellipse par exemple)*
- La dilatation : "dilate" l'image. Lorsque l'élément structurant comprend au moins un pixel de l'image à dilater, le pixel central de l'élement structurant est ajouté à l'image s'il n'en fait pas déjà partie.
- L'érosion : "érode" l'image. Lorsque l'élément structurant comprend uniquement des pixels de l'image, le pixel central de l'élement structurant est conservé. Sinon, il est supprimé.





L'errosion est l'équivalent de la dilatation lorsque l'image est inversée. C'est normal car on vient alors enlever des pixels blancs autour des pixels noirs (équivalent à ajouter des pixels blancs autour des pixels blancs sur l'image originale)


Les opérations combinées sont appelées ***Ouverture*** et ***Fermeture***
**Ouverture** : Erosion puis Dilation. On vient "ouvrir" certains espaces (ici entre le nez et la bouche ou les oreilles par exemple)
**Fermeture** : Dilation puis Erosion. On vient "fermer" certains espaces (ici le nez et les yeux par exemple)
## 5) Image segmentation
### 5.1) Segmentation based on automatic tresholding



On applique une segmentation par seuillage automatique. Les valeurs en dessous du seuil deviennent noire, au dessus elles sont blanches. (ou l'inverse selon le choix).
*Le logiciel utilise l'algorithme d'Otsu pour déterminer le seuil optimal*
### 5.2) Split and merge segmentation






On remarque que plus le critère est élevé plus on détecte des zones larges. Un critère moins élevé permet de détecter plus de variations (exemple : le critère à 10 permet de détecter une tâche sur la rondelle que ne détecte pas le critère à 20)


Merge permet de rendre les zones indépendantes les unes des autres. On pourrait appliquer un seuilage, pour regrouper les zones par la suite afin de séparer les composantes.


L'image segmentée est obtenue en appliquant un niveau de gris à chaque région. Pour une région donnée on applique le niveau de gris moyen qui lui est associé.
## 6) Final exercices





