Documente Academic
Documente Profesional
Documente Cultură
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.
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.
>> 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.
>> size(f)
ans =
256 256
>> whos f
L 1-2/2
>> imshow(f)
imshow(f, G)
unde G reprezinta numarul nivelurilor de intensitate utilizare. Daca G este omis atunci valoarea
implicita este 256.
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:
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')
imwrite(f, 'numeFisier');
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.
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:
De exemplu trecerea de la o imagine cu valori de tip double la una cu valori de tip uint8:
>> g = im2uint8(f)
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.
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');
L 1-2/6
2.7. Imbunatatirea contrastului
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');
>> 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');
Redefinirea logaritmica:
>> c=1;
>> g=c*log(1+double(f));
>> gs=im2uint8(mat2gray(g));
>> figure,imshow(gs), title('transformare log);
2.8. Histograma
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');
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');
>> 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
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