Képfedogozás aborjegyzet Sziágyi Lászó 2008
2
Képfedogozás aborjegyzet Tartaom:. gyakorat: Ismerkedés az OpenCV programcsomagga 2. gyakorat: Aritmetikai és geometriai műveetek képekke. A ROI hasznáata 3. gyakorat: Képminőség javítás egyszerű szűrők akamazásáva 4. gyakorat: A medián szűrő 5. gyakorat: Gradiensszámítás, ékeresés 6. gyakorat: Morfoógiai aapműveetek 7. gyakorat: Morfoógiai vázkeresés 8. gyakorat: Transzformációs szűrők 9. gyakorat: Hough transzformáció 0. gyakorat: Képek szegmentáása gobáis információ aapján (az FCM agoritmus). gyakorat: Képek régió aapú szegmentáása: a feosztás és egyesítés módszere 2. gyakorat: Egy egyszerű feügyet tanuású formafeismerő rendszer megvaósítása 3. gyakorat: Egy egyszerű feügyeet néküi tanuású formafeismerő rendszer megvaósítása 4. gyakorat: Laborvizsga 3
-2. gyakorat: Ismerkedés az OpenCV programcsomagga. Aritmetikai és geometriai műveetek képekke. A ROI hasznáata A gyakorat céja A cé az OpenCV programcsomag fiozófiájának esajátítása, meynek ismeretében a hagató könnyűszerre fog képeket kezeni a Visua C++ programkörnyezetben. Megismerkedünk a programcsomag hasznáatához szükséges beáításokka, ietve az OpenCV eemi fogamaiva, mint p. a képek kezeéséhez szükséges IpImage struktúra, vagy a NamedWindow abak. Eméeti áttekintés és a munka menete Az OpenCV egy szabadon hozzáférhető és teepíthető programcsomag, meynek hasznáatáva könnyedén hozzáférhetünk oyan adattípusokhoz, ameyet az egyszerű Visua C++ nem támogat. Iyen adattípus pédáu a bitmap vagy bármey egyéb képformátum. Az OpenCV programcsomag több könyvtárbó á, meyek közü a egfontosabbak a következők: CXCORE: ez a könyvtár tartamazza az aapvető adatstruktúrákat és műveeteket CV: ebben a könyvtárban taáunk meg számos képfedogozási műveetet HIGHGUI: ez a könyvtár tartamazza az OpenCV grafikus fehasznáói feüet (GUI) eemeit és az input/output műveeteket Amikor egy C++ programban az OpenCV könyvtárait kívánjuk hasznáni, eérhetővé ke tegyük a fordító számára a következő áományokat (a Visua C++ 6.0-ás verziójában a Options Directories menüpontban és a projekt beáításaiban, későbbi verziókban pedig csak a projekt beáításaiban ke babráni): Incude fájok: cxcore.h, cv.h, highgui.h Lib fájok: cxcore.ib, cv.ib, highgui.ib Továbbá a étrehozott C++ projekthez hozzá ke inkeni a fennebb emített.ib fájokat. Az OpenCV programcsomag kitűnően ieszkedik minden típusú VisuaC++ projekthez. Egy rossz tuajdonsága viszont van: a képek megjeenítését csak a saját abakaiban támogatja. Az egyszerűség kedvéért a aborgyakoratok keretében Windows32 Consoe Appication típusú projektekke fogunk dogozni, de egy komoyabb projekt esetében kipróbáhatjuk az MFC-hez vaó iesztést is. Nézzünk meg egy egyszerű programot: 4
A fenti program beovas egy képet a memóriába és megjeeníti egy abakban, majd vár egy gombnyomásra, meynek hatására a program véget ér, így a kép etűnik az abakka együtt. A program eső három sora azt jezi a fordítónak, hogy az OpenCV könyvtárait szeretnénk hasznáni a programunk megvaósításához. A main függvény öt utasításbó á: Az eső utasítás betöti az ama.bmp nevű fájt, mint intenzitásképet, a memóriába és étrehoz egy IpImage típusű struktúrát, ameyben később eérhetőek esznek a képnek az adatai. Ezt a struktúrát hozzárendei az image nevű mutatóhoz. A második utasítás étrehoz egy oyan Abak nevű abakot, mey automatikusan átméretezi magát a beé heyezett kép méretéhez, ietve a képernyő febontásához ieszkedően. Az abakot a nevén szóítjuk, amikor vaamiyen dogunk esz vee. A harmadik utasítás megmutatja a betötött képet a étrehozott abakban. A negyedik utasítás vár egy gombnyomásra. Az ötödik utasítás, C++ tagozatos jómunkásember módjára feszabadítja a kép áta efogat memóriát. Ha ezt nem tesszük meg, ez a programunk tökéetesen fog működni, de ha később sokka fontosabb pianatokban is efeejtjük feszabadítani a memóriát, abbó már könnyen ehet probéma (p. Out of memory üzenet). Ne feedjük: a képek átaában sok memóriát foganak! Egy egyszerű feadat: vaósítsunk meg egy mozifim effektust! Feadat: Tötsünk be két képet. Képzejük e, hogy egy mozifimben véget ér egy jeenet az eső képpe és következne a következő jeenet, ameyik a másik betötött képpe kezdődik. Jeenítsük meg egy abakban az átmenetet a két jeenet között, mégpedig úgy, hogy a képet nem egyszerűen ecseréjük, hanem fokozatosan tüntetjük (sötétítjük) e az esőt és hozzuk be heyette a másikat. A műveet, meyre szükségünk van, az a súyozott összeadás. Próbájuk ki, hány átmenetre van szükség ahhoz, hogy a szemünk foytonosnak higgye a vátozást. A súyozott összeadást végrehajtó utasítás a cvaddweighted(src,weight2,src2,weight2,bias,dst), az utasítás áta evégzett műveet pedig a dst = src*weight + src2*weight2 + bias. A ROI hasznáata Módosítsuk az eőző programot úgy, hogy a képnek csak a ba vagy a jobb odaát (feét) cseréjük e a mozi effektus hasznáatáva. Ehhez szükségünk esz a ROI (region of interest) hasznáatára. Az OpenCV a következő szabáyok szerint képes ROI-t hasznáni: Egy ROI mindig tégaap aakú Egy képen egyszerre maximum egy ROI ehet Ha ROI-t heyezünk egy képre, akkor az eőzőeg rajte evő ROI automatikusan megsemmisü A képre rá ehet tenni bármey oyan tégaap aakú ROI-t, meynek széessége és magassága egaább képpont, és nem óg ki a kép terjedemébő. Egy ROI-nak egy képre vaó ráheyezéséhez egyszer étre ke hozni egy CvRect típusú objektumot (p. CvRect r = cvrect(x,y,w,h)), aho a cvrect paraméterei sorra 5
a tégaap ba feső képpontjának vízszintes és függőeges tengey menti koordinátája, a tégaap széessége és magassága. Ha a CvRect típusú objektum étrejött, az átaa eírt méretű ROI-t a cvsetimageroi(image,r); utasítássa heyezzük rá az image pointer áta mutatott képre. Egy képrő a rajta evő ROI-nak az etávoításához nem ke ismerjük a ROI méretét. Csupán meghívjuk az aábbi utasítást: cvresetimageroi(image); A képen evő ROI-t e is ehet kérdezni a cvgetimageroi( ) utasítássa. Ezt az utasítást egyszerű fehasznáóként ritkán hasznájuk. 6
3. gyakorat: Képminőség javítás egyszerű szűrők akamazásáva A gyakorat céja Céunk megismerkedni a konvoúciós szűrők működéséve, hatásáva, hatékonyságáva, eőnyeive és hátrányaiva. Eméeti áttekintés és a munka menete Az egyszerű szűrők kategóriájába sorojuk a konvoúcióva számított, vagy más néven maszkos szűrőket, meyekke képminőség javítást kívánunk eérni. Egy konvoúciós szűrés megvaósításához három épésre van szükség:. Beírjuk egy tömbbe a maszk együtthatóit P. doube mask_data[9]={.,.,.,.,.2,.,.,.,.}; 2. Létrehozunk egy OpenCV-s mátrix típusú adatot a maszk együtthatóiva: P. CvMat mask = cvmat(3,3,cv_64fc,&mask_data); A fenti cvmat( ) utasítás paraméterei azt mutatják, hogy a maszk 3 sorbó és 3 oszopbó á, ietve 64 bites ebegőpontos adatokbó tevődik össze, egy csatornás mátrix esz minden maszk egycsatornás meyek a mask_data nevű vátozó címéné taáhatók a memóriában. 3. Megszűrjük a bemeneti képet a étrehozott maszkka: P. cvfiter2d(src,dst,&mask); A szűrést végrehajtó utasítás paraméterei: src a bemeneti kép, dst a kép ahova az eredmény kerü, &mask az akamazott maszk címe. Feadatok:. Vaósítsunk meg egy au áteresztő szűrőt, meynek maszkja 3x3 képpontbó á, a benne evő együtthatók egyformák. Akamazzuk egy jó éességű bemeneti képre a szűrőnket egymás után egaább 0 akaomma, minden szűrés után nézzük meg az eredményt. Ismétejük meg a szűrés sorozatot egy oyan képen, ameyet eőzőeg fehér és fekete képpontokka (só és bors jeegű zajja) fertőztünk meg. Nézzük meg, mennyire hatékonyan távoítja e a zajt az au áteresztő szűrő, és mekkora árat fizetünk a kép éességébő. Enné a feadatná az egymás utáni szűrések a korábbi szűrés eredményét szűrik tovább. 2. Vaósítsunk meg egy feü áteresztő szűrőt paraméterezhető maszkka. Legyen a maszk 0 k 0 k + 4k k 0 k 0, aho k>0. Szűrjünk meg egy homáyos fényképet ezze a feü áteresztő szűrőve, akamazzunk egyre nagyobb k értéket. Vigyázat, itt mindig az eredeti képet szűrjük, nem a korábbi szűrés eredményét. Áapítsuk meg, mekkora k értékre esz a kép a egjobb átvány a szemünknek. Természetesen ez függ a képtő és a szeméőtő egyaránt. Nézzük meg, mennyire zajos esz a kép nagy k érték esetén. 3. Építsük be a ROI hasznáatát a programjainkba. Pédáu készítsünk oyan képesapot, meynek a közepén egy jó kiéesített, széein pedig nagyon e van homáyosítva a kép. Aapanyagként hasznáhatjuk a közprédára adott heideberg.jpg képet, mey jeentős mértékű esőzés miatt megehetősen homáyosra sikerü. 7
4. gyakorat: A medián szűrő A gyakorat céja Céunk megismerkedni a medián szűrőve és a cvsmooth utasítás többi beépített szűrőjéve. Továbbá megvaósítunk egy saját medián szűrő verziót és ecsodákozunk azon, hogy az OpenCV megakotói mennyive gyorsabb megvaósítást hoztak össze. Eméeti áttekintés és a munka menete A medián szűrő minden fedogozandó képpont négyzet aakú, szimmetrikusan eheyezkedő szomszédságábó váasztja ki a medián intenzitású képpontot, és ennek a szomszédnak a színe esz az aktuáis képpont színe szűrés után. A medián eem egy hamazban nagyság szerint a középső. Tehát egy 3x3-as szomszédságga dogozó medián szűrő kienc darab nagyság szerint rendezett szám közü váasztja ki az ötödiket, az 5x5-ös 25 közü a 3-dikat, a 7x7-es 49 közü a 25-ödiket, stb. Az OpenCV-ben van egy beépített utasítás, meye simító szűrőket ehet végrehajtani. Ez az utasítás a cvsmooth( ). Hasznáata a következőképpen történik: cvsmooth(src,dst,cv_median,size) utasítás egy medián szűrőt vaósít meg, mey size*size méretű környezetben ügyködik. Magátó értetődő doog, hogy a size csak páratan szám ehet; cvsmooth(src,dst,cv_blur,size_x,size_y) utasítás egy au áteresztő szűrőt vaósít meg, mey egyenetes eoszású size_x*size_y méretű maszkka dogozik. A maszk nem köteezően négyzet aakú, de a méretei szintén páratan számok ke egyenek; cvsmooth(src,dst,cv_gaussian,size_x,size_y) utasítás egy au áteresztő szűrőt vaósít meg, mey size_x*size_y méretű maszkka dogozik, de a maszk együtthatói nem egyenetes eoszásúak, hanem egy haranggörbe szerint vannak eosztva. A maszk nem köteezően négyzet aakú, de a méretei szintén páratan számok ke egyenek. Vannak további ehetőségei a cvsmooth( ) utasításnak, de ezekke a aborgyakorat keretében nem fogakozunk. Feadatok:. Vaósítsunk meg egy egyszerű programot a medián szűrő hatásainak tanumányozására. Próbájuk ki az eőző gyakoratban hasznát só és bors jeegű zajja fertőzött kép szűrésének hatékonyságát. Áapítsuk meg, mire képes egy 3x3-as, egy 5x5-ös, egy 7x7-es szűrő ezen a téren. 2. Rajzojunk egy kétszínű képre egy cikkcakkos amőbát, majd szűrjük meg egymás után sokszor egy nagy méretű szomszédságga dogozó medián szűrőve (p. 2x2 vagy még nagyobb). Figyejük meg, hogyan vátoztatja a szűrés az amőba aakját. Házi feadat: Írjunk egy oyan programot, ameye 3x3-tó egaább 7x7-esig váasztható méretű szomszédságga dogozó medián szűrőt tudunk végrehajtani egy csatornás intenzitásképen. 8
Segítség: az image kép (x,y) koordinátájú képpontjának intenzitásához hozzáférhetünk UCHAR típusú adatként az image->imagedata[y*image->widthstep+x] tömbeem ovasásáva, vagy megvátoztathatjuk a képpont intenzitását az ugyanannak a tömbeemnek az írásáva. Mérjük meg, hányszor gyorsabban dogozik a beépített medián szűrő. 9
A gyakorat céja 5. gyakorat: Gradiensszámítás, ékeresés Céunk megismerkedni a egegyszerűbb gradiens számító ejárásokka, azok eredményéve. Továbbá megtekintjük az OpenCV beépített Canny szűrős ékereső programját. Eméeti áttekintés és a munka menete Jeen abor keretében visszatérünk a maszkos szűrőkhöz. Újabb maszkcsaádot fogunk kipróbáni, meye a kép gradiensét fogjuk kiszámítani küönböző irányokban. Tekintsük a következő maszkokat: M vp = 0 0 0 M vn = 0 0 0 M fp = 0 0 0 = 0 Ha ezekke a maszkokka megszűrünk egy képet, a következőket fogjuk átni: Bármiyen aapszínű képet szűrtünk meg, a gradiens kép aapszíne fekete esz, meyen viágosabb színű vonaak esznek jeen. Az eső két maszk akamazása esetén inkább a függőeges irányú vonaak esznek áthatóak, a második két maszk esetében főeg a vízszintes vonaak. Az eső két maszk áta feismert függőeges éek kiegészítik egymást: az eső maszk azokat az függőeges éeket teszi áthatóvá, ameyeknek a jobb odaán viágosabb régió van mint a baon, míg a második azokat, ameyeknek a jobb odaán van a sötétebbik régió. Ugyanez érvényes a másik két maszkra, egy kis módosítássa: a harmadik maszk azokat a vízszintes vonaakat teszi áthatóvá, meyek aatt viágosabb régió van mint fööttük. A negyedik maszk pedig a feü viágos au sötét esetben aktiváódik. A fenti magyarázat magyarázata: az OpenCV eggyakrabban hasznát kódoású képe nem táro negatív számokat. Az eső két maszk egymás inverze, tehát ha egy pozícióban az egyik pozitív értéket számo, akkor a másik biztos negatívat. A negatív értékek viszont nuában szaturáódnak, azaz etűnnek. Az iyen éeket az azonos irányú éeket detektáó másik maszk képében ke keresni. Mive a viágos szín intenzitása nagyobb mint a sötété, a viágosbó kivonva a sötétet kapunk egy pozitív azaz átható éet. Ezért van az, hogy az aső maszk a jobb odat viágos ba odat sötét esetben aktív és nem fordítva. Feadat Számítsuk ki egy kép gradiensét mind a négy maszkka. Nézzük meg mind a négy eredmény képet, majd adjuk össze (vagy átagojuk) az eső kettőt és a második kettőt, s nézzük meg az így kapott két képet. Az egyiken az összes függőeges és ahhoz közei irányú vonaat átni fogjuk, a másikon pedig a többnyire vízszinteseket, de mindet. Ha pedig ezt az utóbbi két képet is összeadjuk (vagy átagojuk), kapunk egy képet meyen az összes é jeen van. Megjegyzés: ezekke a maszkokka enyhén kedveztünk a függőeges és vízszintes vonaaknak a ferdékhez képest, a eghátrányosabban kezet irány a fő- és meékátó iránya, de a megküönböztetett figyeembe vétet szabad szemme nem nagyon ehet észrevenni. M fn 0 0 0
Észrevehetjük, hogy az így kapott éek többnyire nem vékonyak, érdemes őket kivékonyítani. Hogyan? Eső próbákozásként pédáu egy vágássa: az aacsony értékű gradienseket tüntessük e a képrő. Vannak kifinomutabb technikák is, p. a Canny szűrő áta akamazott non-maximum suppression, azaz a nem maximáis értékű éek enyomása. Ettő viszont szakadozottá tudnak váni az éek s utóag pótoni ke majd őket. Nézzük meg az OpenCV édetektáó pédaprogramját (edge.exe), meyben Canny szűrőt akamaz színes képekre. A küszöbérték vátoztatásáva beáíthatjuk, hogy miyen erősségű éek jeenéte kívánatos még a képen és meyeket ke enyomni.
A gyakorat céja 6. gyakorat: Morfoógiai aapműveetek Céunk megismerkedni a morfoógiai műveeteive, azok hasznosságáva és megvaósítóságáva OpenCV környezetben. Eméeti áttekintés Az aapvető morfoógiai műveetek evégzésére az OpenCV egy tejes utasításarzenát hozott étre. Kezdjük a egegyszerűbbe és haadjunk a kompikát utasítások feé:. Amennyiben egy egyszerű szűkítés (erózió) vagy tágítás (diatáció) az evégzendő műveet, és beérjük az aapértemezett 3x3-as méretű négyzet aakú strukúráó eem hasznáatáva, akkor nagyon egyszerű dogunk van. Az aábbi műveeteket ke iyenkor végrehajtani: cverode(src,dst,null,times); cvdiate(src,dst,null,times); aho a NULL azt jeöi, hogy nincs saját gyártmányú strukturáó eemünk, a times pedig egy természetes szám ami megmondja, hányszor akarjuk egymásután végrehajtani az adott műveetet. 2. Egy strukturáó eem étrehozása egy kicsit kompikátabb műveet: IpConvKerne* b=cvcreatestructuringeementex( size_x, size_y, origin_x, origin_y, shape); Az eső két paraméter a strukturáó eem méretét hivatott beáítani, a második kettő az origóját, a shape vátozó pedid az aakját. Ez utóbbi értéke ehet CV_SHAPE_RECT (tégaap vagy négyzet), CV_SHAPE_ELLIPSE (eipszis), vagy CV_SHAPE_CROSS (kereszt). Egy szimmetrikus szerkezetű strukturáó eem eső négy paramétere (2m+,2n+,m,n, ) ke egyen, aho m nemnegatív egész szám. 3. Ha készítünk egy saját strukturáó eemet, azt be ehet vetni akár az egyszerű szűkítés és tágítás műveetekné, akár a kompikátabbakná. Péda az egyszerű esetre: cverode(src,dst,b,2); cvdiate(src,dst,b,3); 4. Összetett morfoógiai műveetek végzésére van egy gyűjtőnevű utasítás: cvmorphoogyex(src,aux,dst,b,command,times); Magyarázatok az eddig ismereten paraméterekhez: Az aux egy ugyanoyan típusú és méretű kép, mint az src és dst. Legegyszerűbb kónozni egyet vaameyikbő. A command mondja meg, hogy miyen műveetet végzünk: ennek értéke ehet: o CV_MOP_OPEN vagy CV_MOP_CLOSE: ezek a nyitás és zárás műveetei: iyenkor a times azt mondja meg, hogy hányszor végezzük e eőbb az eső, majd a második műveetet. 2
o CV_MOP_GRADIENT: ez a műveet a tágított képbő vonja ki a szűkített képet. Egy- és többcsatornás intenzitásképekné ez egy gradiens számítási ev, ugyanis mindig az adott képpontnak (a strukturáó eemme azonos méretű) szomszédságában taát maximumbó vonódik ki a minimum érték, ez pedig eég jó jeemzi az adott képpont közeében evő intenzitásvátozást. Kis méretű strukturáó eem hasznáatáva akamas ékeresésre. o CV_MOP_TOPHAT és CV_MOP_BLACKHAT: az esőve sötét aapon evő viágos kukacokat, a másodikka viágos aapon evő sötét kukacokat ehet detektáni. A munka menete. Kíséretezzünk a morfoógiai aapműveetekke bináris és intenzitásképeken. Mutassuk ki a nyitás és zárás aakformáó hatását. 2. Nézzük meg egy intenzitáskép morfoógiai gradiensét, hasonítsuk össze a Sobe maszkka számított gradiensse. 3. Készítünk egy akamazást sötét és/vagy viágos kukacok feismerésére tophat vagy backhat transzformáció segítségéve. Ha ez nem jön össze, nézzünk meg egy kész verziót. 3
7. gyakorat: Morfoógiai vázkeresés A gyakorat céja Írjunk egy programot, mey megvaósítja a hit-or-miss transzformációt. Ennek segítségéve vaósítsunk meg egy vázkeresést bináris képeken. Eméeti áttekintés A hit-or-miss transzformáció nincs ekódova az OpenCV-ben: ha iyen műveetet akarunk végezni, meg ke írnunk a saját verziónkat. Lehet, hogy kissé assú esz, de nem nehéz megvaósítani. Az vázkeresés körbeégetéses módszerét szimuáó, a Goay L betűs maszkjait hasznáó módszert fogunk megvaósítani. Hozzávaók: Hit-or-miss transzformáció, Goay ábécé L maszkjai, egy bemeneti kép fekete aapon fehér tárgyakka. Bemeneti rajz: egy képre rajzojunk néhány aakzatot. Az aábbi képen még van sok fekete hey, szóva enné többet is ehet rajzoni. A kép széén ne egyenek fehér pontok... A Goay ábécé L maszkjaiva ke hit-or-miss transzformációt végezni mindaddig, amíg egy tejes cikusban (8 maszk kipróbáása az összes fehér képponton) nem taáunk egyeten etörendő pontot sem. Egy ehetséges megodás átható aább, csak cvreeaseimage( ) utasítások hiányoznak beőe. A fenti képre vaami iyesmi jön ki: 4
5
Amennyiben másik maszkcsaádot kívánunk akamazni, e ke cseréni a Goay konstanstábát, és máris működik Viszont az nem vázat fog számoni. 6
8. gyakorat: Transzformációs szűrők A gyakorat céja Megismerkedünk a Diszkrét Fourier Transzformáció segítségéve eérhető képminőség javító ejárásokka. Mive egy iyen program megvaósításához szükséges idő nem kompatibiis a abortevékenység időtartamáva, egy kész programot fogunk esettanumányként részetesen eemezni: egy 2007-es ketezésű dipomaterv keretében megvaósított ujjenyomat feismerő rendszert fogunk megtekinteni. Eméeti áttekintés és gyakorati munka A programrendszer három fő feadatot át e, meynek számos részfeadata is van. Ezeket részetezzük az aábbiakban: Egy interneten megtaáható adatbázisban szerepő ujjenyomatok képminőség javítása DFT és IDFT hasznáatáva o Feosztottuk az ujjenyomatot és szemetet tartamazó intenzitásképet kis (kb. 25x25 képpontnyi), egymást részben efedő négyzetekre. Ezekben a négyzetekben ún. huámmode segítségéve akarjuk megközeíteni a jeen evő vonaakat: ez azt fetéteezi, hogy minden kis négyzetben van egy domináns irányú vonuat. o Úgynevezett short term DFT transzformációt hajtottunk végre minden kis négyzet besejében. o A kapott Fourier komponensek között megkerestük a domináns értéket és egy rendkívü restriktív szűrést hajtottunk végre, ami minden egyéb komponenst jeentős mértékben enyomott. Időközben intenzitás és iránydiagrammok is készütek. o A szűrés után megmaradt frekvencia tartományú komponenseket visszaaakítottuk IDFT ejárássa. o A kapott ábrán végrehajtottunk egy vágást: így a DFT aapon történő szűrés végeredménye egy bináris kép. Jeegzetes pontok (eágazások és végződések) keresése morfoógiai módszerekke o A fejavított minőségű, bináris ujjenyomat képeken a sötét vonaakat kivékonyítottuk a vázkeresés módszeréve. o A vázkeresés eredményeként rövid tüskék is maradtak meg a tényeges vázon kívü, meyek a vázbó nőttek ki. Ezek etávoítására akamaztunk egy morfoógiai végződéskereső és JSzPL 2 -aapú módszert. o A tüskéktő megszabadított vázakon morfoógiai végződéskeresést és egy átaunk kidogozott morfoógiai eágazás keresést hajtottunk végre. o Így végüis kijeöhettük az adott ujjenyomaton a feismert jeegzetes pontokat. A megtaát jeegzetes pontok aapján egy kis adatbázisbó a eginkább hasonó ujjenyomat megtaáása o Rengeteg geometriai számítást és JSzPL-aapú inteigenciát akamaztunk az azonosításhoz Néhány ábrán szemétetjük a végzett műveetek rész- és végeredményét: Váradi Róbert műve 2 JSzPL = józan székey paraszt ogika 7
A STFT OpenCV utasításokka vaó evégzéséhez szükséges szinusz és koszinusz tábák Egy eredeti ujjenyomat, az ő fejavított verziója, ietve a részeredménynek számító vonuati, enregia és koherencia kép, vaamint a majdnem végeges rekonstruát kép A tüskék jeenéte, a tüskék etávoítása utáni áapot, ietve a feismert eágazások és végződések heye 8
Ugyanazon ujjenyomat két küönböző eforgatási pozícióban, ietve a megtaát és meg nem taát hasonóságok 9
9. gyakorat: Hough transzformáció A gyakorat céja Megvaósítunk egy Hough transzformációs ejárást a képen taáható, nagyjábó ismert méretű körök feismerésére. Eméeti áttekintés és gyakorati munka A Hough fée transzformáció egy oyan ejárás, meye egyeneseket, köröket és egyéb anaitikus egyenette rendekező aakzatokat ehet egy képen detektáni. Eőnye, hogy a szakadozott éek nem zavarják. Egyenes detektáása Hough transzformációva: Az egyenes anaitikai egyenete y=ax+b, vagy inkább poáris koordináták szerint x cos θ + y sinθ = r. Ez utóbbi képetben r az origóbó az egyeneshez húzott merőeges hossza, θ pedig a merőeges és az Ox tengey áta bezárt szög. Mindez e vot rajzova a tábán. Hough megfigyete, hogy ha az egyenest nem az xy síkban, hanem az r θ síkban ábrázoja, annak képe egyeten pont esz. Ebbő kiinduva akotta meg Hough az egyenes detektáásának agoritmusát. Ennek épései:. Az eredeti képen efuttatunk egy édetektáó agoritmust (p. Canny szűrő). Ez esz az eőfedogozás, meynek során kapunk egy képet, meyen sok szakadozott é esz. 2. Ferajzojuk az r θ síkot, és kvantájuk mindkét mennyiséget, p. az r távoságot képpontban, a θ szöget fokban. Ekészítünk egy 2-D tábázatot, meyben minden egyes rekesz (cea) egy adott r és egy adott θ kvantát értéknek fee meg. 3. Sorba vesszük az éeket tartamazó kép épontjait, és a rajta potenciáisan áthaadható összes egyenest (minden ponton keresztühaad 80 db egyenes, ha θ -t fokonként kvantátuk). Minden iyen egyenes Hough transzformátja egy pont esz. Minden iyen pont után az r θ síkban a neki megfeeő ceában eheyezünk egy markert. 4. Miután minden iyen éponton végigmentünk, megkeressük, hogy az r θ sík meyik ceájában van a egtöbb marker. Ennek a ceának megfeeő egyenes esz a egreevánsabb az eredeti képen a Hough transzformáció szerint. Amennyiben kör detektáása a céunk, akkor annak az egyenetébő induunk ki: 2 2 2 ( x a) + ( y b) = ρ = r, aho a és b meghatározza a kör közepét, ρ pedig a kör sugara. Ennek megfeeően a Hough transzformát sík heyett 3-D terünk esz, meynek dimenziói az a, b és r. Minden potenciáis körnek az eredeti síkban megfee egy pont a Hough transzformát térben, meynek koordinátái (a,b,r). Az ejárás evieg ugyanaz mint az eőbb, gyakoratiag abban küönbözik, hogy az édetektát kép épontjainak minden pontjára a potenciáisan jeen ehető összes kört ke figyeembe vennünk és transzformánunk a Hough térbe. A kvantát Hough tér ceái közü megint azt váasztjuk ki, meynek a egtöbb markere van. Ennek aapján be tudjuk rajzoni az eredeti képre a detektát, szakadozásoktó mentes kört. Ha egy adott sugarú kört keresünk, akkor a Hough térbő kihagyhatjuk az r dimenziót, s így csak ab síkunk esz. Feadat: Írjunk meg egy oyan programot, amey köröket keres a bemeneti képen. Fetéteezzük, hogy adott sugarú kört keresünk a képen. A bemeneti képre eőzetesen tényeg rajzojunk rá egy néhány, küönböző méretű képet. 20
0. gyakorat: Képek szegmentáása gobáis információ aapján A gyakorat céja Megvaósítunk egy gyors, hisztogram aapján működő gyors ejárást intenzitásképek szegmentáására. Eméeti áttekintés és gyakorati munka Jeen módszer céja, hogy a képen taáható N db képpontot ossza szét c db osztáy között úgy, és a c db osztáynak váasszon optimáis intenzitásértéket úgy, hogy a szétosztás optimáis egyen, azaz miné jobban megfeejen egy négyzetes kritériumfüggvény gobáis minimum értékének. Legyen c az osztáyok száma, indexként hasznáunk i-t vagy j-t; i,j= c. Legyen q az eredeti képben az intenzitásértékek száma, indexként hasznájuk a -et, = q. Legyen N a képpontok száma, indexként hasznájuk k-t, k= N. Legyen γ = [HIST(f)](), azaz az eredeti képbő az -e megegyező intenzitású képpontok száma. Jeöjük vi -ve az i-dik osztáyhoz tartozó prototípus színt, amit az agoritmus számo. Jeöjük ui -e az -e megegyező intenzitási képpontok i-dik osztáyhoz viszonyított fuzzy tagsági c függvényét. Érteemszerűen, definíció aapján: u i =, bármey = q esetén. Kötségfüggvényünket a következőképpen vesszük fe: i= J = c q i= = γ p ui ( v ) i 2, aho p egy konstans vaós szám, konvergencia érdekében p>. Ennek a kötségfüggvénynek a minimumát keressük, szükségünk van Lagrange szorzók bevezetésére, azaz c q q c = p [ 2 F γ ui ( vi ) ] + λ ui. i= = = i= Ennek az eső, dupa szummás tagja az eredeti kötségfüggvény, a második szummás tagja pedig egyérteműen NULLA, de a deriváásokná nagy szükségünk esz rá. Derivájuk a Lagrange mutipikátort u i és v i szerint, s a derivátakat egyenővé tesszük 0-va. δf p 2 = pγ ui ( vi ) λ = 0, δui innen azt kapjuk, hogy p 2 p λ u i = ( vi ). pγ c Ezek után a u i = fetéte segítségéve kiküszöböjük a λ értéket, s kapjuk azt, hogy i= 2 = c p vi u i. j= v j A másik derivátbó a következőket kapjuk: 2
22 ( ) = = = 0 ) ( 2 q i p i i v u v F γ δ δ = = = q p i q p i i u u v γ γ. Ezek után fogamazzuk meg az agoritmust:. Iniciaizáás: i v -ket egyenetesen szétszórjuk az kép intenzitás értéktartományában, az i u értékek kezdeti értéke egyen /c, hogy egyenetes egyen és eeget tegyen a fetéteeknek. 2. Kiszámítjuk a hisztogramját az eredeti képnek, megkapjuk a γ értékeit. 3. Kiszámítjuk a kötségfüggvény értékét. 4. Frissítjük a fuzzy tagsági függvények értékét: 2 = = c j p j i i v v u, aho i=...c, =...q. 5. Frissítjük az osztáyokhoz hozzárendet optimáis színek értékeit: = = = q p i q p i i u u v γ γ,, aho i=...c. 6. Kiszámítjuk újra a kötségfüggvény értéket, s ha jeentősen csökkent, akkor visszaugrunk a 4. pontra, küönben jön a 7. pont 7. Minden egyes = q szín esetében megvizsgájuk, hogy meyik i= c osztáyhoz viszonyított tagsági függvénye a egnagyobb. Ameyik a egnagyobb, abba az osztáyba fogjuk osztáyozni az iyen színű képpontokat. Eredmény: Egy mágneses rezonanciás agyi metszet, 256 szín, 3 osztáy esetén: Egy fénykép, 256 szín, 8 osztáy esetén:
. gyakorat: Képek régió aapú szegmentáása: a feosztás és egyesítés módszere A gyakorat céja Megvaósítunk egy régió aapú szegmentáást, meyet a feosztás és egyesítés módszeréve fogunk evégezni. Eméeti áttekintés és gyakorati munka Mindenek eőtt ki ke taáni egy homogenitási kritériumot, amive meg tudjuk áapítani a kép bármeyik fotjáró, hogy homogén-e. Kiinduásként négyzet aakú képet hasznáunk, meynek széessége és hossza 2 hatványa ke egyen (p. 256x256 képpont). Ha ennek a fetétenek nem fee meg a kép, akkor ki ke egészíteni au és/vagy jobb odaon. Ha ezek megvannak, akkor egy hierarchikus struktúrát, egy úgynevezett kvadrikus fát hozunk étre, ameyben nyivántarthatjuk a feosztás során keetkező régiókat. A feosztás agoritmus a következő: Megnézzük, hogy a tejes kép homogén-e? Ha igen, akkor a tejes kép egy régió, ha nem akkor vízszintesen és függőegesen kettévágjuk középen, és mind a 4 keetkező részt aávetünk ennek a homogenitási vizsgáatnak. Ameyik rész homogén, azt kinevezzük régiónak, ameyik nem homogén azt tovább bontjuk további 4 egyforma részre. Ezt mindaddig foytatjuk, amíg minden darabka homogén nem esz. Biztosan taáunk homogén részeket akkor, amikor a régió már csak egy képpontbó á (egy képpont önmagában garantátan homogén). A feosztás egy nagyon gyors műveet, az egyesítéshez viszonyítva az időtartam tejesen ehanyagoható. A feosztás során keetkező régiókat feírjuk egy istára. Az egyesítés a következő agoritmus szerint működik: A régiók istáján keresünk oyan régió párokat, ameyek szomszédosak. Ha taátunk szomszédos régiókat, megvizsgájuk a homogenitási kritérium segítségéve, hogy ha egyesítenénk őket, akkor együttesen homogének ennének-e? Ha igen, akkor egyesítjük őket. Ezután újabb szomszédos régió párost keresünk, stb Amikor végigjártuk a tejes istát és nem taátunk egyesíthető párost, akkor vége van az egyesítésnek. Utófedogozás: a nagyon kis méretű régiókat egyesítjük nagyobb szomszédaik közü azza, ameyikhez a eginkább ieszkednek homogenitás szempontjábó. Ez a módszer nem a gyorsaságáró híres, de jó minőségű szegmentáást végez, ezért érdemes vee fogakozni. Aább átható egy szegmentát szürkeáomány darabka egy MRI agyi fevétebő. 23
2-3. gyakorat: Egy egyszerű formafeismerő rendszer megvaósítása: feügyeette tanuó rendszer és feügyeet nékü tanuó rendszer A gyakorat céja Képi információbó kinyerhető jeemzővektorok osztáyozását vaósítjuk meg, feügyeette és feügyeet nékü tanuó rendszerre egyaránt. Eméeti áttekintés és gyakorati munka Tekintsük az aábbi képet: Ebben a képben megtaáható: a feső sorban 0 db béka, a középső sorban 0 db kacsa, az asó sorban pedig 0 db ufó. A képek egyeséve 54x54-es rekeszekben vannak eheyezve, mindegyik rekeszben egy képpontnyi vastagságú technoógiai keret veszi közre az 52x52 képpontnyi képeket. Ezeknek a képeknek egyenként ki ke nyerni a jeemzőiket és jeemzővektorba ke soroni. A javasot hat darab jeemző a három színcsatornához rendehető átagos intenzitás (µ R, µ G, µ B ) és az intenzitás négyzetes szórása (σ R, σ G, σ B ). Ezekek könnyűszerre ki ehet nyerni a nagy képre ráheyezve a kis képet kiváasztó ROI-t és efuttatva a cvavgsdv( ) utasítást. Az evégzendő osztáyozási feadat Feügyeette tanuó rendszer esetén tanítsunk meg egyeten perceptront (vagy egy komoyabb szerkezetű neuráis háózatot), hogy a feső két sorban evő 20 adatot heyesen osztáyozza. Ezek után eenőrizzük az osztáyozás heyességét a harmadik sor ufóiva, meyek közü eég sokat emberi szemme ránézésre be tudunk soroni. Kíséretezzük ki azt a minimáis mennyiségű jeemzőt, amey a feső két sor eemeit képes szétváasztani. Nem ke hozzá mind a 6 jeemző. Feügyeet nékü történő osztáyozáshoz vaósítsunk meg egy vagy több egyszerű kaszterező ejárást a kinyert jeemző vektorok hasonóság vagy küönbség aapján történő osztáyozásához. Javasot módszer a szekvenciáis kaszterezés (meynek küszöbértékéve számos kíséretet e ehet végezni), vagy az FCM (fuzzy c-means) vagy HCM (hard c-means) agoritmus. 24