Skip navigation

Digitális képreprezentáció

Témakörök

Ebben a fejezetben megismerkedünk a képmátrix ábrázolási módjával n-dimenziós Numpy tömbként. Tárgyaljuk a képpontok elérését, a képmátrix részeinek kivágását, és az OpenCV függvényeivel történő 2D vászon rajzolási lehetőségeket. Végül nagyon röviden áttekintjük a képek digitális formában történő tárolási formáit.

Rövid összefoglaló

A Numpy csomag hatékony többdimenziós tömb reprezentációt nyújt, amely alkalmas nagy méret digitális raszterképek, képmátrixok tárolására is. Az OpenCV Python felülete ezt használja.

A képmátrixban tárolt képpontokat, a pixeleket tömb indexeléssel érhetjük el. Megegyezés szerint az x az oszlop, y a sor koordináta indexe. A bal felső sarok a kezdőpont, (0, 0) indexszel. Az x balról jobbra, az y fentről lefelé növekszik. Indexeléskor a Numpy [y, x], az OpenCV függvények (x, y) koordináta sorrendet használnak.

Szürkeárnyalatos kép esetén a képpont egy számértéket, színes esetben a színábrázolásnak megfelelő vektort, rendszerint számhármast tartalmaz. Szükség esetén a képmátrix ezen csatornák szerint tovább indexelhető. OpenCV esetén a csatornák sorrendje B, G, R ([0], [1], és [2] indexekkel).

A Numpy mátrixok objektumok, amelyek attribútumokkal és függvényekkel is rendelkeznek. Attribútumon keresztül elérhetjük az indexelhető dimenziók számát (ndim, egész számérték), az indexelhető dimenziók szerinti mátrix méretet (shape, ndim darab egész szám vektora), valamint a képmátrixban tárolt számértékek típusát (dtype, ami rendszerint np.uint8). Szürkeárnyalatos esetben az indexelhető dimenziók száma 2 (sor-oszlop skalár értéket ad), színes esetben 3 (sor-oszlop-csatorna). A fill() függvénnyel megadott skalár értékkel tölthetjük fel a képmátrixot.

A Numpy mátrixok közötti értékadás (=) referencia szerint történik. Ha valódi másolatot szeretnénk, akkor a képmátrix copy() függvényét kell meghívnunk.

A Numpy képmátrix szeletelhető, részmátrix határozható meg. Ekkor koordináta helyett intervallumot adhatunk meg kezdő:záró formában. Fontos, hogy a kezdő igen, de a záró nem része a kijelölésnek! A kezdő és/vagy a záró érték elhagyható, ebben az esetben a legkisebb és legnagyobb lehetséges értéket használja a rendszer. Jobbról balra haladva a teljes tartományt használó indexek elhagyhatók, de a sor szerintit mindenképpen meg kell adni. A részmátrix létrehozás is referencia szerint történik, tényleges másolathoz itt is a copy() függvény hívása szükséges. Egy részmátrix egy másik (rész)mátrixba másolható, ehhez egyforma méretűnek és típusúnak kell lenniük.

Egy többcsatornás kép egyes csatornáit elérhetjük [sor, oszlop, csatorna] szerinti indexeléssel. Esetenként egyszerűbb lehet, ha a többcsatornás képet szétbontunk különálló egycsatornás képekre a cv2.split() függvénnyel. Egycsatornás képek sorozatából egy többcsatornás hozható létre a cv2.merge() függvénnyel.

A Numpy lehetőséget biztosít megadott méretű és típusú új képmátrix létrehozására. OpenCV függvényekkel egy képmátrixba elemi geometriákat és szövegeket rajzolhatunk. A geometria-specifikus paraméterek mellett (kör középpontja és sugara, téglalap átellenes sarokpontjai, stb.) megadhatjuk a rajzolás színét, vonalvastagságát is. Negatív vonalvastagság esetén a belső zárt részek is kitöltésre kerülnek, egyébként csak a körvonal rajzolódik meg.

Az OpenCV egyszerű lehetőséget biztosít a képmegjelenítő ablakokban történő egéresemények kezelésére. Az ablak létrehozása után (pl. cv2.imshow()) a cv2.setMouseCallback() függvénnyel megadhatjuk az eseményre reagáló saját visszahívható függvényünket. Ez a függvény a rendszertől megkapja az esemény típusát (event, bal, jobb, középső gomb lenyomva-felengedve, egérmozgás az ablakban), valamint az esemény kiváltásának helyét az ablakban (x, y koordinátákkal). Ha ennek hatására módosul egy már megjelenített képmátrix, akkor azt újra meg kell jeleníteni a frissítéshez a cv2.imshow() függvénnyel. (Bővebb leírás a függelékben.)

A billentyűzetkezelés is egyszerű az OpenCV waitKey() és waitKeyEx() függvényeivel. Paraméterként megadhatjuk, hány ezredmásodpercig várjon a függvény (0: nincs időkorlát), és a lenyomott billentyű kódját adja vissza számértékként, ha nem volt lenyomott gomb, akkor -1 értéket. A visszaadott érték vizsgálatához használhatjuk a Python ord() függvényét, ami a paraméterként átadott karakter (pl. 'q') kódját adja vissza. A cv2.waitKey() megjelenő karakterek kódját adja csak vissza, funkció- és módosító billentyűk (Shift, Ctrl, Alt, Enter, stb.) lenyomásának kezeléséhez a cv2.waitKeyEx() szükséges. (Bővebb leírás a függelékben.)

A képmátrixokat fájlba írhatjuk (cv2.imwrite()), és onnan visszaolvashatjuk (cv2.imread()). A fájl nevének végén szereplő kiterjesztés határozza meg a mentés formátumát, az algoritmust, ami a hatékony tárolást megvalósítja. Fotók esetén jól használható a .jpg kiterjesztés (veszteséges, de nagy méretcsökkenés), képernyőképek, grafikonok, vektorgrafikuselemeket tartalmazó képekre pedig a .png (veszteségmentes, pontosan visszaállítható az elmentett képmátrix).