5.5. Područja i maske¶
Svaka operacija u modulu image prema zadanim postavkama dodiruje svaki piksel svoje izvorne slike. To je najjednostavnije ponašanje za opisati i ispravno onda kada je zadatak algoritma uistinu obuhvatiti cijelu sličicu – jednolika korekcija boje, globalni histogram, prolaz kodiranja za prijenos. No većina algoritama u praksi želi gledati manje od toga. Pratitelj mrlja koji nadzire obojeni biljeg mari za onaj dio scene u kojem se biljeg može pojaviti, a ne za zid iza njega. Prolaz morfološkog čišćenja siguran je samo nad pikselima koje je neka ranija faza označila kao kandidate. Detektor lica mogao bi se izvršavati samo unutar graničnog okvira koji je grublji detektor već suzio. Modul image podržava taj rad kroz dva mehanizma koji ograničavaju operaciju na podskup piksela: pravokutna područja interesa i binarne maske. Slobodno se kombiniraju, a gotovo svaka metoda koja dodiruje piksele prihvaća jedno ili drugo – ili oboje – kao argument ključne riječi.
5.5.1. Područja interesa¶
Područje interesa je pravokutnik piksela imenovan četvorkom (x, y, w, h) predstavljenom na stranici o koordinatama. Otprilike trideset metoda na površini prihvaća argument ključne riječi roi; kada je prisutan, operacija se izvršava samo nad pikselima unutar tog pravokutnika i ostavlja ostatak slike netaknut. Kada je roi jednak None ili je izostavljen, operacija se izvršava nad cijelom slikom – isto kao da je prosljeđeno roi=(0, 0, width, height).
U kodu ključna riječ stoji uz koje god druge argumente operacija prima:
# Compute a histogram over a centred crop of the image.
h = img.get_histogram(roi=(64, 64, 128, 128))
Prvo što ROI-jevi donose jest kontrola lažno pozitivnih rezultata. Pratitelj boje koji gleda samo stol nikada se neće aktivirati na košulji koja prolazi pokraj njega; detektor rubova koji se izvršava samo unutar definiranog radnog područja nikada neće prijaviti rubove samog nosača kamere. Smanjenje područja pretrage na onaj dio scene do kojeg je algoritmu stvarno stalo najjeftinije je poboljšanje koje cjevovod može učiniti za vlastitu pouzdanost.
Drugo što donose jest cjevovod od grubog do finog. Objekti rezultata detekcije – blob, rect, apriltag i tako dalje – izlažu svoje granične okvire kao istu četvorku (x, y, w, h) koju roi prihvaća. Tako gruba prva faza može vratiti granični okvir, okvir se izravno spušta u roi sljedeće faze, a druga se faza izvršava nad užim područjem. Svako progresivno sužavanje ujedno ubrzava sljedeću fazu i čini njezine rezultate pouzdanijima, jer je prostor pretrage već filtriran.
5.5.2. Binarne maske¶
Pravokutnik je ispravan oblik kada je područje interesa poravnato s osima. Kada nije – zakrivljeno područje, nekonveksno područje, pikseli koje je neka ranija faza klasificirala kao „podudaranja” – operaciji se mora reći da se ograniči na proizvoljan uzorak piksela. Mehanizam za to jest binarna maska: zasebna Image, istih dimenzija kao izvor, korištena kao prekidač uključeno/isključeno za svaki piksel. Piksel različit od nule u maski kaže „uključi odgovarajući izvorni piksel”; nulti piksel kaže „ostavi izvorni piksel na miru.”
Maska je obično BINARY slika – format od jednog bita po pikselu koji postoji upravo za tu svrhu – ali bilo koja jednokanalna slika će raditi, jer potrošač svaku vrijednost različitu od nule tretira kao uključenu.
Metode filtriranja, određivanja praga i aritmetičke metode prihvaćaju argument ključne riječi mask. Oblik je na svakoj isti: zasebno alocirana binarna slika, istih dimenzija kao izvor, proslijeđena.
ROI-jevi i maske se kombiniraju. Proslijedite oboje i operacija se izvršava samo nad pikselima koji su unutar ROI-ja i uključeni u maski. Dva mehanizma daju aplikacijskom kodu neovisne poluge – jednu za pravokutno područje interesa, drugu za proizvoljan uzorak unutar njega – a da nijedan oblik ne nasljeđuje ograničenja od drugoga.
ROI ograničava operaciju na pravokutnik poravnat s osima. Maska je dodatno sužava na proizvoljan uzorak piksela. Dva se kombiniraju: mijenjaju se samo pikseli unutar ROI-ja i uključeni u maski.¶
5.5.3. Izgradnja maski¶
Tri metode klase Image izgrađuju uobičajene geometrije maski na mjestu tako da na nulu postavljaju piksele izvan odabranog područja:
mask_rectangle()zadržava pravokutnik.mask_circle()zadržava krug.mask_ellipse()zadržava elipsu.
Svaka prima (x, y, w, h) (za pravokutnik i elipsu) ili (x, y, radius) (za krug). Pozivanje bilo koje od njih bez argumenata centrira geometriju i dimenzionira je tako da ispuni sliku, što je oblik za kojim aplikacija poseže kada je cilj jednostavan ovalni oblik ili krug preko cijele slike koji ne skriva ništa osim kutova.
mask = image.Image(img.width(), img.height(), image.BINARY)
mask.clear() # start from all zeros
mask.mask_ellipse() # centred, full-size oval
Zanimljive maske rijetko dolaze samo iz metoda mask_*. Dolaze iz ranijih faza cjevovoda: prolaz određivanja praga proizvodi binarnu sliku čiji pikseli različiti od nule označavaju podudaranja, upravo onaj oblik koji treba dovesti u argument mask= sljedeće faze. Prolaz morfološkog čišćenja profinjuje tu masku ne mijenjajući njezin oblik. Sve što završi kao jednokanalna slika i samo je valjana maska.
5.5.4. Kako operacije mijenjaju sliku¶
Obrazac vidljiv u svakom isječku koda na posljednjih nekoliko stranica – operacija koja vraća istu img radi povezivanja u lanac – vrijedi izrijekom izdvojiti kako ga ne bi trebalo ponovno navoditi svaki put kad se uvede nova metoda. Tri obitelji metoda pojavljuju se na površini klase Image, a svaka izvornu sliku tretira drukčije:
Operativne metode mijenjaju piksele izvora na mjestu i vraćaju istu sliku radi povezivanja u lanac. Obitelji crtanja, aritmetike, praga i filtra sve se ponašaju na ovaj način.
img.gaussian(1)zamućujeimgi vraća istuimg; ponovno pridruživanje –img = img.gaussian(1)– bezopasno je, ali nepotrebno.Metode pretvorbe prema zadanim postavkama rade na mjestu jednako kao operativne metode, ali prihvaćaju
copy=Trueicopy_to_fb=Truekako bi alocirale zasebnu rezultatsku sliku kada izvor treba sačuvati. Pretvorbe formata i geometrijske kopije glavni su članovi ove obitelji.Metode pregleda čitaju piksele i vraćaju objekt rezultata – popis otkrivenih značajki, histogram, skup statistika – ne mijenjajući uopće izvornu sliku.
Ta je trihotomija dosljedna na cijeloj površini. Znanje kojoj obitelji metoda pripada govori aplikaciji što očekivati od poziva: hoće li pikseli izvora preživjeti netaknuti, hoće li biti alocirana zasebna rezultatska slika i je li povratna vrijednost sam izvor ili nešto drugo.