Skip navigation

GrabCut

GrabCut algoritmus (OpenCV)

Működése

A GrabCut algoritmus iteratív módon működő, gráfvágáson alapuló előtér-háttér szegmentáló módszer. Egymás után többször is érdemes meghívni, mert finomítja (vagy elrontja...) az előző eredményt.

Egy szegmentálási eredmény 4 féle, az OpenCV csomagban előre definiált konstans értéket tartalmazhat.

  • Biztosan a háttérhez tartozik (cv2.GC_BGD).
  • Biztosan az előtérhez tartozik (cv2.GC_FGD).
  • Valószínűleg a háttérhez tartozik (cv2.GC_PR_BGD).
  • Valószínűleg az előtérhez tartozik (cv2.GC_PR_FGD).

Már első híváskor át kell adni egy előzetes szegmentálást vagy egy befoglaló téglalapot. A téglalap lehet a teljes kép tartalma is, de az inicializálást célszerűbb úgy lehet elvégezni, hogy a felhasználó interaktívan az egérrel rajzol egy téglalapot a szegmentálandó objektum körül. Ami ezen kívül van, az mind "Biztosan háttér" (cv2.GC_BGD) pont lesz. A téglalapon belüliek "Valószínűleg előtér" (cv2.GC_PR_FGD) címkét kapnak. Az iterációs lépés ezt fogja finomítani, amit további iterációknak adhatunk át bemenetként.

Természetesen lehetőségünk van a fenti 4 címke bármelyikét előzetesen elhelyezni a szegmentálási mátrixban, interaktívan vagy automatikusan. Akkor is jól használható a módszer, ha egy előzetes szegmentálás vagy objektum detekció eredményét szeretnénk finomítani. Elsőre példa lehet egy színhasonlóság, majd összefüggő komponens keresés, utóbbira például arcok vagy emberalakok detekciója a képen. A detekciók jellemzően egy befoglaló téglalapot adnak, amiben a GrabCut finomítani tudja a szegmentálást.

Kapcsolódó OpenCV dokumentáció

10_06_grabcut.py példaprogram

Használati lépések

  • Jelöljünk ki az egér jobb gombja segítségével egy téglalap alakú területet, amiben a szegmentálandó objektum benne található. A téglalapon belüliek valószínűleg előtér, a kívülesők biztosan háttér címkét kapnak a fentebb leírtak szerint.
  • Indítsuk el a módszer egy iterációs lépését (n)! Ezt ismételve frissíthetjük a szegmentálást.
  • Visszatérhetünk a kiindulási képhez (r).
  • Megadhatunk biztosan háttér (0 billentyű lenyomása után) és biztosan előtér (1 billentyű) pontokat a bal egérgombbal rajzolva.
  • Megadhatunk valószínűleg háttér (2 billentyű) és valószínűleg előtér (3 billentyű) pontokat a bal egérgombbal rajzolva.
  • Az s billentyű lenyomására képfájlokba menthetjük az aktuális eredményt.

Eredmények

A fruits.jpg képen kijelöljük a citrom környezetét, és nyomjuk meg az n billentyűt.

Az eredményt tovább finomíthatjuk, ha az 1 billentyű lenyomása után a bal egérgomb nyomva tartásával rajzolunk pár vonalat az objektumhoz tartozó területen (fehér színű vonalak), a 0 billentyű lenyomása után megadunk olyan helyeket, amelyek nem tartoznak az objektumhoz (fekete vonalak).

A szegmentálás új iterációs lépését elindítva (n billentyű) már az első után jó eredményt kapunk.

Megjegyzés: Ennél a képnél ha csak a téglalapot jelöljük ki is így indítjuk az iterációt, akkor is jó eredményt kapunk.

 

Feladatok

  • Próbáljuk ki a fruits.jpg képen az egyes gyümölcsök szegmentálására!
  • A butterfly.jpg képen szegmentáljuk a pillangót!
  • A stuff.jpg képen az egyes tárgyakat!
  • A GolyoAlszik_rs.jpg képen a macskát!