Minták automatikus osztályba sorolása a mintát leíró jellemzők alapján Típusok: felügyelt és felügyelet nélküli tanuló eljárások Különbség: előbbinél szükséges egy olyan tanulóhalmaz, ahol ismert a minták besorolása utóbbi automatikus módon képezi az osztályokat Mai óra: felügyelet nélküli tanítás
Ideális esetben a minták olyan leírói, amelyek értékei az azonos osztályba tartozó mintákra nézve hasonlóak, a különböző osztályba tartozó mintáknál pedig nem. Alapvető kategóriák: Intenzitásérték, színezet Textúraleírók Alakleírók Előbbiek az objektumok szegmentálásra is alkalmasak lehetnek Utóbbi esetben abból indulunk ki, hogy az objektum már megvan
LBP (local binary pattern) + hisztogram GLCM: (graylevel co-occurrence matrix) szürkeskálás együttes előfordulási mátrixra épülő (Harlick) jellemzők HOG: Gradiens-irány hisztogram szűrőrendszer Haar jellemzők Szűrőrendszerek(ből számolt jellemzők) HOG Haar
Kiindulási pont: a leírni kívánt objektum Például: körvonal, maszk, maszk alatti képrész Terület: contourarea(kontúr, orientáció); Kerület: arclength(kontúr, zárt-e); Befoglaló téglalap: boundingrect(kontúr); Minimális területű befoglaló téglalap: RotatedRect minarearect(kontúr); Befoglaló ellipszis: RotatedRect fitellipse(kontúr) Befoglaló kör: minenclosingcircle(inputarray kontúr, Point2f& kp, float& sugar);
konvex burok kerülete konvexitás = objektum kerülete cv::convexhull(contour, convhull, false, true ); cirkularitás = terület kerület 2 vagy 4π terület kerület 2 (körre maximális) kompaktság = kerület2 terület vagy 4 terület π átmérő vagy 4π terület átmérő átmérő = max d(p, q) p,q C ekvivalensköratmerő = 2 terület π C: kontúr szálhossz = 0.25(kerület + kerület 2 16 terület) szálszelesség = 0.25(kerület kerület 2 16 terület) excentricitás = főtengely hossza melléktengely hosza Tengelyek meghatározása pl. a befoglaló ellipszis alapján vagy a leghosszabb obj-n belüli szakaszt véve főtengelynek, és arra merőleges leghosszabbat melléktengelynek.
OpenCV-ben Moments m = moments( kép/kontúr, bináris-e?); //bináris-e a kép (kontúrnál alap) Bináris-e: NEM I(x,y) a világosságkód érték, x, y a kép koordinátái Bináris-e: IGEN x, y csak az objektumpontok koordinátái, I (x,y) = 1-nek tekintve Jellemzők: m.mpq, ahol pq: 00, 10, 01, 11, 20, 02, 21, 12, 30, 03 A p+q-adrendű térbeli (geometriai) momentum számítása m pq = x p y q I(x, y) x y Súlypont számítása: C(x, y) = m 10 m 00, m 01 m 00 (Bináris képnél a koordináták átlaga, szürkeskálásnál az intenzitásértékkel súlyozott átlaga)
OpenCV-ben Moments m = moments( kép, bináris-e); //bináris-e: maszk vagy kép Bináris-e: NEM I(x,y) a világosságkód érték, x, y a kép koordinátái Bináris-e: IGEN x, y csak az objektumpontok koordinátái, I (x,y) = 1-nek tekintve Jellemzők: m.mupq, ahol pq: 11, 20, 02, 21, 12, 03, 30 A p+q-adrendű centrális momentum számítása mu pq = (x x) ҧ p (y തy) q I(x, y) x y
OpenCV-ben Moments m = moments( kép, bináris-e); Bináris-e: NEM I(x,y) a világosságkód érték, x, y a kép koordinátái Bináris-e: IGEN x, y csak az objektumpontok koordinátái, I (x,y) = 1-nek tekintve Jellemzők: m.nupq, ahol pq: 11, 20, 02, 21, 12, 30, 03 A p+q-adrendű normalizát centrális momentum számítása mu pq nu pq = 1 + (p + q)/2 mu pq a p+q-ad rendű centrális momentum
OpenCV-ben Moments m = moments( kép, bináris-e); double hu[7]; HuMoments humoments(m, hu); //bináris-e: maszk vagy kép //momentumok tárolására //HU momentumok számítása Normalizált centrális momentumokból számolhatók Affin transzformációkra invariáns (skálázás, forgatásra, ) (digitális világ: az eredeti és az elfogatott/skálázott obejektum HU momentumai különbözhetnek) A tulajdonságaiból következően hasznos pl. ha a felismerendő alakzat forgatás invariáns ne használd, ha a felismerendő alakzatnak fontos a mérete, orientációja
A minták besorolása automatikus módon kialakított osztályokba előre meghatározott jellemzők alapján Előfeldolgozás: minden mintának meghatározzuk a jellemzővektorát (az egyedi jellemzőkből álló n dimenziós vektor) ha szükséges szűrjük, normalizáljuk az adatokat Kmeans K darab középpontok választása ( pl. véletlenszerűen, vagy a priori ismeret alapján vektor) Ciklus, amíg van (érdemi) változás (és az iterációk száma egy határ alatt van): minták besorolása a legközelebbi klaszterbe: a klaszterközéppontot leíró vektor és a mintát leíró vektor távolsága alapján klaszterközéppontok újraszámítása
Olvass be egy képet színesbe Konvertáld át CV_32F-be convertto Konvertáld át CIE Lab színtérbe (lab kép) cvtcolor A képpontokat leíró jellemzők a L, a, b értékek lesznek, tehát a három csatornás, kep.rows kep.cols méretű mátrixból kell egy 1 csatornás, kep.rows*kep.cols 3-as mátrixot gyártani: Mat data = lab.reshape(1, kep.rows*kep.cols) A reshape függvénynek a csatornák (1) és a sorok számát (kep.rows*kep.cols) adatuk meg, az oszlopot automatikusan számolja.
Hozz létre egy kritériumot, ami megadja, hogy hány iteráció után, milyen változás alatt álljon le a K-közép eljárás. Pl: TermCriteria krit( TermCriteria::Type::EPS TermCriteria::Type::MAX_ITER, 100, 0.001); Végezd el a klaszterezést: kmeans( InputArray data, // a jellemzőmátrix int k, // a klaszterek maximális száma InputOutputArray bestlabels, // véletlen középpontnál ez sima üres Mat. TermCriteria krit, //a leállási feltétel int attempt, // kísérletek száma int flag, // inicializálási mód, pl. KmeansFlags::KMEANS_RANDOM_CENTERS, OutputArray centers=noarray() // a klaszterek középpontjai );
A jellemzőmátrix i. sorához a bestlabels.at<int>(i) adja meg a klaszterindexet. A klaszterindexből megkapható a klaszterközépponthoz tartozó jellemzővektor, ami jelen esetben egy CIE Lab beli színvektor (a klaszterre "jellemző" szín): center.at<vec3f>( bestlabels.at<int>(i) ) A jellemzőmátrix i. sora a kép (i / kep.cols, i % kep.cols) pontjához tartozik. ( vs. mátrix sorfolytonos ábrázolása ) Hozz létre egy CV_32FC3, az eredeti képpel azonos képet Járd be a címkéket ( for(int i = 0; i<bestlabels.rows, ++i ) Az eredménykép megfelelő pontjához rendelt hozzá a klaszterre jellemző színt. Konvertáld vissza a képet RGB-be: convertto Konvertáld vissza a képet a [0, 255] tartományra. cvtcolor
Használj egy olyan képet, amelyen többféle textúra látható. Pl.: https://arato.inf.unideb.hu/szeghalmy.szilvia/kepfeld/img/texture.png Töltsd le a az alábbi kódrészletet, mely egy szűrőbankot valósít meg https://arato.inf.unideb.hu/szeghalmy.szilvia/kepfeld/kod/features.zip A MaximumResponse8 függvényét fogjuk használni: Az ábrán egy sorban lévő szűrők egymás elforgatottjai, ezek közül csak annak a szűrőnek az eredményét használjuk, amelyik a maximális választ adja. A függvény szürkeskálás képet vár és 8 képet ad vissza egy vektorban. vector<mat> dest;
Hozz létre egy megfelelő méretű jellemzőmátrixot: sorok száma: összes képpont száma oszlopok száma: 8 ( ha az eredeti kép színes, csatornánként végrehajtva a szűrést 24 jellemzőt is használhatsz ) típus: CV_32F Töltsd fel a mátrix sorait a pixelekhez tartozó jellemzőkkel: Az eredeti kép (x, y) pontjához tartozó jellemzővektort az MR8 által adott eredményképeken lévő (x, y) értékekből kell összeállítanod. Hívd meg a korábbihoz hasonló módon a kmeans függvényt. A klaszter középpontok jelen esetben nem érdekesek.
Megjelenítés Hozz létre egy eredeti képpel azonos méretű képet (CV_8UC3) Hozz létre egy legalább K méretű Vec3b tömböt és töltsd fel véletlenszerű színekkel. Járd be a kmeans által megadott címkéket (korábban bestlabels) Ha a címke értéke [0, K[ tartományba esik, akkor rendeld hozzá a megfelelő képponthoz a címkének megfelelő színt. Egyébként rendelj hozzá tiszta feketét.