Dobókocka projekt Képfeldolgozás II.
A csapat Bátori Csaba Borbola Péter Kovács Norbert
Feladatkiírás A feladat szerint két dobókockával kell dobni, majd készíteni egy olyan képet, amin mindkét dobókocka 3 lapja látszik, végül a két felső lapon látható pontokat összeadni
Kezdeti problémák Legelső probléma maga a kocka ¯ Kezdetben úgy véltük, hogy a kerekített csúcsú kocka nem megfelelő /kiderült, hogy más a gond/ üzletekben csak ilyen kapható ¯ saját dobókocka készítése
Kezdeti problémák Következő nehézség a szegmentálás Ezt megfelelő világítással küszöböltük ki A kockák felső lapja kellőképpen megvilágítva jó eredményt hozott Fontos a képalkotás megfelelő szöge Mind a látható felszínek Mind a későbbi feladatok miatt
Kezdeti problémák Ami menetközben került felszínre: Az órán bemutatott K-means klaszterezés „cityblock”-ot használunk, de néha jobb a „sqEuclidean” Mindössze a tapasztalat döntött
A program felépítése Szürkeárnyalatossá alakítás Otsu algoritmus végrehajtása Mediánszűrés Objektumszám vizsgálat (>2?) Ha szükséges, eróziót hajtunk végre Egy újabb objektumszám vizsgálat (==2?) Ha az objektumok száma kettő, akkor megvizsgáljuk, hogy a második komponens kocka felszíne-e 7. a, Felszínek kiválasztása, majd a pöttyök megszámolása 7. b, Egyébként klaszterezés, végül az egyes klasszterekbe tartozó pöttyök összeadása
Az egyes lépések részletezése
Szürkeárnyalatossá alakítás Egy beépített Matlab függvényt használtunk: I a beolvasott kép J = rgb2gray(I);
Otsu-algoritmus A bemeneti J kép szürkeárnyalatos A normalizált hisztogram minden x szürkeértékhez megadja az előfordulási gyakoriságát(valószínűségét): px Az algoritmus lényege: keressük meg azt a T küszöbszámot, amely maximalizálja az objektumháttér közötti varianciát.
Otsu-algoritmus A globális küszöbérték meghatározása: level = graythresh(J); A küszöbérték alapján a bináris kép előállítása: BW = im2bw(J,level);
A mediánszűrés Ez szintén beépített Matlab függvény: BWMED = medfilt2(BW,[25 20]); Ahol szűrő mérete 25x20 maszk, mert ekkora méret már kellően zaj mentesíti a képet.
Az objektumszám vizsgálata Megnézzük, hogy az objektumok száma nagyobb-e mint 2 (bwlabel()) Ha igen, akkor eróziót hajtunk végre: st = strel('disk',6); //6-os méretű ‘disk’ szerkesztőelem BWR = imerode(BWMED,st); Ha pontosan kettő, akkor megnézzük, hogy a második kockafelszín-e (pöttyök keresése az objektumon)
Első eset Amikor mindkét objektum kockafelszín A felszínek különválasztása: [r,c] = find(bwlabel(BWR)==1); CUBE1 = bwselect(BWR,c,r) Inverzképzés (pöttyszámolás miatt): CUBE1INV = ~CUBE1; Pöttyszámolás: [labeled,numObjects] = bwlabel(CUBE1INV); cube1Sum = numObjects-1; (-1 a háttér miatt)
Második eset A két kocka felszíne összefolyik Inverzképzés (pöttyszámolás miatt) Pöttyök koordinátájának tárolása (medián x,y) Ezeken K-means eljárás végrehajtása kMeansResult = kmeans(comps,2,'Distance','cityblock'); Klasszterek alapján az eredeti képen színezünk is
Ennyit az elméleti háttérről Magának a programnak a bemutatása
A felhasználói felület
A felhasználói felület Fejléc A betöltött kép Tallózás Tallózás után Futtatás Az egyes eredményképek Végül az összeg
Működés közben
Az összesített képek Szürkeárnyalatos Otsu Mediánszűrés Inverzek Két dobókocka felszín
Lehetséges esetek A kockák egymáshoz való viszonya különböző lehet Különálló felszínek Összeérő felszínek
Első eset Különálló felszínek esetén erózió legtöbbször nem szükséges A mediánszűrés szépen letisztítja az Otsu-algoritmus eredményét Erre példát korábban láthattunk
Második eset Amikor a kockák felszíne összeér szükség lehet erózióra De vannak esetek, amikor az sem szükséges
Összeér, de nem kell erózió Mediánszűrés letisztította Zaj, az Otsu után
Összeér és kell erózió Zaj, amiből maradt a mediánszűrés után is
Összeér, kell erózió, nincs zaj Összeérő felszínek, de itt az erózió leszedte a zajt
Volt…., Nincs… volt nincs
Ahogy semmi, ez sem tökéletes Nem megfelelő elhelyezkedés (szög) Kis pöttyöt a mediánszűrés leszedi
Ahogy semmi, ez sem tökéletes Van, amikor a „zaj is pötty”
Ahogy semmi, ez sem tökéletes Ha nem megfelelő a megvilágítás, nyílván az Otsu-algoritmus sem működik megfelelően, ahogy azt korábban megemlítettük. Valamint a K-means esetében a távolságszámítás néha nem megfelelő, vagyis a ‘cityblock’, ilyenkor a 'sqEuclidean ' jól működne. Gyakorlatban a ‘cityblock’ több jó eredményt produkál.
Összefoglalás Kiindulási ötletként a felülről való megvilágítást találtuk ki, a szegmentálás megkönnyítésre Ehhez Otsu algoritmus megtalálása hozta meg a sikert Ezek után már csak a dobókockák elhelyezkedése (összeér, nem ér össze) okozta a nehézséget Mediánszűrés, erózió, objektum címkézés, kiválasztás, klaszterezés Továbbá készítettünk egy grafikus felhasználó felületet, megkönnyítve ezzel a program kezelését Vannak esetek, amikor egy gyári dobókockára is működik
A gyári kocka esetében
Részletek A zaj itt is szépen eltűnt A klaszterezés is jól működik
Köszönöm a figyelmet!