Skip navigation

Küszöbölés és vágás színes képeken

Probléma

Az előző részekben intenzitásképeken definiáltuk a küszöbölés és vágás műveleteket. Színes képek esetén a korábban látott, csatornánként elkülönített vagy szürkeárnyalatosra alakított megközelítések nem mindig elegendőek. Például az alábbi képen láthatunk kék színű matricát és felségjelzés területet is, de a kék csatorna részt vesz emellett többek között az autó szürke színének, valamint a rendszámtábla fehér hátterének a definiálásában is. Ha kék színű objektumokat szeretnénk detektálni, akkor önmagában csak a kék csatorna vizsgálata nem elegendő!

Megoldási lehetőség

A színes képen példában szereplő kék színű területeket ott találjuk, ahol a kék csatorna intenzitásértéke elegendően magas, míg a másik két csatorna értéke ugyanott alacsony, vagy legalábbis a kék csatorna értéke jóval magasabb a másik kettőnél.

Az első esetben a színes képet csatornákra bonthatjuk, a vörös és zöld csatornákon egy globális küszöbbel egy bináris maszkok állíthatunk elő az alacsony intenzitású részeikre, vesszük ezek közös részét, majd a küszöbölt kék csatornát ezekre a részekre szűkíthetjük logikai művelettel.

A második esetben képezzük aritmetikai műveletekkel a képek különbségeit, és azokat vegyük bele a vizsgálatba.

Összetett esetben a korábban már látott módon, egymásba ágyazott for ciklusokkal bejárhatjuk a képeket és dönthetünk az eredményről, de ennek a futási ideje jelentősen lassabb!

Feladatok

  • Készítsük el a fenti eredményt adó programot!
  • Detektáljuk a vörös színű lámpák helyeit!
  • Keressünk fehér színű rendszámtábla területet!

Ötlet: A megfelelő küszöbértékek megtalálásához használjuk a 02_01_mouseclick_pixels.py példaprogramot, hogy lássuk a célterületen milyen RGB értékek fordulnak elő, valamint a 04_05_b_np_clip_tb.py példaprogramot az intervallumok hangolására.

Megjegyzések

A gyakorlás kedvéért a kitűzött feladatokat küszöböléssel és képek közötti logikai műveletekkel oldjuk meg.

A feladatot megoldhatjuk a cv2.inRange() OpenCV függvény használatával is. Bemenetként egy egy- vagy többcsatornás képet adhatunk át, valamint megadhatjuk csatornánként a minimális és maximális értéket egy-egy tömbben. Eredményképpen egy bináris képet fog adni, ahol ott kapunk objektumpontokat (255 értékkel), ahol minden csatornára teljesül az intervallum ellenőrzés. A fenti feladatot megoldhatjuk tehát így is:

bounds_lower = np.array([120, 0, 0])
bounds_upper = np.array([255, 130, 100])
res = cv2.inRange(im, bounds_lower, bounds_upper)

Másrészt színhasonlóságon alapuló szegmentálást célszerűbb az RGB helyett a HSV színtérben végezni. Erről, és az inRange() függvény részletes használatáról egy későbbi részben olvashatunk.

További feladatok

A shapes almappa képein:

  • Szegmentáljuk küszöböléssel a különböző színű alakzatokat!
  • Nézzük meg, mi történik, ha a szürkeárnyalatos képen küszöbölünk!

hk_flower.jpg színes képen detektáljuk a következő részeket:

  • Fehér virágszirmok. (Mindhárom csatornán magas érték kell.)
  • Zöld levelek a háttérben.
  • Sárga porzók a virág közepén. (Vörös és zöld csatornán magas, kék csatornán alacsonyabb érték.)

Az FCards_01_rs.jpg képen detektáljuk az alábbiakat:

  • A vörös színű szimbólumokat a kártyalapokon.
  • A fekete színű szimbólumokat a kártyalapokon. 

A közüzemi óraállás képeken:

  • Szegmentáljuk küszöböléssel a vörös színű területeket (ahol van ilyen)!