Vous êtes sur la page 1sur 7

IMAGES NUMRIQUES MATRICIELLES EN SCILAB

Ce document, crit par des animateurs de lIREM de Besanon, a pour objectif de prsenter quelques unes des fonctions du logiciel Scilab, celles qui sont spciques au traitement dimages numriques, travers quelques exemples. Il sagit ici de donner quelques lments, douvrir quelques portes pour quensuite chacun puisse se promener librement, sans tre ncessairement dj un spcialiste de Scilab. Nous ne parlerons ici que dimages numriques matricielles, cest--dire dimages mmorises sous la forme dune matrice. Cest le cas des images au format .png ou au format .jpg.

IA-

SCILAB - Module SIVP


Scilab

Lorsque lon ouvre le logiciel Scilab, une fentre nomme Console apparat. Une instruction tape dans cette fentre est excute de suite aprs la validation par la touche Entre du clavier. Par exemple, la commande 4 + 3, suivie de Entre donne ans = 7 . Pour crire un programme, et lenregistrer, on ouvre en plus une fentre nomme SciNotes qui sert dditeur de texte : dans le menu, cliquer sur licne de gauche, reprsentant une feuille blanche . Aprs enregistrement, le programme peut tre excut partir de Scinotes (menu Excuter), ou bien en layant au pralable copi dans la Console.

B-

Module SIVP (Scilab Image and Processing Video)

Le module SIVP permet dutiliser les fonctions imread, imshow et imwrite dont nous parlons dans ce document. Il nest pas install systmatiquement au moment o lon tlcharge Scilab, et pour linstaller, on peut : ou bien choisir le menu : Applications ; Gestionnaire de modules - ATOMS ; slectionner SIVP et cliquer sur le bouton installer ; ou bien crire dans la console : atomsinstall SIVP . On redmarre ensuite Scilab, et le module sera alors dnitivement charg : chaque dmarrage, on verra crit dans la console Start SIVP . . . . La fonction imread ache la matrice associe une image donne, la fonction imshow visualise limage associe une matrice donne, et la fonction imwrite enregistre cette image. Des explications complmentaires sont donnes dans le paragraphe ci-dessous.

II A-

LECTURE ET CRITURE DUNE IMAGE MATRICIELLE


Images en niveaux de gris

1. Lecture de la matrice dune image : fonction imread La fonction imread permet, tant donne une image, de faire acher la matrice qui lui est associe. La photo ci-contre a t prise avec un appareil photo numrique, puis transforme en niveaux de gris laide du logiciel de traitement dimage GIMP . Elle est constitue de 2132 pixels, chaque pixel (ou picture element ) tant un petit carr gris plus ou moins fonc. Cette image (ou photo) est mmorise sous la forme dune matrice constitue de 21 lignes et de 32 colonnes, elle est compose de nombres entiers compris entre 0 et 255. Ces nombres correspondent aux nuances de gris de chacun des pixels, ils vont de 0 pour le noir 255 pour le blanc, le nombre tant dautant plus grand que le gris est clair. Pour acher la matrice associe cette image, il sut de taper dans la console de Scilab, linstruction : imread(nom du chier) Le nom du chier est entre apostrophes, on crit tout le chemin , sans oublier lextension. Par exemple, si limage sappelle Musiciens21x32-gris, sauvegarde au format png, dans le dossier Photos, lui-mme sur une cl USB, cette cl tant connecte au port E de lordinateur, en crivant : G=imread(E :\Photos\Musiciens21x32-gris.png), on obtient une matrice G de 21 lignes et 32 colonnes.

Images numriques matricielles en SCILAB

2. Visualisation et sauvegarde de limage associe une matrice : fonctions imshow et imwrite Il sagit, tant donne une matrice, de faire acher limage correspondante, ou/et de lenregistrer. (a) Cration dune matrice dimage Nous cherchons raliser une image constitue de bandes verticales allant du noir (0) au blanc (255), en passant par les 256 nuances de gris possibles. Pour cela, nous allons crire une matrice constitue de colonnes de 0, colonnes de 1, colonnes de 2, etc..., reprsentant la largeur (en pixels) dune bande. De faon pouvoir utiliser des paramtres (la hauteur h de limage, la largeur des bandes verticales), nous allons utiliser une fonction ; voici ci-dessous pour commencer un exemple de fonction lmentaire (qui na rien voir avec le traitement dimages, cest juste pour montrer comment on programme une fonction) : En crivant et en excutant le petit programme ci contre, puis en tapant ensuite la commande f (4), on obtient ans=3 , cest--dire limage de 4 par f . function y=f(x) y=x2-5*x+1 endfunction

Voyons maintenant comment crer notre image de bandes verticales. crire le programme ci-contre dans Scinotes : degrade est le nom que nous avons dcid de donner la fonction, h dsigne le nombre de lignes de la matrice, et la largeur (en pixels) dune bande verticale. La matrice, que nous avons dcid de nommer res, aura donc 256 colonnes ; res(i,j) est le terme correspondant la ligne i et la colonne j de cette matrice. function res=degrade(h, ) for i=1 :h for j = 1 :256* res(i,j)=oor((j-1)/ )) end end endfunction

Aprs avoir enregistr ce programme et lavoir excut, (soit depuis SciNotes, soit aprs lavoir Copi/Coll dans la console), en tapant (dans la console) : degrade(60,2), on obtient une matrice de hauteur 60, constitue de deux colonnes avec des 0, deux colonnes avec des 1, etc... Les nombres entiers sont crits avec un point, ce qui signie quils sont reconnus au format double (voir explications complmentaires sur les formats p.4), et crits ainsi le logiciel ne reconnat pas quil sagit dune matrice dimage. Pour que Scilab reconnaisse que la matrice est une matrice dimage, nous allons transformer les nombres en lments de Z/256Z, en utilisant la fonction uint8. Pour faciliter la suite nous donnons un nom (Mire) cette matrice : Mire = uint8(degrade(60,2)). (b) Visualisation de limage : fonction imshow Pour visualiser limage associe cette matrice, on utilise la fonction imshow, en mettant en argument le nom de la matrice. En tapant (dans la console) linstruction : imshow(Mire), on obtient limage ci-dessous, qui apparat dans une nouvelle fentre :

(c) Enregistrement de limage : fonction imwrite La fonction imshow permet de voir limage mais ne lenregistre pas ; pour la sauvegarder, on utilise la fonction imwrite : comme premier argument, le nom de la matrice, et comme deuxime argument, entre apostrophes, le nom que lon souhaite donner limage, avec tout le chemin, sans oublier lextension. Par exemple pour une sauvegarde sur une cl connecte au port E, sous le nom de chier Essai, on tape : imwrite(Mire,E :\Essai). La rponse ans=1 dans la console signie que la sauvegarde a t faite.

B-

Images en couleur

Lorque lon prend une photo avec un appareil numrique, ayant par exemple deux millions de pixels, cela signie quil comporte deux millions de capteurs ; chaque capteur mesure les quantits de lumire rouge, de lumire verte et de lumire bleue reues, et les enregistre sous forme de nombres : ainsi chaque capteur est IREM DE BESANON - avril 2012

Images numriques matricielles en SCILAB

associ un triplet (R,V,B) de nombres entiers compris entre 0 et 255, et une image en couleur sont associes trois matrices (la premire pour le rouge, la deuxime pour le vert et la dernire pour le bleu). Chaque matrice comporte, dans ce cas, deux millions de termes. Nous appellerons hypermatrice cet ensemble de trois matrices. Les fonctions imread, imshow et imwrite sutilisent avec les images en couleur comme avec les images en niveaux de gris. 1. Lecture de lhypermatrice dune image La photo des Musiciens , avant sa transformation en niveaux de gris, tait en couleur..., constitue de 21 32 pixels, chaque pixel tant un petit carr de couleur. Avec linstruction imread, on obtient 3 matrices, chacune comportant 21 lignes et 32 colonnes, notes respectivement ( :, :,1), ( :, :,2) et ( :, :,3) dans la console. Ces matrices donnent, pour lensemble des pixels, les valeurs de Rouge (matrice ( :, :,1)) , de Vert (matrice ( :, :,2)) et de Bleu (matrice ( :, :,3)). 2. criture de lhypermatrice dune image On cherche ici raliser un damier alternant des pixels rouges, ayant pour coordonnes RVB : (255,0,0), et des pixels verts, ayant pour coordonnes RVB : (0,255,0). La matrice du rouge est donc une alternance de 255 et de 0, celle du vert de 0 et de 255, celle du bleu ne contient que des 0. Les paramtres m et n reprsentent respectivement le nombre de lignes et le nombre de colonnes du damier. function res=damier(m,n) for i=1 :m for j = 1 :n if oor((i+j)/2)=(i+j)/2 res(i,j,1)=255 res(i,j,2)=0 else res(i,j,1)=0 res(i,j,2)=255 end res(i,j,3)=0 end end res=uint8(res) endfunction

then

Avec damier(100,80), et lutilisation de la fonction imshow, on obtient le damier ci-dessous :

Remarque : en achant ce document en pdf une chelle proche de 100%, mais dirente de 100%, on fait apparatre des eets de moirs assez jolis.

IREM DE BESANON - avril 2012

Images numriques matricielles en SCILAB

III -

TRANSFORMATIONS DIMAGES

Nous allons maintenant transformer des images en travaillant directement sur les matrices associes. On peut intervenir sur la valeur numrique des pixels (pour claircir limage, accentuer les contrastes, etc. . .), ou bien sur la localisation des pixels (pour eectuer des transformations comme des symtries, des rotations, ou encore la transformation du Photomaton ). Le temps mis pour eectuer ces programmes peut tre assez long, cest pourquoi les exemples que nous prsentons sont avec des images en niveaux de gris.

A-

Intervenir sur la valeur numrique des pixels

1. Format uint8 et format double Par dfaut, Scilab crit les nombres au format double (sur 64 bits). Pour crire les lments des matrices dimages qui sont des nombres entiers compris entre 0 et 255, cest--dire les reprsentants compris entre 0 et 255 des lments de Z/256Z, on a utilis le format uint8 (sur 8 bits). En ralit, la matrice est galement reconnue par Scilab comme une matrice dimages si ses lments sont des nombres compris entre 0 et 1, crits au format double . Nous avons fait ce choix du format uint8 dune part parce que lorsque lon lit (avec la fonction imread ) la matrice dune image, cest dans le format uint8 quelle est ache ; et dautre part parce que cela nous parat prfrable pour comprendre laspect discret du codage des couleurs. Dans ce qui suit, nous allons utiliser des fonctions faisant intervenir des nombres autres que des entiers compris entre 0 et 255. Par exemple, supposons que lon veuille multiplier la valeur de tous les pixels par 0,7. Le nombre 0,7 est au format double , les nombres de la matrice au format uint8 ; dans ce cas, Scilab eectue les calculs en mettant tous les nombres au format uint8 , et alors 0,7 est remplac par 0. Par exemple, 0.7*78 donne ans=54.6, mais 0.7*uint8(78) donne ans=0. Il faudra donc tre attentif au type de nombre sur lesquels on travaille, et pour calculer k*M, on commencera par convertir la matrice en une matrice de nombres au format double , et on reviendra ensuite une matrice dimage avec la fonction uint8. 2. Transformations anes function res=ane(M,m,p) res=m*double(M)+p res=iunt8(res) imshow(res) endfunction

Linstruction M+p ajoute p chacun des lments de la matrice, et de mme k*M multiplie chaque lment de la matrice par k.

Un premier cas particulier est celui o limage est transfome en son ngatif : pour obtenir un tel eet, on transforme le blanc en noir, le noir en blanc, et tout niveau de gris x en 255 x. Linstruction ane(M,-1,255) permet dobtenir ce rsultat. Voici quelques exemples dimages transformes par des fonctions anes : M 255-M M+100 0,5*M+127 0,2*M+204

3. claircir ou foncer une image Nous cherchons claircir une image, et donc rapprocher les valeurs des niveaux de gris de 255. Une premire ide consisterait ajouter par exemple 100, mais alors toute valeur suprieure 156, deviendrait dans Z/256Z, une valeur comprise entre 0 et 100, et ainsi les parties les plus claires de limage deviendraient fonces (voir ci-dessus limage correpondant ce cas). Dautres fonctions anes conviennent, voir les exemples ci-dessus.

IREM DE BESANON - avril 2012

Images numriques matricielles en SCILAB

Essayons maintenant avec une fonction autre quune fonction ane de foncer une image. Pour foncer une image (et donc pour que les valeurs des pixels de limage transforme soit plus petites que celles x2 de limage initiale), on va utiliser la fonction f du second degr : f (x) = ; f transforme 0 en 0, 255 255 en 255, et pour les autres valeurs x de [0 ;255], on a bien f (x) < x.

Linstruction uint8((double(M).2)/255 permet dobtenir la matrice souhaite et le rsultat ci-contre

Dans ce cas, il faut faire attention ne pas confondre le produit matriciel avec un produit lment par lment : linstruction A*B correspond un produit matriciel, tandis que A.*B (avec un point avant le symbole dopration) est la matrice des produits des coecients A(i,j)*B(i,j).

B-

Intervenir sur la position des pixels


Le programme ci-contre correspond une symtrie daxe horizontal : la fonction SH envoie la premire ligne la dernire, etc.... La fonction size renvoie un vecteur qui donne le nombre de lignes et de colonnes de la matrice, T(1) est donc ici le nombre de lignes de M, et T(2) le nombre de colonnes. Le programme sadapte facilement pour une symtrie daxe vertical. On peut aussi aisment avoir une symtrie 45 en utilisant la matrice transpose (avec Scilab, la transpose de M se note M). Image initiale Symtrie horizontale function res=SH(M) T=size(M) for i=1 :T(1) for j = 1 :T(2) res(i,j)=M(T(1)-i+1,j) end end res=uint8(res) imshow(res) endfunction Transposition Symtrie verticale

1. Symtries axiales

2. Transformation Photomaton Cette transformation a la particularit magique quen la ritrant le nombre de fois ncessaires, on retrouve limage initiale. Elle est explique plus en dtail dans le diaporama intitul , consultable en ligne sur le site de lIREM de BESANON, et en particulier la magie y est rvle ! Rappelons ici brivement le principe : on dcoupe la matrice initiale en petits carrs de 2 2 (on travaille sur des matrices ayant un nombre pair de lignes (n) et un nombre pair de colonnes (m)), et la matrice darrive en quatre matrices ayant n/2 lignes et m/2 colonnes. Puis, on range les 4 lments de chaque petit carr ainsi :
1 2 3 4 5 6 1 A B A B 2 C D C D 3 4 1 3 5 1 A A 3 2 4 6 B B

2 C C 4

D D

Matrice initiale IREM DE BESANON - avril 2012

Matrice photomaton

Images numriques matricielles en SCILAB

Les lignes impaires de la matrice initiale se retrouvent donc dans la moiti suprieure de la matrice photomaton, les lignes paires dans la moiti infrieure. De mme les colonnes impaires se retrouvent dans la partie gauche, et les colonnes paires dans la partie droite. Ainsi, si on appelle x un lment se situant la ligne i et la ligne j de la matrice initiale. i+1 Si i est impair, x se retrouvera la ligne i = . 2 i+n . Si i est pair, x se retrouvera la ligne i = 2 On obtient des formules identiques pour exprimer la colonne o se retrouvera llment x. Voici ci-dessous un programme permettant dappliquer la tranformation Photomaton une matrice M, ainsi quun exemple de ce que lon peut obtenir. La fonction photomaton1 applique une fois la transformation la matrice M, et puis ache limage obtenue aprs transformation ; la fonction diaporama1 ritre cette mme transformation k fois en achant chaque tape les images obtenues (si lon choisit bien k, on revient limage initiale). Limage utilise ci-dessous est constitue de 128128 pixels, on revient limage initiale en 7 itrations. Les images cidessous correspondent ces itrations successives. Image initiale tape 1 tape 2 Programme pour une itration : function res=photomaton1(M) T=size(M) for i=1 :T(1)/2 for j = 1 :T(2)/2 if oor(i+1)/2==(i+1)/2 then l=(i+1)/2 else l=(i+T(1))/2 end if oor(j+1)/2==(j+1)/2 then c=(j+1)/2 else c=(j+T(2))/2 end res(l,c)=M(i,j) end end res=uint8(res) imshow(res) endfunction Programme pour k itrations : function res=diaporama1(M,k) for i = 1 :k M=photomaton1(M) end endfunction Nous proposons un autre programme, plus long dans lcriture du programme, mais plus rapide dans lexcution, ce qui peut tre intressant lorsque le nombre ditrations pour revenir limage initiale est lev, ou bien si lon veut adapter le programme pour une image en couleur.

tape 3

tape 4

tape 5

tape 6

tape 7

IREM DE BESANON - avril 2012

Images numriques matricielles en SCILAB

Programme pour une itration : Le principe est le suivant : Un lment x qui se trouve la ligne i de la matrice photomaton provient de la ligne i telle que : n Si i , i = 2i 1. 2 n Si i > , i = 2i n. 2 On a des formules identiques pour exprimer la colonne do provient llment x. La matrice res est remplie quart par quart dans lordre suivant : quart en haut gauche ; quart en bas gauche ; quart en haut droite ; quart en bas droite. Le programme ci-contre est donn pour une itration. Pour obtenir k itrations, reprendre le programme prcdent. Remarque : la distinction des 4 cas nest pas indispensable, on peut utiliser la formule plus synthtique : res(i,j)=M(2*i-1-(T(1)-1)*oor(2i/(T(1)+1)),2*j-1)-(T(2)1)*oor(2i/(T(2)+1)), mais lexcution du programme est plus longue. function res=photomaton2(M) T=size(M) for i=1 :T(1)/2 for j = 1 :T(2)/2 res(i,j)=M(2*i-1,2*j-1) end end for i=T(1)/2+1 :T(1) for j = 1 :T(2)/2 res(i,j)=M(2*(i-T(1)/2,2*j-1) end end for i=1 :T(1)/2 for j = 1+T(2)/2 :T(2) res(i,j)=M(2*i-1,2*(j-T(2)/2)) end end for i=T(1)/2+1 :T(1) for j = 1+T(2)/2 :T(2) res(i,j)=M(2*(i-T(1)/2,2*(j-T(2)/2)) end end res=uint8(res) imshow(res) endfunction

IREM DE BESANON - avril 2012