Skip navigation

Statisztikai szűrők

Működési elvük

Képen szűrést úgy is végezhetünk, ha a vizsgált képpont szomszédságában az intenzitásértékek statisztikáját használjuk fel. Gyakorlatban ilyen szűrők a medián, minimum és maximum értéket felhasználók.

A min-max szűrőket OpenCV-ben a matematikai morfológia eszközeivel érhetjük el, ahol a környezet, az úgynevezett strukturáló elem alakja a négyzetes mellett lehet (közelítő) ellipszis, illetve kereszt alakú is.

A konvolúció, a mediánszűrés, és a morfológiai műveletek esetén használatos környezeti típusokat külön foglaljuk össze.

Medián szűrés OpenCV-ben

A használandó függvény a cv2.medianBlur(). Második paramétere a vizsgálandó terület méretét adja. k paraméterérték esetén kxk méretű területen számítódik a medián értéke. Figyeljünk arra, hogy k értéke páratlan legyen. Nagyobb méretek esetén jelentősen lassul a művelet futásideje! Jól használható kiugró értékű, például só-bors típusú zaj szűrésére.

Használati példa

medfilt = cv2.medianBlur(img_noise, 3)

Példaprogram

  • 06_04_c_saltpepper_noise_median_blur.py: Só-bors zaj interaktív hozzáadása, medián és átlagoló simító szűrés végrehajtása. Láthatjuk, hogy az átlagoló szűrés rossz eredményt ad ennél a zajtípusnál.

Morfológiai szűrés

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ásacv2.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_RECTcv2.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.

struct = 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]]
cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))

[[0 1 0]
[1 1 1]
[0 1 0]]
struct = 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]]]]])

Zajszűrés küszöbölt képen

Korábban, a színes képek küszöbölésénél az egyik feladatunk az volt, hogy szegmentáljuk a képen a kék színű objektumokat. A feladat egy lehetséges megoldását a példatárban található car_segment_blue.png kép mutatja.

Figyeljük meg, hogy a matrica és a rendszám felségjel mellett számos kis méretű zaj is marad a képen, valamint ezen területek is tartalmaznak háttérszínű belső pontokat. Próbáljunk a zajtól megszabadulni, valamint a belső területeket objektumpontokkal feltölteni morfológiai szűrés alkalmazásával! Próbáljunk ki többféle strukturáló elem alakot és méretet! A szűrés eredményét jelenítsük meg, és vörös színnel vetítsük rá az eredeti képre is! (A vörös színű rávetítéshez szükséges tennivalókkal korábban már megismerkedtünk.)

A morfológiai szűrés egy lehetséges eredménye:

Morfológiai szűrés és simítás színes képen

A morfológiai szűrést nem csak bináris, hanem szürkeárnyalatos és színes képre is alkalmazhatunk. Színes, vagyis többcsatornás kép esetén csatornánként hajtódik végre. Az alábbi példában a nagy méretű területek színét "egységesíthetjük" a kisebb komponensek hatásának csökkentésével.

Eredeti car_numberplate_rs.jpg kép:

7x7 méretű kernellel végzett morfológiai szűrés (dilatáció → erózió → erózió → dilatáció) eredménye:

5x5 méretű, 4.0 szórás értékű Gauss simítás után: