5.18. Histogrami i statistika¶
Uz operacije koje mijenjaju piksele slike, klasa Image nosi obitelj metoda koje ih mjere – sažimaju distribuciju vrijednosti piksela, vraćaju srednju i medijalnu svjetlinu, pronalaze optimalnu granicu između tamnih i svijetlih piksela te izvještavaju o rasponu kanala boje. Mjerenja napajaju aplikacije na dva načina: kao ulazi u kod koji odlučuje koji prag koristiti, koje pojačanje postaviti i kako izgleda tonalni profil scene; te kao dijagnostički signali – „je li scena dovoljno svijetla?” – na koje aplikacija može reagirati bez donošenja odluke o bilo kojem pojedinom pikselu.
Polazna točka za gotovo svako mjerenje jest histogram.
5.18.1. Histogram¶
Histogram slike je brojač koliko piksela ima svaku moguću vrijednost svjetline. Za sliku u sivim tonovima to je popis brojeva indeksiranih vrijednostima od 0 do 255. Za sliku u boji to su tri takva popisa – jedan po kanalu.
get_histogram() ga izračunava:
h = img.get_histogram()
Vraćeni objekt je rezultat tipa histogram koji izlaže popise spremnika po kanalu te nekoliko visokorazinskih upita nad njima. Brojevi u spremnicima su normalizirani tako da im je zbroj 1.0 – histogram opisuje profil distribucije, a ne apsolutni broj piksela, što čini mjerenja usporedivima među slikama različitih veličina.
Za slike u sivim tonovima histogram ima jedan kanal spremnika, dostupan kao h.bins() (ili ekvivalentno h[0]). Za RGB565 slike histogram se izračunava u prostoru boja LAB predstavljenom na stranici o binarnom pragovanju, s tri kanala spremnika dostupna kao h.l_bins(), h.a_bins(), h.b_bins() (ili h[0], h[1], h[2]). LAB je isti odabir koji koriste metode pragovanja i praćenja; histogrami se slažu s pragovima oko toga u kojem se prostoru boja mjeri.
5.18.2. Spremnici i broj spremnika¶
Zadani histogram ima jedan spremnik po mogućoj vrijednosti piksela – 256 spremnika za 8-bitni kanal. Ponekad je to finija razlučivost nego što aplikacija treba. Klasifikatoru koji mari samo za grubi profil distribucije bolje može poslužiti manji broj spremnika – 32 ili čak 8 spremnika – koji se i brže izvodi i daje čistiji rezultat naspram šuma. Ključna riječ bins (te l_bins, a_bins, b_bins po kanalu za boju) postavlja broj:
h = img.get_histogram(bins=32)
Određivanje opsega putem ROI i praga radi na isti način kao i kod svake druge metode mjerenja. Proslijedite roi da ograničite histogram na pravokutnik piksela; proslijedite popis thresholds da uključite samo piksele koji odgovaraju tim rasponima. Oblik s pragom je ono što čini „izračunaj histogram samo odgovarajućih piksela” operacijom u jednom pozivu – uobičajen obrazac kada aplikacija želi okarakterizirati teksturu već detektiranog područja bez potrebe da sama prolazi kroz piksele.
Histogram u sivim tonovima s tri preklopljena sažeta mjerenja: Otsuov prag (granica koja najbolje razdvaja tamne i svijetle skupine), srednja vrijednost i medijan. Svako mjerenje govori nešto drugačije o istoj distribuciji.¶
5.18.3. Statistika¶
Histogram je opis učestalosti svake vrijednosti; statistika su numerički sažeci izvedeni iz njega. Objekt statistics koji vraća get_statistics() nosi standardni skup:
mean– aritmetička srednja vrijednost piksela.median– vrijednost ispod koje leži polovica piksela.mode– najčešća pojedinačna vrijednost.stdev– standardna devijacija, mjera raspona oko srednje vrijednosti.minimax– prisutne najsvjetlije i najtamnije vrijednosti piksela.lqiuq– granice donjeg i gornjeg kvartila.
Za RGB565 sliku oblici po kanalu (l_mean, a_median, b_mode i tako dalje) isporučuju ista mjerenja kanal po kanal.
Većina tih brojeva pojavljuje se u specifičnim kontekstima. mean i stdev zajedno daju procjenu šuma: scena koja bi trebala biti ujednačena ima malu stdev, dok šuman senzor istoj sceni daje veću stdev. min i max daju kontrast slike: što su bliži, scena je ravnija; što su udaljeniji, više dinamičkog raspona algoritam ima na raspolaganju. median je robusno središte kada distribucija ima netipične vrijednosti (nekoliko vrlo svijetlih piksela ne pomiče medijan kako pomiču srednju vrijednost). mode je pojedinačna najčešća vrijednost, korisna za pronalaženje razine pozadine slike čija pozadina pokriva većinu piksela.
get_statistics() interno pokreće prolaz histograma i potom ga sažima; prosljeđivanje istih argumenata thresholds i roi kao kod prethodno izračunatog histograma daje statistiku za isti skup piksela.
5.18.4. Percentili i CDF pretraživanja¶
Objekt histogram izlaže metodu get_percentile() koja pretvara udio u vrijednost piksela – vrijednost ispod koje leži zatraženi udio piksela. h.get_percentile(0.5) je medijan; h.get_percentile(0.05) i h.get_percentile(0.95) zajedno daju robusni min/max koji zanemaruje donjih i gornjih 5% kao netipične vrijednosti.
To je oblik koji aplikacija koristi kada želi okarakterizirati raspon vrijednosti piksela bez da šačica zalutalih svijetlih ili tamnih piksela iskrivi odgovor. Robusni min/max iz 5. i 95. percentila ujedno je prirodan ulaz za prolaz rastezanja kontrasta – preslikavanje po pikselu koje obrađuje stranica Tonske korekcije.
5.18.5. Otsuova metoda¶
Histogrami odgovaraju na još jedno pitanje vrijedno zasebnog isticanja: za sliku čiji se pikseli razdvajaju u „tamnu” i „svijetlu” skupinu, koja je granica između njih? Stranica o pragovanju već je imenovala mehanizam po njegovu rezultatu – jedinstveni globalni prag koji aplikacija može predati metodi binary() – ali je odgodila kako. To kako jest Otsuova metoda, a živi na histogramu.
Intuicija: slika s jasnim prednjim planom i pozadinom ima dvije skupine u svom histogramu svjetline, s dolinom između njih. Pravo mjesto za pragovanje je dno doline – vrijednost gdje su dvije skupine najbolje razdvojene. Otsuova metoda pretražuje svaku moguću granicu i bira onu gdje su varijance unutar skupina najmanje (što je isto kao reći da je varijanca između skupina najveća), a rezultat je optimalna binarna podjela za distribuciju te konkretne slike.
Objekt histogram izlaže Otsu putem get_threshold:
h = img.get_histogram()
t = h.get_threshold()
Vraćeni objekt threshold ima atribute value (za sive tonove) ili l_value / a_value / b_value (za boju) koji nose odabranu granicu. Vraćanje rezultata izravno natrag u binary() daje samoutirajući globalni prag čiju granicu bira sama slika:
img.binary([(t.value, 255)])
Taj obrazac ne rješava problem neravnomjernog osvjetljenja koji rješava adaptivni prag temeljen na filtru; ono što rješava jest pitanje „na kojoj vrijednosti trebam rezati?” kada je globalno pragovanje već ispravan pristup. Za scenu čije je razlikovanje prednjeg plana i pozadine dobro definirano, vrijednost koju Otsu odabere obično je unutar nekoliko jedinica od one koju bi čovjek odabrao na oko.
5.18.6. Računanje na slici razlike¶
Koristan detalj o get_histogram() i get_statistics(): obje prihvaćaju ključnu riječ difference koja prima drugu Image i izračunava histogram (ili statistiku) razlike po pikselu između izvora i te slike, bez alociranja zasebne slike razlike. To je jeftin način da se upita „koliko se scena promijenila od referentne sličice?” bez plaćanja eksplicitnog poziva difference() koji bi proizveo sliku čija je jedina svrha biti izmjerena. Za skriptu za detekciju pokreta koja se neprekidno izvodi, ušteda se zbraja.