Sunteți pe pagina 1din 9

Laboratorul 1-2

Pachetul de procesare a imaginilor din Matlab

1. Scopul lucrarii
Lucrarea prezinta o scurta introducere in Pachetul de procesare a imaginilor din Matlab si operatii
simple de procesare a imaginii: negativare, inversare, trasarea histogramei si egalizarea ei.

2. Consideratii teoretice
Pachetul de procesare a imaginilor (Image Processing Toolbox - IPT) din Matlab este o colectie de
functii de prelucrare a tablourilor multidimensionale, un caz special al acestora fiind imaginile.
Aceste functii si expresivitatea limbajului Matlab fac multe operatii de procesare a imaginilor mai
usor de scris intr-o maniera compacta si clara.

2.1. Reprezentarea imaginilor digitale


O imagine este definita ca o functie bidimensionala f(x, y) unde x si y sunt coordonatele spatiale
(plane). Valoarea functiei f intr-un punct (x, y) reprezinta intensitatea imaginii in acel punct.
Termenul nivelul de gri este utilizat pentru a referi intensitatea imaginilor monocrome. Imaginile
color sunt formate dintr-o combinatie de imagini 2D individuale. De exemplu, in sistemul color
RGB imaginea este compusa din trei imagini individuale (rosu, verde si albastru). Din aceasta cauza
multe tehnici dezvoltate pentru imaginile monocrome pot fi extinse si la imaginile color prelucrand
cele trei componente individual.
Presupunem ca imaginea este un tablou de dimensiunea M x N. In majoritatea cartilor
originea imaginii este definita a fi (x, y) = (0, 0) si x variaza de la 0 la M-1, iar y de la 0 la N-1. In
cadrul IPT in loc de (x, y) se foloseste (r, c), adica randuri si coloane. Originea sistemului de
coordonate a imaginii este definita in (r, c) = (1, 1), si r variaza de la 1 la M, iar c de la 1 la N (vezi
Figura 1).
Uneori se utilizeaza in IPT coordonate spatiale, x pentru coloane si y pentru linii.

a. b.
Figura 1. Conventia de coordonate utilizata in multe carti de prelucrari de imagini (a) si in IPT(b)
L 1-2/1
2.2. Citirea imaginilor

Imaginile sunt citite în mediul Matlab utilizând funcţia imread, a carei sintaxă este:

imread ('numeFisier')

unde numeFisier este numele fisierului care contine imaginea, nume care poate include si calea
pana la fisierul imagine in cazul in care acesta nu se afla in directorul curent.

Formatele imaginilor acceptate de functie sunt:

De exemplu pentru a incarca imaginea cu orca vom da comanda:

>> f = imread('orca.gif');

Semnul ';' de la sfarsitul liniei de comanda suprima afisarea rezultatului. Daca acesta lipseste
valorile matricii corespunzatoare imaginii incarcate va fi afisata.

Functia size returneaza dimensiunile imaginii, adica numarul de linii si coloane:

>> size(f)

ans =

256 256

sau valorile returnate pot fi captate in doua variabile, de exemplu M si N:

[M, N]= size(f);

Informatii aditionale despre matrice pot fi obtinute cu whos:

>> whos f

Name Size Bytes Class


f 256x256 65536 uint8 array
Grand total is 65536 elements using 65536 bytes

2.3. Afisarea imaginilor digitale

imshow este functia care permite afisarea imaginilor:

L 1-2/2
>> imshow(f)

Functia are doua argumente:

imshow(f, G)

unde G reprezinta numarul nivelurilor de intensitate utilizare. Daca G este omis atunci valoarea
implicita este 256.

>> imshow(f, [min max])

vor fi afisate ca negru toate valorile mai mici sau egale cu min si ca alb toate valorile mai mari sau
egale cu max. Daca valorile min si max lipsesc:

>> imshow(f, [])

atunci valoarea minima existenta in imagine va fi setata la negru si valoarea maxima din imagine va
fi setata la alb. Altfel spus va face o redefinire a nuantelor de gri ceea ce va duce la imbunatatirea
imaginii respective.

Daca imaginea are o dimensiune prea mare pentru a putea fi afisata se foloseste argumentul
'notruesize' pentru a afisa o imagine de dimensiuni mai reduse:
>> f=imread('einstein.tif');
>> imshow(f, 'notruesize')
sau
>> f=imread('einstein.tif');
>> imshow(f, [], 'notruesize')

L 1-2/3
Functia pixval este utilizata frecvent pentru a afisa valorile intensitatii pixelilor in mod
interactiv. Un cursor este afisat peste imagine si coordonatele lui si valoarea intensitatii in punctul
respectiv sunt afisate sub figura.

>> pixval

Afisarea unei alte figuri intr-o alta fereastra se realizeaza utilizand comanda figure:

>> f = imread('orca.gif');
>> g=imread('bubbles.tif');
>> imshow(f), figure, imshow(g, 'notruesize')

2.4. Salvarea imaginilor

Salvarea imaginilor intr-un fisier se realizeaza cu ajutorul functiei imwrite:

imwrite(f, 'numeFisier');

Pentru fisierele JPEG se poate preciza calitatea compresiei:

imwrite(f,'test2.jpg','quality', q);

unde q are valori intre 0 si 100. Cu cat q este mai mic cu atat degradarea imaginii datorita
compresiei este mai mare.

Functia imfinfo ne permite sa vedem caracteristicile fisierului imagine:

>> imfinfo test2.jpg

L 1-2/4
2.5. Tipuri de date utilizate in imagini si conversii posibile

Toate operatiile se efectueaza utilizand tipul double. Tipul uint8 este de asemenea des
folosit. Ceva mai rar sunt folosite si tipul logical si uint16.

Pentru tipul uint8 valorile intensitatii (nuantei de gri) sunt in intervalul [0, 255], pentru
uint16 sunt in intervalul [0, 65635]. Daca se foloseste tipul double se considera valorile distribuite
in intervalul [0, 1].
O imagine binara este un tablou logic. Matricea trebuie convertita la tipul logical:

>> B = logical(A)

Conversia de la un tip de data la altul se face folosind numele tipului ca nume de functie:

>> B = double(A) %conversie la double

IPT ofera functii care permit conversii intre tipurile de imagini:

De exemplu trecerea de la o imagine cu valori de tip double la una cu valori de tip uint8:

>> g = im2uint8(f)

Sau trecerea de la double la double scalat la [0, 1]:

>> g = mat2gray(f, [min, max])

L 1-2/5
unde toate valorile sub min vor fi setate la 0(negru) si cele mai mari ca max vor fi setate la 1 (alb).
Daca acestea lipsesc valoarea cea mai mica din imagine va fi setata la 0 si cea mai mare la 1.

2.6. Operatii simple asupra imaginii

Imaginea in oglinda fata de orizontala se obtine afisand randurile matricei in ordine inversa:

>> g = imread('rose-original.tif');
>> imshow(g, 'notruesize');
>> f=g(end:-1:1, :); %pune liniile in ordine inversa
>> figure,imshow(f, 'notruesize');

Daca mai adaugam comanda:

>> h = g(257:768, 257:768);


>> figure,imshow(h);

vom obtine doar o parte a imaginii.

O imagine micsorata obtinem renuntand tot la a doua linie si coloana:

>> hg = g(1:2:end, 1:2:end);


>> figure,imshow(hg);

Afisarea valorilor de-a lungul unei linii (rand):

>> plot(g(512, :))

L 1-2/6
2.7. Imbunatatirea contrastului

Functia imadjust este o functie de baza a IPT:

imadjust(f, [min_in max_in], [min_out max_out], gamma);

si redefineste valorile din imaginea f la noi valori in g astfel incat valorile dintre min_in si max_in
le ajusteaza la intervalul [min_out max_out]. Toate valorile mai mici decat min_in le converteste la
min_out si valorile mai mari de max_in le converteste la max_out. Valoarea implicita pentru min
este 0 si pentru max este 1. Parametru gamma defineste forma curbei de redefinire. Daca gamma <1
atunci vor fi mai multe valori mari (nuante deschise), daca gamma > 1 atunci se indesesc nuantele
inchise si daca gamma = 1 atunci are loc o transformare liniara. Daca gamma lipseste valoarea lui
implicita este 1.

>> f=imread('orca.gif');
>> g=imadjust(f, [0 1], [1 0]); % realizeaza negativarea imaginii
>> figure,imshow(f), title('original');
>> figure,imshow(g), title('imadjust');

Negativarea se putea realiza si astfel:

>> g=imcomplement(f);

Expandarea valorilor din domeniul [0.1 0.6] la tot domeniu [0, 1]:

>> f=imread('pollen.tif');
>> g2=imadjust(f, [0.1 0.6], [0 1]);
>> figure,imshow(f), title('original');
>> figure,imshow(g2), title('imadjust');

O imbunatatire mai buna a contrastului se obtine pentru:

>> g3=imadjust(f, [0 0.4], [0 1]);

Utilizarea argumentului gamma:

>> g4=imadjust(f, [], [], 0.5);

Redefinirea logaritmica:

>> c=1;
>> g=c*log(1+double(f));
>> gs=im2uint8(mat2gray(g));
>> figure,imshow(gs), title('transformare log);

2.8. Histograma

Afisarea histogramei unei imagini:

imhist(f, b);

L 1-2/7
unde f este imaginea si b este numarul grupurilor de valori pentru care se calculeaza histograma.
Implicit se considera ca b este 256, daca b lipseste.

>> f=imread('pollen.tif');
>> figure, imhist(f), title('histograma originala');

Histograma poate fi afisata ca un grafic de bare folosind functia:

bar(horiz, v, width)

unde v este un vector linie care contine punctele in care se vor trasa barele, horiz este un vector de
aceeasi dimensiune cu v care contine incrementarile pe orizontala, width este un numar intre 0 si 1
(la 0 barele sunt simple linii, la 1 barele se ating). Implicit este setat la 0,8.

>> f=imread('pollen.tif');
>> h= imhist(f);
>> h1=h(1:10:256);
>> horiz=1:10:256;
>> bar(horiz, h1)
>> axis([0 255 0 15000]);
>> set(gca, 'xtick', 0:50:255);
>> set(gca, 'ytick', 0:2000:15000);
>> xlabel('intensitate');
>> ylabel('nr de pixeli');
>> title('histograma originala');

Alta reprezentare a histogramei:

>> f=imread('pollen.tif');
>> h= imhist(f);
>> h1=h(1:10:256);
>> horiz=1:10:256;
>> stem(horiz, h1, 'fill')
>> axis([0 255 0 15000]);
>> set(gca, 'xtick', 0:50:255);
>> set(gca, 'ytick', 0:2000:15000);
>> xlabel('intensitate');
>> ylabel('nr de pixeli');
>> title('histograma originala');

sau

>> f=imread('pollen.tif');
>> h= imhist(f);
>> plot(h);
>> axis([0 255 0 15000]);
>> set(gca, 'xtick', 0:50:255);
>> set(gca, 'ytick', 0:2000:15000);
>> xlabel('intensitate');
>> ylabel('nr de pixeli');
>> title('histograma originala');

L 1-2/8
2.9. Egalizarea histogramei

Egalizarea histogramei unei imagini:

histeq(f, nlev);

unde f este imaginea si nlev este numarul valorilor de gri pentru noua imagine. Implicit se considera
ca nlev este 64, daca nlev lipseste.

>> f=imread('pollen.tif');
>> imshow(f);
>> figure, imhist(f);
>> ylim('auto');
>> title('histograma originala');
>> g=histeq(f, 256);
>> figure, imshow(g);
>> figure, imhist(g);
>> ylim('auto');
>> title('histograma egalizata');

3. Aplicatii

1. Implementati toate secventele de program prezentate mai sus si comparati rezultatele voastre
cu cele din lucrare.
2. Incarcati imaginea abdomen.gif . Care sunt dimensiunile imaginii? Afisati imaginea.
3. Micsorati imaginea anterioara la jumatate si apoi inversati-o fata de axa y.
4. Ce tip de date este utilizat? Convertiti-l la double.
5. Calculati si afisati histograma imaginii abdomen.gif, folosind functia imhist si ca un grafic
de bare si comparati-le.
6. Calculati si afisati imaginea rezultata din egalizarea histogramei imaginii abdomen.gif . Ce
observati?
7. Calculati si afisati imaginea rezultata din egalizarea histogramei imaginii chest-xray.tif .
Comparati-o cu imaginea originala. Comparati histogramele.
8. Calculati si afisati imaginea rezultata din egalizarea histogramei imaginii einstein.tif .
Comparati-o cu imaginea originala. Comparati histogramele.
9. Implementati algoritmul de egalizare al histogramei in Matlab.

L 1-2/9

S-ar putea să vă placă și