Documente Academic
Documente Profesional
Documente Cultură
imaginii
Pentru o imagine f de M N pixeli si L nivele de gri, histograma este
definita (2.10)
ca probabilitatea (frecventa relativa) de aparitie n imagine a diferitelor
nivele de gri
posibile.
h(i) = 1
MN
M1
m=0
N1
n=0
h(i) = 1.
Din punct de vedere practic, calculul histogramei unei imagini nseamna
parcurgerea
punct cu punct a imaginii si contorizarea numarului de nivele de gri
ntlnite. Presupunnd
L nivele de gri posibile n imaginea de dimensiuni NRLIN si NRCOL, codul
26
urmator aloca pentru fiecare nivel de gri posibil cte un unsigned int, ce va
contoriza
numarul de aparitii ale nivelului de gri respectiv. Pentru fiecare punct al
imaginii se
incrementeaza pozitia din histograma ce corespunde valorii de gri din acel
pixel. Ceea
ce rezulta n final difera de histograma descrisa de (2.10) prin constanta
de normare
numarul total de puncte ale imaginii (deci MN sau NRLIN*NRCOL); este
evident ca
valorile obtinute pot fi normate pentru a obtine o functie de densitate de
probabilitate
prin mpartirea cu NRLIN*NRCOL si definirea histogramei ca fiind formata
din real sau
float.
histo=(unsigned int*)malloc(L*sizeof (unsigned int));
for (i=0;i<L;i++)
histo[i]=0;
for (i=0;i<NRLIN;i++)
for (j=0;j<NRCOL;j++)
histo[imagine[i][j]]++;
n Matlab, implementarea oricarei functii este cu att mai eficienta (din
punctul de vedere
al timpului de rulare) cu ct sunt evitate structurile repetitive (n particular
buclele for).
Cum, pentru calculul histogramei, ciclarea nu poate fi evitata (deci trebuie
parcurse fie
toate punctele imaginii, fie toate nivelele de gri), se alege varianta care
implica repetarea
minima a ciclarii:
histo=zeros(1,L);
for i=1:L
p=find(imagine==i);
histo(i)=length(p);
% histo(i)=length(p)/prod(size(imagine));
end
Functia find (functie standard a pachetului Matlab) returneaza pozitiile
(indicii) la care
este gasita valoarea i nmatricea imagine (adica ntoarce pozitiile
punctelor ce au valoarea
i); numarnd aceste puncte (deci calculnd lungimea vectorului n care sunt
stocate) se
gaseste numarul de puncte ce au respectivul nivel de gri. Normarea
histogramei se poate
face fara a modifica declaratiile de definire a structurilor (pentru Matlab
este indiferent
daca se stocheaza ntregi sau numere cu parte zecimala). Acesta
structura estemai rapida
dect cea prin care se parcurgea toata imaginea deoarece se foloseste o
singura bucla de
lungime L (si nu doua bucle imbricate, de lungime totala NRLIN*NRCOL),
iar functia
find este rapida, fiind o functie precompilata.
Histograma imaginii ofera informatii asupra plasamentului n nuanta a
continutului
imaginii (vezi figura 2.8). La majoritatea imaginilor exista o distributie
neuniforma a
nivelelor de gri; exista nivele de gri predominante si exista nivele de gri
folosite putin sau
27
|x=g1(y)
Daca dorim ca functia de densitate de probabilitate fY (y) sa fie uniforma
(n conditiile
n care functia de densitate de probabilitate fX(x) este data), atunci
nseamna ca vom
avea
(g1(y))
=1
kfX (g1(y)). Rezolvarea acestei ecuatii produce solutia y = g(x) =
x
fX(t)dt.
Pentru cazul particular al imaginilor, variabila aleatoare X ia valori naturale nivelele
de gri. Functia de densitate de probabilitate fX(x) este histograma
[normata] a imaginii
iar functia de transformare devine y = g(x) =
x
0
28
histograma cumulativa a imaginii; daca h este histograma imaginii, atunci
g(x) = H(x) =
x
i=0
h(i) (2.11)
Valorile functiei trebuie nsa redistribuite n intervalul permis de valori de
gri, ceea ce
duce la deducerea formulei care exprima noile valori de gri:
v=
H(u) H(0)
MN H(0)
(L 1) + 0.5
(2.12)
O varianta de cod care realizeaza egalizarea de histograma este
prezentata n continuare.
Trebuie remarcat ca modul de calcul al histogramei cumulative este de tip
iterativ,
bazndu-se pe formula H(x) = H(x 1) + h(x), ce se poate deduce imediat
din (2.11).
Mai trebuie de asemenea remarcat ca se foloseste o histograma
nenormata.
gri_nou=(unsigned int *) malloc (L*sizeof(unsigned int));
histo_cum=(unsigned int *) malloc (L*sizeof(unsigned int));
tot=NRLIN*NRCOL;
histo_cum[0]=histo[0];
for (i=1;i<L;i++)
histo_cum[i]=histo_cum[i-1]+histo[i];
for (i=0;i<L;i++)
gri_nou[i]=round((histo_cum[i]-histo_cum[0])*(L-1)/(tot-histo_cum[0]));
Figurile urmatoare prezinta o imagine originala (lena) si rezultatul
egalizarii de histogram
a, precum si histogramele originale si egalizate (figura 2.9). Ceea ce se
remarca
cu usurinta este diferenta dintre histograma obtinuta si histograma
perfect uniforma
dorita. Unul dintre efectele secundare notabile este introducerea de nivele
de gri lipsa n
histograma egalizata (aspectul n pieptene al acesteia).
Imagine originala Imagine dupa egalizarea de histograma
29
0 50 100 150 200 250 300
0
200
400
600
800