5.2. Koordináták és területek¶
A képfeldolgozás képpontokon hat, és ahhoz, hogy egy algoritmus egy képpontra hatni tudjon, koordináta alapján kell megcímeznie azt. Ahhoz, hogy képpontok egy téglalapjára hasson, ugyanez igaz – a téglalapot úgy kell leírni, ahogyan abban az algoritmus és az alkalmazás kódja megegyezik. Az a megállapodás, amelyet az image modul a koordinátákra és a téglalapokra használ, egyszerű, egyetlen részlettel, amely megzavarhatja azokat az olvasókat, akik a matematikai konvencióhoz, nem pedig a számítógépes grafika konvenciójához vannak szokva, és ezt érdemes előre tisztázni.
5.2.1. A képpontrács¶
A (0, 0) képpont a kép bal felső sarka. Az x tengely jobbra fut, így a nagyobb x jobbra távolabbit jelent. Az y tengely lefelé fut, így a nagyobb y a képen lejjebb lévőt jelent. Egy szélesség x magasság méretű kép a (0, 0) koordinátától a (width - 1, height - 1) koordinátáig terjedő egész koordinátákon tartalmaz képpontokat; nincs képpont a (width, 0) vagy a (0, height) helyen – ezek a pozíciók a jobb és az alsó szél, egy lépéssel az utolsó tényleges képponton túl mindkét irányban.
A lefelé futó y tengely a fent említett részlet. A négyzetrácsos geometriához szokott olvasó azt várja, hogy a nagyobb y feljebbet jelent; itt ez az intuíció pontosan fordított. A fordítás oka az, hogy a digitális érzékelők és a digitális kijelzők egyaránt a bal felső saroktól indulnak, és soronként jobbra haladnak, fentről lefelé, és ha a képpontokat ugyanebben a sorrendben helyezzük el a memóriában, akkor a „i pozíció a pufferben” és a „kép r sora, c oszlopa” közötti kapcsolat olyan egyszerű aritmetikai művelet lesz, amennyire csak lehetséges – a (x, y) képpont i pozíciója egyszerűen y * width + x. Minden képfeldolgozó könyvtár évtizedekkel ezelőtt megegyezett ebben az elrendezésben ugyanezért, és ennek ára egyetlen apró gondolati alkalmazkodás, amikor először dolgozunk képekkel.
A kép koordináta-rendszere: az origó a bal felső sarokban, az x jobbra fut, az y lefelé fut. A képen belüli téglalap alakú területet a bal felső sarka (x, y) és a méretei (w, h) nevezik meg.¶
5.2.2. Téglalapok¶
A képen végzett legtöbb műveletet kevésbé érdekli egyetlen képpont, mint inkább képpontok egy téglalapja – egy terület, amelyben keresni kell, egy régió, amelyet ki kell másolni, egy képkockán belüli képkocka, amely fölött statisztikát számítunk. A téglalap megnevezésének alakja az egyetlen képpontra vonatkozó konvenció lehető legegyszerűbb kiterjesztését választja: add meg a bal felső sarok koordinátáját, majd a téglalap méreteit, egy négyelemű (x, y, w, h) tuple-be csomagolva. A téglalapon belüli képpontok az x-től az x + w - 1-ig terjedő oszlopokban és az y-tól az y + h - 1-ig terjedő sorokban vannak.
Az itt tisztázásra érdemes részlet az, hogy a w és a h méretek, nem pedig jobb alsó koordináták. A (10, 20, 4, 3) téglalap a 10., 11., 12., 13. oszlopot és a 20., 21., 22. sort fedi le – összesen tizenkét képpontot – nem pedig egy (10, 20)-tól (4, 3)-ig futó területet. A konvenció a modulban mindenütt egységes, így ha egyszer beépül, a tévedések megszűnnek, de első alkalommal megzavarja az embereket.
Az (x, y, w, h) alak három helyen bukkan fel, amelyek különbözőnek tűnnek, de osztoznak a konvención. Az első, amikor egy kép a saját kiterjedését írja le: a teljes képet lefedő téglalap a (0, 0, width, height). A második, amikor egy észlelési metódus határoló dobozt tartalmazó eredményt ad vissza – egy blob, egy rect, egy apriltag – és a dobozt (x, y, w, h) formában jelenti vissza. A harmadik, amikor egy metódusnak meg kell mondani, hogy a kép egy alterületén dolgozzon, ne pedig a teljes képkockán; a műveletet behatároló roi kulcsszó argumentum ugyanazt a négyelemű tuple-t veszi át.
Egy határoló doboz átvétele az egyik metódustól és átadása a következő metódus roi argumentumának a képfeldolgozás egyik leggyakoribb mintája. Egy durva első észlelés határoló doboza leszűkíti a keresési területet egy finomabb második számára, és az észlelési eredmények és a metódusargumentumok egységes szókincse az, ami ezt a mintát olyan egyszerűvé teszi, amilyen – egyetlen tuple-alak, ugyanúgy használva az átadás mindkét oldalán.
5.2.3. Egész címek, törtértékű súlypontok¶
Maguk a képpontcímek egész számok. Egy képpont vagy van egy adott egész oszlopban és sorban, vagy nincs, és az a kérdés, hogy mi van a (40.5, 30.7) koordinátán, nem helyesen feltett kérdés – nincs képpont, amely pontosan azon a pozíción ülne. Néhány mennyiség azonban, amelyet az image modul a képpontpozíciókból származtat, törtértékű, és érdemes megérteni, hogy miért, hogy a különbség később ne lepje meg az alkalmazást.
A leggyakoribb eset a súlypont – egy terület tömegközéppontja. Egy összefüggő képpontterület lebegőpontos alakú súlypontja a tagképpontok pozícióinak átlaga, a sűrűségükkel súlyozva. Egy olyan terület súlypontjának x értéke, amelynek képpontjai két oszlop fölött terülnek el, mondjuk 41,6 lehet – egy valós pozíció, amelyet a szem „a terület közepeként” írna le, jóllehet egyetlen tényleges képpont sem ül pontosan azon az x értéken. Az észlelési eredmény objektumok mindkét alakot csak olvasható tulajdonságként hordozzák: egy egész párt (cx / cy, hasznos, amikor a pozíciót visszatápláljuk valamibe, ami egész képpontkoordinátákat vár) és egy lebegőpontos párt (cxf / cyf, hasznos, amikor a pozíció olyan szabályozási hurokba kerül, amelynek előnyös a képpont alatti felbontás).
A másik eset a két képkocka közötti elmozdulás, frekvenciatartományban mérve. Azok a technikák, amelyek egy kép spektrális tartalmát elemzik, nem pedig közvetlenül a képpontjait, egy képpontnál finomabb eltolódásokat is fel tudnak bontani, és ezeket az eltolódásokat lebegőpontos (dx, dy) értékekként jelentik.
Az ökölszabály: a képpontcímek egész számok; az algoritmusból kijövő pozíciók és eltolódások lehetnek lebegőpontosak. A rajzoló metódusok mindkét alakot elfogadják, és lefelé kerekítik a lebegőpontos értékeket a legközelebbi egész képpontra, amikor az eredménynek a rácson kell landolnia.
5.2.4. Descartes-féle és poláris¶
Az eddig leírt rendszer Descartes-féle: minden képpontot az origótól vett vízszintes és függőleges eltolása nevez meg. Ez az a rendszer, amelyben a bájtok tárolódnak – a pufferben lévő i képpont a i % width oszlopban és a i // width sorban lévő képpontnak felel meg, a sorokat fentről bejárva – és ez az a rendszer, amelyben minden metódus alapértelmezetten működik.
Egy második ábrázolásmódot érdemes ismerni, mert egyes algoritmusok sokkal jobban működnek benne. A poláris koordináták minden képpontot egy választott középponttól vett távolsága és egy referenciairánnyal bezárt szöge alapján neveznek meg. A kép képpontjai nem mozdultak el – a bájtok továbbra is ugyanabban a sorfolytonos pufferben vannak – de a címzési séma a „milyen messze jobbra és milyen messze le”-ről átváltott a „milyen messze a középponttól és milyen szögben körülötte”-re.
Ugyanaz a P pont, két módon megnevezve: Descartes-féle (x, y) a bal felső origótól, poláris (r, theta) egy választott középponttól.¶
Miért érdemes egyáltalán váltani? Két azonosság miatt, amelyek a nehéz kereséseket könnyűvé teszik.
Poláris koordinátákban a kép elforgatása a választott középpont körül ugyanaz a művelet, mint a képpontjainak eltolása a szögtengely mentén – az újravetített képben az x irányban. Egy elforgatott másolat az eredeti balra vagy jobbra eltolva poláris alakban.
A log-poláris változatban – a távolságtengely logaritmikus skálát használ, a szögtengely lineáris marad – a kép átskálázása a választott középpont körül ugyanaz a művelet, mint a képpontjainak eltolása a távolságtengely mentén – az y irányban. Egy átskálázott másolat az eredeti felfelé vagy lefelé eltolva log-poláris alakban.
Így egy algoritmus, amelynek elforgatás vagy átskálázás mellett kell felismernie egy ismert mintát, a keresését poláris térben végezheti, ahol mindkét transzformáció hétköznapi eltolássá válik. Az eltolásokat sokkal olcsóbb keresni, mint az elforgatásokat és átskálázásokat, és a poláris újravetítés az, ami a helyettesítést elérhetővé teszi.
A poláris koordináták nem helyettesítik a Descartes-félét a képpontok tárolásában; a bájtok mindig a Descartes-féle rácson élnek. A modul biztosít egy metóduspárt, amely igény szerint a Descartes-féléről poláris alakra vetíti újra a képet, a poláris koordinátákat igénylő algoritmus elvégzi a munkáját, és vagy az eredmény vetül vissza, vagy a poláris térbeli mérést használjuk közvetlenül. Ez a mechanizmus az egyetlen ok, amiért a poláris koordináták egyáltalán megjelennek a modul felületén.
Az egyes képpontok megnevezésére szolgáló Descartes-féle koordinátákkal, a téglalapjaik megnevezésére szolgáló (x, y, w, h) négyelemű tuple-lel és a poláris koordinátákkal, amelyek akkor érhetők el, amikor egy algoritmusnak előnyösek, egy alkalmazás teljes szókinccsel rendelkezik annak megnevezésére, hogy a képen hol van valami. Az, hogy ezeken a pozíciókon ténylegesen mi tárolódik, az alapozás következő rétege.