IMAGE, SCILAB et IMLAB Jacques Bretin Les logiciels Scilab Dans un premier temps, télécharger (gratuit) et installer scilab-5.1.1 http://www.scilab.org/download/index_download.php?page=release#windows Puis télécharger sivp-0.5.0 (gratuit). http://fr.sourceforge.jp/projects/sfnet_sivp/releases/ Il s installe dans le répertoire où est installé scilab dans C:\Program Files\scilab-5.1.1\contrib\SIVP-0.5.0. Sivp est une boîte à outil pour le traitement des images essentiel à l analyse des images dans scilab: on ne peut rien faire sans cette boîte. Dans le répertoire SIVP-0.5.0, lancer «builder.exe» Doit apparaître sur la console de scilab un onglet «boîte à outils» : il faut lancer SIVP à chaque ouverture de scilab pour pouvoir utiliser les fonctions de sivp. (boîtes à outils/sivp) Les bibliothèques doivent être chargées (cf ci-contre) IMLAB Un autre bon outil indispensable pour l analyse des image est le logiciel IMLAB (gratuit) : on peut très facilement ouvrir une image, obtenir la matrice image, l histogramme, et faire une tapée de choses sur les images. Matrices image et histogramme obtenus avec IMLAB :
II. Représentation d une image numérique Une image numérique «noir & blanc», c est-à-dire en 256 teintes de gris, est représentée par une matrice n*p dont les nombres sont des éléments de Z/256Z. Chaque nombre de la matrice correspond à la teinte d un pixel de l image. 0 correspond au noir, 255 au blanc. Imlab donne cette matrice avec la teinte du pixel en fond de cellule. L histogramme associé à l image donne la quantité de pixels ayant une teinte de gris donnée. Une image numérique «couleur», c est-à-dire en 256 teintes de rouge, vert et bleu, est représentée par une matrice n*p*3 dont les nombres sont des éléments de Z/256Z. X(10,5,1), X(10,5,2), X(10,5,3) sont des nombres de Z/256Z correspondant aux composantes rouge, vert, bleu du pixel de la 10 ème ligne et 5 ème colonne. Sur la figure ci-contre (extrait de la matrice d une image couleur), le 1 er pixel en haut à gauche a une couleur de 42 rouge, 23 vert et 51 bleu. Chaque image couleur a 4 histogrammes : Un pour chaque couleur et un correspondant à la luminosité globale du pixel (doit correspondre à la moyenne des 3 nombres r,v,b).
III Dans Scilab : premiers pas (image noir&blanc) Après avoir lancé Scilab et ouvert la boîte à outil sivp : Importation d une image : imread. Je veux importer une im age (nathangris.jpg) placée dans le lecteur F (cf ci-dessous). X est une matrice (n,p) de n lignes et p colonnes de nombres entiers entre 0 et 255. Attention : ces nombres sont dans Z/256Z (255+1=0). Ils ont le format «uint8». Voir l image : imshow. imshow permet de «voir» la matrice ; cela déclenche l ouverture de la fenêtre «image show») X(1 :10,1:5) (sans «;») montre l extrait de la matrice (lignes de 1 à 10, colonnes de 1 à 5). La matrice ci-dessous (avec les teintes de gris est obtenue avec Imlab) Size(X) : donne la taille de la matrice. Ici l image a 101 lignes et 150 colonnes. Size(X,1) : donne le nombre de lignes. Size(X,2) : donne le nombre de colonnes.
Histogramme de l image : imhist(x) renvoie une matrice 256*2,correspondant au nombre de pixels de chaque teinte. Sur l exemple, il y a 334 pixels ayant la teinte 0 (noir). Il y a 16 pixels ayant la teinte b(17) =16. b(1) =0, b(2)=1 b(256)=255. la matrice vecteur colonne est constitué du nombre de pixels des teintes de 0 à 255. bar(imhist(x)) ouvre une nouvelle fenêtre (Figure n 0) et affiche l histogramme : On peut régler l épaisseur des barres (ici 0.1), régler la couleur de l intérieur des barres (non visible ici : trop fin ; avec edit/figure on peut changer la couleur des bords des barres). Avec edit/axes, on peut améliorer l aspect du graphique Médiane, quartiles et moyenne, écart type : median(x) renvoie la médiane quart( double(x)) renvoie une matrice de 3 lignes : Q1, médiane et Q3. double(x) transforme les entiers de Z/256Z en réels, nécessaire pour le calcul des quartiles. mean(double(x)) calcule la moyenne stdev(double(x)) calcule l écartype.
IV. Opérer sur les images avec scilab 1. Eclaircir une image Créons une «mire» constitué de 256 pixels (matrice 16*16) ayant les teintes de 0 à 255 : Fonction à taper dans l éditeur (Applications/editeur), puis à charger dans scilab (Exécuter/charger). Il ne reste plus qu à exécuter la fonction dans la console de scilab (la matrice mire est définie par mire=couleur()), transformer la matrice réelle en matrice d image (nombres dans Z/256Z) (mire=uint8(mire)) puis sauver l image par imwrite (imwrite( F:\mireoriginale.jpg ) ). Il ne reste plus qu à ouvrir cette image par photoshop (pour l éclaircir par exemple) ou par Imlab (pour visionner la matrice avec les teintes) : Mire originale Mire éclaircie de 20 par photoshop On voit que pour éclaircir de 20, on ajoute 20 à toutes les teintes des pixels sans dépasser 255. 1 ère idée : Cela revient à faire dans scilab : mireplusclaire =mire+20 La matrice mireplusclaire est égale à la matrice mire telle que, chaque nombre de mire est augmenté de 20 (donc plus clair). 0,1,2,3. deviennent 20,21,22,23 sauf que 235, 236, 237 255 deviennent 255,0,1,2,..29 Si on éclaircit trop, la méthode pose un problème : les nombres ne peuvent dépasser 255, aussi la somme se fait modulo 256 : les pixels dont le code dépasse 255 (blanc) vont dévenir très foncés
2 ème idée : Améliorons la méthode : Explications : mireplusclaire= double (mire)+20 : La matricemireplusclaire est égale à mire mais les nombres sont des réels (double) au lieu d entiers modulo 256. T(1 :16,1 :16)=255 : T est une matrice de même dimension que mire (16*16) et est remplie de 255. mireplusclaire=min(t,mireplusclaire) : les nombres de mireplusclaire qui dépassent 255 deviennent 255. mireplusclaire =uint8(mireplusclaire) : les nombres de mireplusclaire sont transformés en entiers de 8 bits (code image) au lieu d être des réels. mireplusclaire redevient une matrice d une image en 256 teinte de gris et peut être affichée. On a bien obtenue ce qu on cherchait : une matrice d image ayant la teinte de chaque pixel augmentée de 20. 3 ème idée : on regarde l aide SIVP En fait, il y a une commande SIVP qui fait tout cela tout seul!!! : imadd : commande SIVP qui additionne 2 matrices images ou une matrice et un nombre sans dépasser 255 ; le résultat est une matrice image qui peut être affichée.
Application à Nathan : 2. Foncer une image. imsubtract: commande SIVP qui soustrait 2 matrices images ou une matrice et un nombre sans dépasser être négatif ; le résultat est une matrice image qui peut être affichée. 3. négatif d une image. imcomplement : donne le négatif Cela revient à faire nathannegatif= - nathan +255 : la teinte t de chaque pixel est remplacée par 255 t. 4. contraster une image. Laa même image avec plus ou moins de contraste : (réalisé avec la fonction contraste de photoshop)
Dans les opérations de contraste ou de «décontraste», moyenne et médiane ne se modifient pas ou peu, en revanche quartiles et écart type sont modifiés : contraster : écart type augmente décontraster : écart type diminue L idée est de modifier les teintes en faisant une homothétie centrée sur la médiane avec rapport >1 pour contraster et <1 pour décontraster. Fonction contraste à entrer dans l éditeur et à charger dans scilab: L écart type et les intervalles interquartiles ont grandi : le contraste a augmenté. Médiane fixe et moyenne presque fixe.
«Décontrastons» Nathan : Les intervalles interquartiles et l écart type ont diminués, médiane fixe et moyenne presque fixe : l image est moins contrasté que l image de nathan original. Voyons sur la mire : Original contraste 1,5 contraste 0,5
Contraste 1,5 Original Contraste 0,5 On peut s intéresser aux 2 fonctions f 1,5 et f 0,5 qui à chaque teinte de l original (de 0 à 255) associe la teinte correspondante de l image contrastée (f 1,5 ) et de l image décontrastée (f 0,5 ). Utilisons un tableur et entrons les nombres (extraits). (rigolo à programmer par des formules)
250 200 150 f1,5 f0,5 100 orig 50 0 0 50 100 150 200 250 La médiane de la mire est 127,5 qui est le point fixe de l homothétie qui contraste. Ces fonctions semblent à peu près affine ou affine par morceaux (à peu près car on est sur des entiers). Fonction f 0,5 : f 0,5 (0)=63 et f 0,5 (255)=191 et f 0,5 (127,5)=127,5. Donc la pente est (191-63)/255 0,5. On peut essayer la fonction x E(127,5+0,5(x-127,5)). Une vérification sur le tableur confirme Fonction f k (k<1) : x Ent(médiane+k*(x-médiane)) (normal vu de la programmation de contraste) Fonction f 1,5 : (partie entre 43 et 213, avant c est 0 et après c est 255) f 1,5 (43)=0 et f 1,5 (213)=255. Donc la pente est 255/(213-43) = 1,5. On peut essayer la fonction x E(127,5+1,5(x-127,5)) pour la partie oblique. Une vérification sur le tableur confirme ce résultat. Fonction f k (k<1) : x Ent(médiane+k*(x-médiane)) sur [E(m*k/(k-1)+1) ;255- E(m*k/(k-1))] (à 1 près)
V. Bruitage 1. Bruiter une image X(1 :100,1:100)=128 construit une matrice 100*100 remplie du gris moyen 128 XX=uint8(X) transforme cette matrice X en une matrice image : Image et histogramme de l image XX. Y=grand(100,100,'nor',0,1) fabrique une matrice 100*100 remplie de nombres aléatoires (loi normale centrée en 0 et d écart type 1) T = X+Y ; TT=uint8(T) ; T est X bruité de Y, TT est l image obtenue : On peut créer une fonction «bruit(t,a)» qui bruiterait une image T (a étant l écart type de la loi normale). function [Z] =bruit(t,a) Z=double(T);n=size(T,1);p=size(T,2); M(1:n,1:p)=0;N(1:n,1:p)=255; Q=grand(n,p,'nor',0,a);Z=Z+Q; Z=max(Z,M);Z=min(Z,N) ; Z=uint8(Z); endfunction Bruitons Nathan (qui est maintenant dans la matrice X eh oui il a quitté la matrice de la mère)
Original nathangris Nathan bruité 2. Débruiter une image Plusieurs méthodes existent, plus ou moins efficaces. Méthode 1 : On parcourt l image par un carré de (2a+1) pixels de côté. Le pixel central du carré de l image «débruitée» a pour valeur la médiane des (2a+1)² pixels de l image bruitée. function [Z]= debruit1(t,a) n=size(t,1); p=size(t,2); Z=T;Z(:,:)=0; for ligne = a+1 : n-a for colonne = a+1 : p-a M=T(ligne-a:ligne+a,colonne-a:colonne+a); b=median(m); Z(ligne,colonne)=b; end end endfunction
Débruité 1 (a=2) Débruité1 (a=1) original bruité débruité 1 (a=1) La méthode débruite mais : 1) cela rend flou 2) il y a une perte d information, perte de contour débruité original +128 Information perdue = débruité bruité+128 perte de contour
C EST TOUT POUR L INSTANT.. autres méthodes de débruitage pour bientôt.