Wyrownanie histogramu


Wyrównywanie histogramu  Mateusz Kyc  mnemos@op.pl
Wyrównywanie histogramu
sprawozdanie pierwsze z przedmiotu analiza i przetwarzanie obrazów
Mateusz Kyc
mnemos@op.pl
marzec 2006
Spis treści:
1. Wstęp
2. Teoria
3. Kod programu
4. Omówienie kodu
5. Podsumowanie
Wyrównywanie histogramu  Mateusz Kyc  mnemos@op.pl
1. Wstęp
Celem sprawozdania jest przedstawienie działania napisanego przez siebie programu do
wrównywania histogramu.
2. Teoria
Wyrównanie histogramu ma na celu doprowadzenie do równomiernego rozłożenia wartości
jasności w jego przedziałach. W rezultacie wszystkie słupki histogramu po wyrównaniu mają
wysokość równa wartości średniej jasności pikseli. Dzięki operacji wyrównywania histogramu
otrzymujemy obraz o wyższej dynamice. Wyrównywanie histogramu jest wykorzystywane przy
poprawianiu ostrości zdjęć.
Wyrównanie histogramu jest operacją punktową F[] przekształcającą obraz wejściowy
u(n1,n2) w obraz wyjściowy y(n1,n2) w następujący sposób:
y(n1,n2) = F [u(n1,n2)] .
gdzie
u
F śąuźą= H śą x źą
"
x=0
a H(x) są wartościami histogramu obrazu wejściowego H(u).
Po zastosowaniu operacji wyrównania histogramu w obrazie wyjściowym y ilości próbek są
podobne w poszczególnych podprzedziałach zakresu [0,255].
Wyrównywanie histogramu  Mateusz Kyc  mnemos@op.pl
3. Kod programu
#include
#include
int ile=256;
int poziomy;
int *h;
int *d;
FILE *plik, *plik2; //plik wejsciowy czyli obrazek;
int main(int argc, char **argv) { //glowny main
if(argc > 1) { //glowny if programu
int szer, wys;
int miejsc_po;
int i, j, temp, hsum=0;
gray **obraz, **wynik, max;
int wspolcz;
//dynamiczne deklaracja tablic
h = (int *)malloc(ile*sizeof(int));
d = (int *)malloc(ile*sizeof(int));
//otwieram plik
plik = fopen(argv[1], "r");
plik2 = fopen(argv[2], "w");
for(i=0; ih[i] = 0;
//i go czytam
obraz = pgm_readpgm(plik, &szer, &wys, &max);
wynik = pgm_allocarray(szer, wys);
//od razu liczac histogram dla obrazka wejsciowego
for(i=0; ifor(j=0; jh[obraz[j][i]]++;
}
}
Wyrównywanie histogramu  Mateusz Kyc  mnemos@op.pl
//teraz licze sobie dokladne podzialy barw dla konkretnej ilosci poziomow szarosci
if(argc == 4) { //zeby domyslnie tylko wyrownywal histogram
poziomy = atoi(argv[3]);
}
else {
poziomy = 256;
}
int *p, *p2;
p = (int *)malloc(poziomy*sizeof(int)); // to moje dwie tablice pomocnicze dla ustalenia
przedzialow kolorow
p2 = (int *)malloc(poziomy*sizeof(int));
float mnoznik = 255.0 / (poziomy-1);
p[0] = 0;
for(i=1; ip[i] = i*mnoznik;
}
p[poziomy-1] = 255;
mnoznik = 255.0 / poziomy;
p2[0] = 0;
for(i=1; ip2[i] = i*mnoznik;
}
//teraz licze dystrybuante
d[0] = h[0];
for(i=1; id[i] = d[i-1] + h[i];
}
//i normalizuje
for(i=0; id[i] = (d[i]*256) / (wys*szer);
}
//od razu zmieniajac ja na taka jaka powinna byc dla mojej palety barw
for(i=0; i<256; i++) {
for(j=0; jif(d[i] >= p2[j]) {
temp = p[j];
}
}
d[i] = temp;
}
Wyrównywanie histogramu  Mateusz Kyc  mnemos@op.pl
//i w obrazie wynikowym obrazie zapisuje zmieniajac wartosci z pierwotnych na
przetransponowane z pomoca dystrybuanty
for(i=0; ifor(j=0; jwynik[i][j] = d[obraz[i][j]];
}
pgm_writepgm(plik2, wynik, szer, wys, max, 0);
pgm_freearray(wynik, wys);
fclose(plik); //zamykam pliki
fclose(plik2);
} //do glownego ifa
else {
printf("wywolanie programu to: %s plik_wejsciowy.pgm plik_wyjsciowy.pgm
[ilosc_poziomow_szarosci]\n", argv[0]);
}
return 0;
}
3. Omówienie kodu
W powyższym kodzie znajdują się dokładne opisy więc nie będę po raz kolejny rozpisywał
się co po kolei się dzieje. Zaznacze jednak kilka istotnych fragmentów.
Po pierwsze. Poniżej lini:
// to moje dwie tablice pomocnicze dla ustalenia przedzialow kolorow
znajduje się kruciutki fragment gdzie są obliczane kolejne wartości przedziałów i kolorów jakie
powinny się w nich znajdować. Muszę tu koniecznie zaznaczyć, że ten konkretny fragment kodu
decyduje o rozkładzie poziomów szarości i nie jestem do końca pewien w jaki sposób jest to
realizowany zazwyczaj. Można to zaobserwować porównując wyniki działania mojego programu i
np. wykonujac te operacje programem Gimp:
Wyrównywanie histogramu  Mateusz Kyc  mnemos@op.pl
Zróbmy doświadczenie.
rysunek wejściowy...
rysunek z domyślnym wyrównaniem histogramu moim programem...
którego skale poziomów szarości zmniejszymy do trzech programem Gimp...
Wyrównywanie histogramu  Mateusz Kyc  mnemos@op.pl
a teraz to samo tylko zrobione moim programem...
No i mam problem. Kto ma racje? Ja czy Gimp? Jak powinien wygladac tak naprawde ten obraz po
zmniejszeniu jego poziomow szarości? Ale sprawdzmy jeszcze histogramy.
histogram z obrazu przetworzonego gimpem...
oraz histogram z obrazka wyjsciowego mojego programu...
Triumf. Z dwóch powyższych histogramów wynika jasno że wykonanie tej samej operacji
moim programem daje lepsze wyniki ponieważ wartości wszystkich trzech słupków są bliższe
wartości średniej od tych z pierwszego histogramu.
5. Podsumowanie
W programie istnieje mozliwość zarówno wykonania zwyczajnego wyrównania histogramu
jak i zmniejszenia ilosci poziomów szarości.


Wyszukiwarka

Podobne podstrony:
Histogram basedsegmentationofquantumimages
ROZDZIAŁ XII Wyrównanie sieci II klasy
Histogram Przemysław Oziemblewski
PO002 histogram
Zajęcia wyrównawcze
cw 5 wyrównoważanie
HistogramDialog
Operacje na histogramie
[ĆW 3] Wyrównanie sieci poziomej sprawozdanie
Zajęcia korekcyjno wyrównawcze
fizyka kurs wyrownawczy
ROZDZIAŁ XX Pomiar i wyrównanie poziomej osnowy III klasy m
Proste krawędzie bez dużej wyrówniarki

więcej podobnych podstron