--- title: Le traitement d'images tags: S8 --- # Le traitement d'images [TOC] --- ## Introduction [SLIDES](http://jo.fabrizio.free.fr/teaching/ti/tifo_intro.pdf) ### Domaines du traitement d'images: - Amelioration/Restauration - Extraction d'infos - Transmission/Compression - Analyse bas-niveau Entre la vision par ordinateur et la synthese d'images (autres cours). ![GRAPHIQUE DOMAINES](https://i.imgur.com/mgWR4L2.png) ### Applications #### Video surveillance - Suivi de personnes - Radars automatiques - Empreintes digitales - ... #### Assistance - Aide au malvoyants - Assistance a la conduite - ... #### Film/Photo/Art - Effets speciaux - Traitement embarques sur appareil photo - Restauration - ... ### Historique du traitement d'images | Date | Invention | Inventeur | | ---- | --------- | --------- | | ~1800 | Photographie | Nicephore Niepce (FR) | | 1869 | Photo Couleur | Charles Cros (FR) & Louis Decos du Hauron (FR) | | 1884 | [Disque de Nipkow](https://fr.wikipedia.org/wiki/Disque_de_Nipkow) | Paul Nipkow (DE) | | 1895 | Cinematographie | Louis Lumiere (FR) | | 1967 | [Capteur CMOS](https://en.wikipedia.org/wiki/Active-pixel_sensor) | Frank Wanlass (US) | | 1969 | [Capteur CCD](https://fr.wikipedia.org/wiki/Capteur_photographique_CCD) | George E. Smith (US) & Willard Boyle (CA/US) | ### Faire du traitement d'images #### Logiciels - Gimp - Photoshop - ... #### Bibliotheques - Olena - OpenCV - ITK - ... --- ## Formation d'une image [SLIDES](http://jo.fabrizio.free.fr/teaching/ti/tifo_formation_image.pdf) ### Couleurs primaires ? | SOURCE | FILTRE | FILTRE | | - | - | - | | R | C | B | | V | M | R | | B | J | J | ### Acquisition (Capteurs) Capteur CCD niveau de gris: - Chaque capteur (pixel) va generer une certaine intensite d'electricite (par rapport au niveau de flux de lumiere) - Trop d'intensite -> surcharge et deborde sur les autres capteurs (voire crame si vraiment trop de lumiere) Capteur CCD couleur (bayern patterns): | | | | | | | | | | - | - | - | - | - | - | - | - | | V | B | | V | B | | V | B | | R | V | | R | V | | R | V | | | | | | | | | | | V | B | | V | B | | V | B | | R | V | | R | V | | R | V | - Chaque capteur va recuperer sa propre couleur - On pere l'information de chaque couleur sur les autres capteurs (On a que 1/4 du rouge, 1/4 du bleu et 1/2 du vert) - 2 fois plus de vert que de bleu ou rouge car fonctionnement proche de l'oeil humain et il fallait aussi un 4e capteur... Piege commercial aujourd'hui: plus de pixels ne veut rien dire. Comment l'onde est garde ? Quelle est la sensitivite du capteur ? Transfert des donnees: - Entrelace # Raffraichit une ligne sur deux... Moins cher mais plus moche lors d'un mouvement (la moitie des pixels est a la frame precedente) - Progressif # Raffraichit une a une les lignes rapidement de haut en bas souvent ### Visualisation Technos: - CRT (Cathode Ray Tube) # Canon a electron qui raffraichit de maniere progressive l'image - LCD (Liquid Cristal Display) # Retro-eclairage avec filtre par cristaux liquides (Neons) | Remplaces parfois par des LED (moins conso plus detail mais fait plus mal aux yeux) ### Perception Capteurs: - Cones (7'000'000), perception en RVB, vision diurne, maximal dans la fovea - Batonnets (120'000'000), vision scotopique, maximal en peripherie Spectre visible: ![GRAPHIQUE SPECTRE VISIBLE](https://i.imgur.com/jQFvc8a.png) 400nm - 800nm Les capteurs peuvent capter un peu plus dans l'infra-rouge (exemple du capteur de telephone avec une telecommande). La perception maximale est dans le vert (vert plutot jaune, pas vert vert). Elle varie dans le temps (persistance retinienne par ex.): Attention a ne pas se fier sur ce que nous percevons, nous sommes influences par l'ambiance. Le cerveau s'appuie sur le contexte pour interpreter une image (Cf. effets d'optique sur les slides). Idem pour lire une pancarte, on va interpreter un "pate" de texte de loin en voyant par exemple un logo a cote. ## Codage des couleurs et representation des images ### Les espaces de couleur Il existe plein d'espaces de couleurs (en fait on peut meme dire une infinite) Le choix de l'espace de couleur depend completement de l'application que vous en faites Voici les principaux utilises aujourd'hui: #### Le modele RGV (Red, Green, Blue) L'image se decompose en trois axes : Le rouge, le vert et le bleu On va donc choisir un pourcentage dans chacun de ces axes pour representer la composition de la couleur #### Le modele HLS (HUE, Lightness, Saturation) ![REPRESENTATION DU HLS (DISQUES, CONES)](https://i.imgur.com/7Hsi624.png) Une couleur = 3 coordonnees (H, L et S; sur 3 axes) - HUE: Teinte, l'angle sur le disque. EN GENERAL: - 0 = rouge - 60 = jaune - 120 = vert - 180 = cyan - 240 = bleu - 300 = magenta - Lighness: Luminance, la hauteur sur le cone - Saturation: La purete sur la couleur, Distance sur le disque C'est un modele super intuitif (par rapport au RGB) Par contre le HLS perd en interet sur la teinte sur des saturations faibles #### Le modele CMY (Cyan, Magenta, Yellow) Exactement la meme chose que le RGB, mais avec les couleurs de la synthese soustractive. Utile notamment pour les imprimantes #### Le niveau de gris Une seule composante qui code la luminance. min est noir, max est blanc, et entre deux, il va falloir calculer les composants pour passer d'une couleur a un niveau de gris (Une moyenne c'est trop facile et peu fidele. On favorise souvent le vert) #### Autres modeles - [YIQ](https://en.wikipedia.org/wiki/YIQ) (Y est la luminance) - NTSC 1953 - Transmission et compatibilite de l'image entre couleur et ecran noir/blanc - [Lab](https://en.wikipedia.org/wiki/CIELAB_color_space) - En RGB on ne peut comparer les distances entre les couleurs. Ca ne veut rien dire pour nous visuellement. Le Lab permet de rendre ces distances representatives de la difference percue visuellement entre les deux couleurs - [XYZ](https://en.wikipedia.org/wiki/CIE_1931_color_space) - [YCbCr](https://en.wikipedia.org/wiki/YCbCr) - Utilise beaucoup dans la video, notamment dans la compression - ... ### Conversion entre les espaces de couleurs #### RGB - HLS ![SCHEMA DE CONVERSION](https://i.imgur.com/2dWiR6K.png) #### RGB - YIQ $$ \begin{pmatrix}Y\\I\\Q\end{pmatrix} = \begin{pmatrix}0.3 & 0.59 & 0.11\\0.6 & -0.28 & -0.32\\0.21 & -0.52 & 0.31\end{pmatrix}\begin{pmatrix}R\\G\\B\end{pmatrix} $$ #### RGB - CMY $$ \left\{ \begin{array}{} R = 1 - C\\ G = 1 - M\\ B = 1 - Y \end{array} \right. $$ #### RGB - niveaux de gris Idee simple: $$ L = (R + G + B) / 3 $$ Mieux: $$ L = 0.299 * R + 0.587 * G + 0.114 * B $$ Les coefficients peuvent etre modifies a souhait mais ceux-la sont les "basiques" On ne peut pas revenir en arriere, on perd toute notion de multi-dimensions (On peut revenir en arriere avec des IA ou a la main bien evidemment, mais on ne pourra que deviner) #### RGB - noir et blanc La methode depend completement de l'application. Le plus souvent, ce serait sur un seuil sur la luminance (Cf. calcul niveaux de gris) et si on le depasse, c'est blanc, sinon c'est noir ### Representation matricielle d'images #### Image couleur Sous forme de matrice: Un vecteur par case (pixel) | | | | | - | - | - | |(42,23,0)|(250,0,42)|(142,184,4)| |(0,32,0)|(42,142,42)|(23,25,142)| #### Image en niveaux de gris Sous forme de matrice: Une valeur (luminance) par case (pixel) | | | | | - | - | - | |42|250|142| |0|42|23| #### Parcourir une image De haut en bas: ```java for(i=0;i<sx;i++) for(j=0;j<sy;j++) long offset=i+j*sx; // offset is the position of the pixel /* Do something */ ``` Cependant, on preferera de gauche a droite: ```java for(j=0;j<sy;j++) for(i=0;i<sx;i++) long offset=i+j*sx; // offset is the position of the pixel /* Do something */ ``` De plus, on peut simplifier cette derniere methode: ```java for(offset=0;offset<sx*sy;++offset) /* Do something */ ``` ### Resolution et echantillonnage ![REPRESENTATION EN IMAGE DE LA RESOLUTION ET DE L'ECHANTILLONNAGE](https://i.imgur.com/qgoyNBS.png) #### Nombre de couleurs - Echantillonnage ##### Codage par palette (couleurs indexees) | Bits par pixel | Couleurs | | - | - | | 1 | 2 | | 2 | 4 | | 4 | 16 | | 6 | 64 | | 8 | 256 | On peut ensuite jouer avec la palette pour obtenir des resultats differents sans changer d'image ##### Codage sans palette | Bits par pixel | Couleurs | Bits par canal couleur (R G B) | - | - | - | | 16 | 65'536 | 5 (le vert en a 6) | | 24 | 16'777'216 | 8 | | 32 | 16'777'216 | 8 (on ajoute un canal de transparence) | ### Autres representations d'une image On peut aussi representer une image sous la forme d'un arbre (max tree, min tree, tree of shape, ...) Ou alors d'un graph: le maillage. Un maillage carre est intuitif mais quels sont les inconvenients ? Y a t il d'autres formes de maillage ? ### Le maillage #### Carre On preferera un graphe connexe. Cependant, les branches du graphes ne doivent pas se croiser. Voire pourquoi on ne peut pas sur les slides 32-35 #### Hexagonal On change la forme d'un pixel en hexagone ![REPRESENTATION DES PIXEL EN HEXAGONE](https://i.imgur.com/AKtzyEX.png) On a plus aucun probleme de connexite et de distance, cependant on explose en optimisation niveau memoire ### L'arbre #### Un exemple: le max tree ![REPRESENTATION EN MAX-TREE](https://i.imgur.com/vqC1sKl.png) On peut se focaliser sur une region specifique d'une image (une branche) Plus on descend dans l'arbre et plus on zoom dans les zones de l'image ### Les formats d'image Il existe plusieurs formats d'image: - JPEG compression perte - TIFF plusieurs image & choix de compression, tres simple - PNM plusieurs sous-format differents, format tres simple (Cf. slide 42) - PBM noir et blanc - PGM niveaux de gris - PPM couleurs - PNG options de compression, canal alpha disponible - BMP commence en ecrivant la derniere ligne (pas pratique) - GIF n'etait pas libre (aujourd'hui oui) - TGA simple a encoder/decoder - ... On va choisir son format selon plusieurs criteres: - Avec ou sans compression (avec ou sans perte) - Avec ou sans couleur - Avec ou sans palette - Mono ou multi-images - Optimise ou non pour une architecture - Libre ou non ### Applications On a vu pas mal de choses sur la formation d'une image On va l'appliquer 1. en changean les couleurs ou l'illumination d'une image 2. en changeant l'organisation spatiale des pixels de l'image 3. en combinant des changements dans les couleurs et dans l'organisation spatiale des pixels #### Changer l'illumination <!-- TODO --> En tous points de la scene, la reponse du capteur est donne par $$ L(x,y) = \int{}{}E(x,y,\lambda)S(x,y,\lambda)R(\lambda)d\lambda $$ $E(x,y)$ l'eclairage $S(x,y,\lambda)$ la reflectance de la surface #### Correction d'illumination non uniforme <!-- TODO --> #### Modification des couleurs de l'image Realiser un effet sepia (passage du niveau de gris a la couleur) On change simplement l'echelle de luminance d'une echelle noir-zero a une echelle noir-sepia (orange par exemple) ![CHANGEMENT DES ECHELLES](https://i.imgur.com/jbfjRA9.png) $$ \begin{pmatrix}R\\G\\B\end{pmatrix} = \begin{pmatrix}0.784 & 0 & 0\\0 & 0.588 & 0\\0 & 0 & 0.391\end{pmatrix}\begin{pmatrix}L\\L\\L\end{pmatrix} $$ #### Modification de l'organisation spatiale des pixels Surtout ne pas partir de l'origine vers le resultat, on risque d'avoir des trous (des pixels resultats que l'on n'aura pas set par erreur), on va preferer partir de la destination a partir de laquelle on va vouloir chercher dans la source $$ Image_{resultat}(x, y) = Image_{origine}(g(x,y), h(x,y)) $$ $g(x,y)$ et $h(x,y)$ sont en fait les fonctions inverses de la transformation #### Modification des couleurs et de l'organisation spatiale des pixels Exemple: le morphing Adapter une image sur le visage d'une personne, on defini des points de raccord entre les images et on applique la modification #### La correction gamma Retour sur la perception: La perception de l'oeil est logarithmique. La repartition des niveaux d'energie n'est pas lineaire mais exponentielle ! | Nv. gris | Lineaire | Signal reel | | -------- | -------- | ----------- | | 0 | 0.00 | 0.00 | | 32 | 0.13 | 0.01 | | 64 | 0.25 | 0.05 | | 96 | 0.38 | 0.12 | | 128 | 0.50 | 0.22 | | 160 | 0.63 | 0.35 | | 186 | 0.73 | 0.50 | | 192 | 0.76 | 0.53 | | 224 | 0.88 | 0.75 | | 255 | 1.00 | 1.00 | Donc tous nos traitements sont faux: Une moyenne entre 0 et 255 en lineaire donne 128 donc 50% du signal, mais finalement nous sommes reellement a 22%! AVANT DE SE LANCER DANS DES CALCULS SAVANT Est-ce important ? Le calcul lineaire est beaucoup plus rapide, mais moins exact. Le petit robot qui doit prendre une decision rapidement aime bien :smiley: Par contre pour le photographe professionnel et qui veut pas ruiner son cliche... ```java float gamma = 2.2 long r = (number / 255) ^ gamma ``` ##### XYZ et le gamma ![](https://i.imgur.com/tGkTFub.png) #### L'interpolation Que faire lorsque l'on doit chercher la valeur d'un pixel mais que l'on ne tombe pas precisement sur un pixel ? 1e solution: on recupere le pixel le plus proche... Rapide mais pas tres precis 2e solution: on fait une interpolation bi-lineaire: d'abord une interpolation horizontale puis une interpolation verticale (litteralement la moyenne proportionnelle des pixels qui l'entourent) 3e solution: on fait une interpolation bi-cubique: On tient compte de la derivee pour interpoler... Horizontalement ET verticalement ! C'est violent mais propre. Donc du coup on va avoir besoin de deux points avant et deux points apres, plutot qu'un seul. On calcule la valeur logique pour que notre point suivent la derivee. ![REPRESENTATION GRAPHIQUE DES SOLUTIONS](https://i.imgur.com/HAaWyAk.png) ## Histogramme On peut deviner beaucoup de chose d'un histogramme: - Image trop sombre - Contraste pas assez prononce ### Ameliorer le contraste #### Etirement lineaire A partir de l'histogramme, on peut voir ou on va appliquer notre correction ![](https://i.imgur.com/DItIuRn.png) On trouve alors notre min et notre max de contraste, puis on va les etirer aux bords de l'histogramme. CEPENDANT: On DEGRADE l'image! En effet, on perd les informations qui ont ete ecrasees par l'etirement ![](https://i.imgur.com/8RBRt2b.png) #### Correction non lineaire On va aussi pouvoir modifier la courbe de correspondance des niveaux de gris directement ```java for(offset=0;offset<sx*sy;++offset) image[offset] = f(image[offset]); ``` ![](https://i.imgur.com/4BbPpM7.png) #### Histogramme cumule On va pouvoir calculer un histogramme cumule: $$ hc(x) = \left\{ \begin{array}{ll} hc(x-1) + h(x) \text{ pour } x > 0\\ hc(x) \text{ pour } x = 0 \end{array} \right. $$ <!-- TODO --> #### Histogramme et images couleur On peut calculer un histogramme global ou alors par plan de couleur On aura alors un histogramme en 3D, ou alors 3 histogrammes distincts pour chaque couleur Pour les calculs, on peut faire global ou par plan Cependant pour les traitements: - Independamment sur chaque canal - Changer d'espace et traitement uniquement dans L ou V (! Ne fonctionne pas sur toutes les images et tous les espaces de couleur !) Egalisation sur l'espace de couleur de base, traitement sur chaque plan ON A UN RESULTAT FAUX, les couleurs changent BEAUCOUP (On invente meme des couleurs qui n'existent tout simplement pas) Et sur un autre espace ? Sur le HLS on a bien un resultat satisfaisant, avec une luminance augmentee (voire surexposee !) ![](https://i.imgur.com/R0HOZcd.png) #### Indexation Distance entre histogrammes - On pourrait comparer deux images a bas coup. Le resultat ne sera pas sur mais au moins on a des images dans les memes teintes - Segmentation automatique en plan de sequences (Differences entre images consecutives) Deux solutions: - bin-by-bin - [Distance de Hellinger](https://en.wikipedia.org/wiki/Hellinger_distance): dangereux car ne comparera pas deux couleurs tres proche - cross-bin - [Earth Mover's Distance](https://en.wikipedia.org/wiki/Earth_mover%27s_distance): permet de gerer s'il y a un petit decalage (la distance devient la quantite de decalage que l'on doit faire) #### Diminuer le nombre de couleurs Objectif, reduire le nombre de couleurs utilisees tout en conservant le plus possible l'image originale ![](https://i.imgur.com/AD3jjus.png) ##### Median cut algorithm 1. Construction de l'histogramme des couleurs 2. Elimination des extremitees non utilisees 3. Decoupage du parallelepipede restant en deux sous blocs contenant autant de points 4. Reiterer pour chaque sous bloc l'algorithme (1. 2. 3. 4.) 5. Une fois la quantite de parties voulue obtenues, donner a chacune une couleur representative Moins on supprime de couleurs, plus l'algorithme est long (puisqu'il doit descendre jusqu'a avoir le nombre de couleurs voulues) ![](https://i.imgur.com/Wq89TTc.png) ##### Diffusion de l'erreur *Moment culture generale* Si j'ai fait une faute sur un pixel, plutot que de tenter de reparer (alors que c'est impossible), on va compenser sur les pixels voisins en propageant l'erreur 1. On remplace la couleur du pixel considere par le representant 2. On calcule l'erreur commise par cette substitution en faisant la difference entre la vraie couleur et la couleur de remplacement: on trouve une erreur pour chaque canal 3. On repartie l'erreur estimee sur les pixels voisins [En savoir plus](https://en.wikipedia.org/wiki/Error_diffusion) ![](https://i.imgur.com/289ZFAJ.png) ##### Binarisation (passage en noir et blanc) Dans le monde des bisounours on a un histogramme bimodal (et du coup on coupe au milieu et c'est magique) Sinon un algo simple: 1. Supposons un seuil T initial 2. Calculons les moyennes m1 et m2 des ensembles des pixels d'intensite inferieure a T et superieure ou egale a T respectivement 3. Corriger T avec T = (m1 + m2) / 2 4. Si T > dT reprendre a 2. Ou alors, le critere d'Otsu 1. On cherche deux classes - Minimiser la variance intra-classe - Maximiser la variance inter-classe 2. $m_1(k)$ et $m_2(k)$ les moyennes des deux classes formées par le seuil k 3. mg la moyenne 4. $p_1(k)$ et $p_2(k)$ les probabilités d'occurrence des deux classes formées par le seuil k 5. Maximiser la variance inter-classe : $$ \sigma(k)^2 = P_1(k) (m_1(k) – m_g)^2 + P_2(k) (m_2(k) – m_g)^2 $$ <!-- TODO --> <!-- TODO --> <!-- TODO --> <!-- TODO --> <!-- TODO --> <!-- TODO --> <!-- TODO --> --- ## Filtrage [SLIDES](http://jo.fabrizio.free.fr/teaching/ti/tifo_filtrage.pdf) <!-- TODO --> SLIDES MANQUANTES | VOIR NOTES HELO/MIYA <!-- TODO --> ### Filtres classiques #### Detection de bords Strategies classiques: - Sobel $$ \begin{pmatrix} -1 && 0 && 1\\ -2 && 0 && 2\\ -1 && 0 && 1 \end{pmatrix} and \begin{pmatrix} -1 && -2 && -1\\ 0 && 0 && 0\\ 1 && 2 && 1 \end{pmatrix} $$ - Prewitt $$ \begin{pmatrix} -1 && 0 && 1\\ -1 && 0 && 1\\ -1 && 0 && 1 \end{pmatrix} and \begin{pmatrix} -1 && -1 && -1\\ 0 && 0 && 0\\ 1 && 1 && 1 \end{pmatrix} $$ <!-- TODO: MASQUES SUR LE SLIDE --> Deux contours avec differents seuils: - Seuil haut (on est tres restrictif, il manque des pixels du contour) - Seuil bas (on est tres peu restrictif, il y a trop de pixels detectes mais au moins le contour) On prend les deux, on dit que tous les pixels du seuil haut sont corrects dans le seuil bas, puis on regarde pour les autres pixels detectes s'ils s'accordent avec les pixels valides On peut aussi faire une recherche de lignes de cretes, on suit le contour d'un objet peu a peu D'autres strategies: - Kirsch and Robinson Compass Masks - Frei-Chen: Tres riche, 9 masques qui forment la base, plus precis dans les images moins contrastees <!-- TODO: MASQUES SUR LE SLIDE --> Le Laplacien: - On utilise la derivee seconde, un point de contour est un passage a 0 ![](https://i.imgur.com/YdTr2yK.png) Calcul du Laplacien (ATTENTION FAUTE SUR LA DERNIERE LIGNE DANS LES SLIDES) $$ f'(x) = f(x + 1) - f(x)\\ f''(x) = f'(x + 1) - f'(x)\\ f''(x) = f(x + 2) - f(x + 1) - f(x + 1) + f(x)\\ f''(x) = f(x + 2) - 2 \times f(x + 1) + f(x) $$ <!-- TODO: COMPLETER --> Moravec: - Detecter les points d'interets 1. Pour chaque point 1. On fait la somme $S$ des differences des intensites entre un voisinage centre sur le point et le voisinage decale 2. On reitere le calcul avec des decalages dans toutes les directions 2. Pour chaque point, on garde parmi tous les decalages $i$ le resultat de $S_i$ qui a donne la plus faible valeur --- ## Le bruit [SLIDES](http://jo.fabrizio.free.fr/teaching/ti/tifo_noise.pdf) ### Modelisation Amelioration vs restauration Modele de degradation (dans le domaine spatial): - avec $h$ la degradation (optique, flou, ...) et $n$ le bruit (bruit additif) $$ I_{deg} = h \times I_{ori} + n $$ Attention a bien choisir $n$, le bruit n'est pas le meme dans les zones d'ombres et de lumiere Le bruit additif ($n$) est tres genant esthetiquement et au niveau des traitements (Cf. filtrage avec detections de zones non voulues) Reduire le bruit: - Estimer ce dernier ? - Reduire sans degrader le signal ? On choisit du bruit additif - La fonction de repartition peut varier (Gnaussien, ...) Pour l'estimer: - Le capteur est connu (on a l'appareil photo) - Photo d'une zone bien homogene dans de bonnes conditions d'eclairement - Le capteur n'est pas connu (on a plus l'appareil photo) - Analyse de quelques zones dans des photos qu'on a encore ![](https://i.imgur.com/ImxRNaU.png) ### Debruitage, reduction Revisite des filtres classiques - Mean filter - Median + variantes - Adaptative ![](https://i.imgur.com/0em4MwM.png)