A matematikai morfológia eszközeivel számos alacsonyszintű képfeldolgozó művelet végrehajtható. Most csak a morfológiai szűréssel foglalkozunk, amit a dilatáció és az erózió műveletek egymás utáni végrehajtásával valósíthatunk meg. A dilatáció "hízlal" a képi komponenseken, az erózió pedig erodál, csökkent rajtuk. Bináris és szürkeárnyalatos képekre is értelmezhetők.
A dilatáció megfogalmazható úgy, hogy a vizsgált képpontot az adott környezetében előforduló intenzitások maximális értékével helyettesítjük. Az erózió esetén pedig a minimális értékkel.
A környezet alakját definiáló elemet strukturáló elemnek nevezik, ami többféle alakot felvehet, ahogyan majd látni fogjuk.
A morfológiai szűrést a dilatáció és erózió egymás utáni végrehajtásával valósíthatjuk meg, például az alábbi szerint.
- Dilatáció
- Erózió
- Erózió
- Dilatáció
OpenCV-ben az alábbi függvényeket használhatjuk.
Strukturáló elem definiálása a cv2.getStructuringElement() függvénnyel kérhető.
retval = cv2.getStructuringElement(shape, ksize[, anchor])
A shape paraméterrel ki kell választani a kívánt alakot. Téglalap, ellipszis, és kereszt érhető el a cv2.MORPH_RECT, cv2.MORPH_ELLIPSE és cv2.MORPH_CROSS konstansokkal.
A ksize paraméter egy felsorolási objektum, ami a strukturáló elem befoglaló téglalapjának méretét adja. Célszerű páratlan oldalszámút választani, hogy egyértelműen meghatározható legyen a középső elem, amire a környezet illesztése történik. Nem kell egyformának lenniük viszont. Ha nem a középső elemet szeretnénk illesztési pontnak használni, akkor az opcionális harmadik paraméterként (anchor) adhatjuk meg konkrétat.
Figyeljük meg, hogy a visszaadott mátrix 0 és 1 értékek tartalmaz, annak megfelelően, hogy az adott szomszédot figyelembe kell-e venni vagy sem! Vagyis a konvolúcióval ellentétben itt nem tetszőleges súlyokat használunk!
Néhány példa strukturáló elemre.
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
[[0 1 0]
[1 1 1]
[0 1 0]]
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 5))
[[0 0 0 0 1 0 0 0 0]
[0 1 1 1 1 1 1 1 0]
[1 1 1 1 1 1 1 1 1]
[0 1 1 1 1 1 1 1 0]
[0 0 0 0 1 0 0 0 0]]
Dilatációt az alábbi függvénnyel kapunk:
dst = cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
A dst képmátrixban kapjuk az eredményt, az src a forráskép, a kernel a strukturáló elem. A további opcionális paraméterek közül az iterations-t emeljük, ki amivel megadhatjuk, hányszori ismétléssel szeretnénk a műveletet végrehajtani. Ismétlődő függvényhívásokat és for ciklusokat tudunk ezzel kiváltani.
Az erózió teljesen analóg módon hívható:
dst = cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])