5.2. Koordinate i područja¶
Obrada slike djeluje na piksele, a da bi djelovao na neki piksel, algoritam ga mora adresirati pomoću koordinate. Da bi djelovao na pravokutnik piksela, vrijedi isto – pravokutnik mora biti opisan na način oko kojeg se algoritam i programski kôd aplikacije slažu. Konvencija koju modul image koristi za koordinate i pravokutnike jednostavna je, uz jedan detalj koji zbunjuje čitatelje naviknute na matematičku, a ne na računalno-grafičku konvenciju, te ga vrijedi odmah na početku izričito objasniti.
5.2.1. Mreža piksela¶
Piksel (0, 0) je gornji lijevi kut slike. Os x ide udesno, pa veći x znači više udesno. Os y ide prema dolje, pa veći y znači niže prema dnu slike. Slika dimenzija širina puta visina sadrži piksele na cjelobrojnim koordinatama od (0, 0) do (width - 1, height - 1); ne postoji piksel na (width, 0) ili (0, height) – te su pozicije desni i donji rub, jedan korak iza posljednjeg stvarnog piksela u svakom smjeru.
Os y usmjerena prema dolje je gore spomenuti detalj. Čitatelj naviknut na geometriju s milimetarskog papira očekuje da veći y znači više gore; ovdje je ta intuicija točno obrnuta. Razlog obrnutosti je taj što i digitalni senzori i digitalni zasloni rade počevši od gornjeg lijevog kuta te idu udesno kroz svaki redak, od vrha prema dnu, a raspoređivanje piksela u memoriji istim redoslijedom čini odnos između „pozicije i u međuspremniku” i „retka r, stupca c slike” najjednostavnijim mogućim računom – pozicija i piksela (x, y) je naprosto y * width + x. Svaka biblioteka za obradu slike složila se oko tog rasporeda prije više desetljeća iz istog razloga, a cijena je jedna mala mentalna prilagodba pri prvom radu sa slikama.
Koordinatni sustav slike: ishodište u gornjem lijevom kutu, x ide udesno, y ide prema dolje. Pravokutno područje unutar slike imenuje se svojim gornjim lijevim kutom (x, y) i svojim dimenzijama (w, h).¶
5.2.2. Pravokutnici¶
Većini operacija nad slikom manje je stalo do pojedinačnog piksela nego do pravokutnika piksela – područja u kojem treba tražiti, područja koje treba iskopirati, okvira unutar okvira nad kojim treba izračunati statistiku. Oblik za imenovanje pravokutnika bira najjednostavnije moguće proširenje konvencije za pojedinačni piksel: navodi se koordinata gornjeg lijevog kuta, a zatim dimenzije pravokutnika, sve upakirano u četvorku (x, y, w, h). Pikseli unutar pravokutnika nalaze se u stupcima od x do x + w - 1 i retcima od y do y + h - 1.
Detalj koji ovdje vrijedi izričito naglasiti je taj da su w i h veličine, a ne koordinate donjeg desnog kuta. Pravokutnik (10, 20, 4, 3) obuhvaća stupce 10, 11, 12, 13 i retke 20, 21, 22 – ukupno dvanaest piksela – a ne područje koje se proteže od (10, 20) do (4, 3). Konvencija je ujednačena kroz cijeli modul, pa kada se jednom usvoji, pogreške prestaju, ali doista zbunjuje ljude prvi put.
Oblik (x, y, w, h) pojavljuje se na tri mjesta koja izgledaju različito, ali dijele konvenciju. Prvo je kada slika opisuje vlastiti obuhvat: pravokutnik koji pokriva cijelu sliku je (0, 0, width, height). Drugo je kada metoda detekcije vraća rezultat s graničnim okvirom – blob, rect, apriltag – i okvir se javlja natrag kao (x, y, w, h). Treće je kada metodi treba reći da radi na podpodručju slike umjesto na cijeloj sličici; ključni argument roi koji ograničava operaciju prima istu četvorku.
Preuzimanje graničnog okvira iz jedne metode i prosljeđivanje u roi sljedeće metode jedan je od najčešćih obrazaca u obradi slike. Granični okvir grube prve detekcije sužava područje pretrage za finiju drugu, a ujednačen rječnik kroz rezultate detekcije i argumente metoda upravo je ono što taj obrazac čini tako jednostavnim – jedan oblik četvorke, korišten na isti način na obje strane predaje.
5.2.3. Cjelobrojne adrese, razlomljeni centroidi¶
Same adrese piksela su cijeli brojevi. Piksel ili jest ili nije na danom cjelobrojnom stupcu i retku, a pitati što je na koordinati (40.5, 30.7) nije dobro postavljeno pitanje – nema piksela koji sjedi točno na toj poziciji. Ipak, šačica veličina koje modul image izvodi iz pozicija piksela jesu razlomljene, pa vrijedi razumjeti zašto kako razlika kasnije ne bi iznenadila aplikaciju.
Najčešći slučaj je centroid – središte mase nekog područja. Za povezano područje piksela, centroid u obliku pomičnog zareza prosjek je pozicija pripadajućih piksela, ponderiran njihovom gustoćom. Područje čiji se pikseli protežu preko dva stupca imat će centroid x od, recimo, 41.6 – stvarnu poziciju koju bi oko opisalo kao „sredinu tog područja” iako nijedan stvarni piksel ne sjedi točno na tom x. Objekti rezultata detekcije nose oba oblika kao svojstva samo za čitanje: cjelobrojni par (cx / cy, koristan kada se pozicija vraća u nešto što želi cjelobrojne koordinate piksela) i par s pomičnim zarezom (cxf / cyf, koristan kada pozicija ide u upravljačku petlju kojoj koristi razlučivost ispod razine piksela).
Drugi slučaj je pomak između dviju sličica mjeren u frekvencijskoj domeni. Tehnike koje analiziraju spektralni sadržaj slike umjesto izravno njezinih piksela mogu razlučiti pomake finije od jednog piksela te te pomake javljaju kao vrijednosti (dx, dy) s pomičnim zarezom.
Praktično pravilo: adrese piksela su cijeli brojevi; pozicije i pomaci koji izlaze iz algoritma mogu biti brojevi s pomičnim zarezom. Metode za crtanje prihvaćaju oba oblika i zaokružuju brojeve s pomičnim zarezom prema dolje na najbliži cjelobrojni piksel kada rezultat mora pasti na mrežu.
5.2.4. Kartezijev i polarni¶
Sustav opisan dosad je kartezijev: svaki piksel imenuje se svojim vodoravnim i okomitim odmakom od ishodišta. To je sustav u kojem su bajtovi pohranjeni – piksel i u međuspremniku odgovara pikselu u stupcu i % width i retku i // width, prolazeći retke od vrha – i to je sustav u kojem svaka metoda zadano radi.
Vrijedi poznavati i drugi prikaz jer neki algoritmi u njemu rade mnogo bolje. Polarne koordinate imenuju svaki piksel njegovom udaljenošću od odabrane središnje točke i kutom između njega i referentnog smjera. Pikseli slike nisu se pomaknuli – bajtovi su i dalje u istom međuspremniku u poretku po retcima – ali shema adresiranja promijenila se iz „koliko udesno i koliko dolje” u „koliko daleko od središta i pod kojim kutom oko njega.”
Ista točka P, imenovana na dva načina: kartezijev (x, y) iz gornjeg lijevog ishodišta, polarni (r, theta) iz odabranog središta.¶
Zašto se uopće prebacivati? Zbog dvaju identiteta koji teške pretrage pretvaraju u lake.
U polarnim koordinatama, rotiranje slike oko odabranog središta ista je operacija kao translacija njezinih piksela duž osi kuta – smjera x u ponovno projiciranoj slici. Rotirana kopija je original pomaknut lijevo ili desno u polarnom obliku.
U log-polarnoj varijanti – os udaljenosti koristi logaritamsku ljestvicu, os kuta ostaje linearna – skaliranje slike oko odabranog središta ista je operacija kao translacija njezinih piksela duž osi udaljenosti – smjera y. Skalirana kopija je original pomaknut gore ili dolje u log-polarnom obliku.
Dakle, algoritam koji mora prepoznati poznati uzorak pod rotacijom ili skaliranjem može pretraživati u polarnom prostoru, gdje se obje transformacije pretvaraju u obične translacije. Translacije je mnogo jeftinije pretraživati od rotacija i skaliranja, a polarna ponovna projekcija je ono što tu zamjenu omogućuje.
Polarne koordinate ne zamjenjuju kartezijeve za pohranu piksela; bajtovi uvijek žive na kartezijevoj mreži. Modul pruža par metoda koje na zahtjev ponovno projiciraju sliku iz kartezijevog u polarni oblik, algoritam kojemu trebaju polarne koordinate obavi svoj posao, te se ili rezultat projicira natrag ili se mjerenje u polarnom prostoru koristi izravno. Taj mehanizam je jedini razlog zbog kojeg se polarne koordinate uopće pojavljuju bilo gdje u sučelju modula.
Uz kartezijeve koordinate za imenovanje pojedinačnih piksela, četvorku (x, y, w, h) za imenovanje njihovih pravokutnika i polarne koordinate dostupne kada algoritmu koriste, aplikacija ima potpun rječnik za imenovanje gdje se nešto na slici nalazi. Ono što je zapravo pohranjeno na bilo kojoj od tih pozicija sljedeći je sloj temelja.