Skip navigation

Numpy képreprezentáció

Képmátrix

A digitális képeket képmátrixban tároljuk. A mátrix elemei a képpontok. A reprezentáció fontosabb tulajdonságai az alábbiak.

  • A képpontokat sor (Y) és oszlop (X) indexeikkel címezhetjük.
  • Az origó rendszerint a bal felső sarok. Jellemzően ez a (0, 0) koordináta. A Matlab esetén ez az (1, 1).

Numpy tömbelem elérés

Egy Numpy képmátrix elemének elérési módja:

pixel = image[y, x]

Vagyis [sor, oszlop] sorrendben kell megadni a koordinátákat. Az eredmény skalár érték (1 csatornás kép esetén) vagy 3 elemű tömb (BGR színes kép) lesz. A 3 elemű tömböt tovább lehet indexelni, például a vörös színkomponens elérése:

R = image[y, x, 2]

A Numpy tömb attribútumai információval szolgálnak többek között a méretről (shape), dimenzióról (ndim) és a típusról (dtype).

Megjegyezzük, hogy ez a fajta képpont elérés lassú, nagy mennyiségű adatelérést nem így érdemes csinálni. Használhatjuk a fejlettebb Numpy manipulációkat, vagy megírhatjuk a szükséges függvényeket C++-ban. Ezekkel itt most nem foglalkozunk.

Egéresemény hozzárendelése ablakhoz

A következő példaprogramunk a képpontok elérését mutatja be. Betöltünk egy képet, megjelenítjük ablakban, valamint az ablakhoz egy egéresemény-kezelőt kapcsolunk az alábbi módon:

cv2.setMouseCallback('image', mouse_click)

Ha az image nevű ablakban kattintunk vagy mozgunk az egérrel, akkor a rendszer meghívja a mouse_click() függvényünket.

Ez a függvény megkapja a rendszertől az egéresemény típusát (event), a kattintás ablakkoordinátáit, ami megegyezik a kép indexelési koordinátáival (x, y). Az utolsó két paramétert nem használjuk. A lehetséges egéresemény értékeket az alábbi táblázat foglalja össze.

event Leírás
EVENT_LBUTTONDOWN
EVENT_RBUTTONDOWN
EVENT_MBUTTONDOWN
Bal, jobb, középső egérgomb lenyomása.
EVENT_LBUTTONUP
EVENT_RBUTTONUP
EVENT_MBUTTONUP
Bal, jobb, középső egérgomb felengedése.
EVENT_MOUSEMOVE Egér mozgatás ablakban.
EVENT_LBUTTONDBLCLK
EVENT_RBUTTONDBLCLK
EVENT_MBUTTONDBLCLK
Dupla kattintás esemény a bal, jobb, középső egérgombbal.
EVENT_MOUSEWHEEL
EVENT_MOUSEHWEEL
Egérgörgők használata.

02_01_mouseclick_pixels.py

import cv2


def mouse_click(event, x, y, flags, param):
# Globalis valtozo atvetele
global image


if event == cv2.EVENT_LBUTTONDOWN:
# (x,y) színérték kiírása
print('Pixel = ', image[y, x])

# Ha 3 csatornás a kép
if image.ndim == 3:

print('R = ', image[y, x, 2])
cv2.imshow('image', image)


image = cv2.imread('OpenCV-logo.png', cv2.IMREAD_COLOR)
# image = cv2.imread('OpenCV-logo.png', cv2.IMREAD_GRAYSCALE)
print('Kép dimenziói: ', image.shape)

print('Kép pixeltípusa: ', image.dtype)

cv2.imshow('image', image)
# Egerkezelo callback fuggveny beallitasa az ablakhoz
cv2.setMouseCallback('image', mouse_click)
# Kilepes billentyunyomasra

cv2.waitKey(0)

cv2.destroyAllWindows()

Feladatok

  • Próbáljuk ki a programot úgy, hogy szürkeárnyalatos képpel dolgozunk! (Például beolvasáskor szürkeárnyalatosra konvertáljuk, ahogyan a kikommentározott sorban látható.)
  • Bővítsük úgy a programot, hogy a kattintás helyére vörös képpont kerüljön bemásolásra, ha színes kép a bemenet!

Numpy részkép kivágása és visszamásolása

A Numpy lehetőséget ad a tömbök szeletelésére, vagyis indextartományokkal megadott részének elérésére. A szeletelés eredménye egy új, másolat mátrix lesz.

Az indextartományok megadásánál a kezdő és záró koordinátát kell megadni, kettősponttal elválasztva. A záró koordináta érték már nem vesz részt a kivágásban, vagyis a következő példa egy 100x100 méretű eredményt ad!

cropped = image[82:172, 396:486]

Ha egy koordináta esetén a teljes tartományt fel szeretnénk használni, akkor csak a kettőspontot kell használni. Például az alábbi értékadással ki tudjuk nullázni a cropped mátrix minden elemét.

cropped[:, :] = 0

Egy kisebb mátrixot be tudunk másolni egy nagyobba. A nagyobbnál indextartományokat kell megadni. (A kisebbnél is lehet.) A két (rész)mátrix méretnek meg kell egyeznie egymással!

image[10:100, 20:110] = cropped

02_02_crop.py

import cv2

image = cv2.imread('GolyoAlszik_rs.jpg')
# Képkivágás; sor és oszlop tartomány megadása
cropped = image[82:172, 396:486]

# Kivágott rész képbe másolása, új helyre
image[10:100, 20:110] = cropped


cv2.imshow('image', image)
cv2.imshow('cropped', cropped)

cv2.waitKey(0)

cropped:

image a képrészlet bemásolás után:

Feladat

Készítsünk olyan programot, amely két bal egérgomb kattintással egy téglalapot határoz meg a képen, kivágja a képtartalmat, és új ablakban megjeleníti! Az eredeti képre zöld színnel rajzoljuk be a kijelölt téglalapot!