Vannskilletransformen implementert i C++/Python. Reidar Øksnevad
|
|
- Sunniva Caspersen
- 6 år siden
- Visninger:
Transkript
1 Vannskilletransformen implementert i C++/Python Reidar Øksnevad (reidarok@ifi.uio.no) 1
2 Introduksjon Morfologisk segmentering handler for det meste om vannskilletransformen. Denne enkle og intuitive løsningen har de siste 15 årene vokst fram til å bli en svært populær tilnærming. Dens nøyaktighet og klare definisjon har gitt den en stjerne blant annet i medisinsk bildebehandling, der små feil kan få alvorlige konsekvenser. I denne oppgaven forsøker jeg å implementere en kjent algoritme for vannskilletransformen som ble presentert av Luc Vincent og Pierre Soille, to storheter innen morfologien, i Transformen programmeres i C++, men målet er at den ferdigkompilerte koden skal kunne benyttes direkte i skriptspråket Python. Jeg forsøker å lage et rammeverk som ikke bare skal kunne brukes til vannskilletransformen, men som også kan utvides til å bli en generell Python modul for morfologiske bildeoperasjoner. Jeg kommer derfor til å sette en del fokus på det programmeringstekniske, og spesielt hvordan Python kan kombineres med kompilert kode. Historisk Når man leser tekster om matematisk morfologi er det lett å få følelsen av at det er en lite gruppe med eksperter som har stått for de fleste fremskrittene. At de også er franske, og på en eller annen måte tilknyttet Ecole des Mines i Paris, er også påfallende. Begrepet "matematisk morfologi" ble til på midten av 1960 tallet i forbindelse med at Georges Matheron og doktorgradsstudenten Jean Serra jobbet med analyse av porøse medier for et gruveselskap. Etter noen få år opprettet Matheron en avdeling på L'Ecole des Mines: Centre de Morphologie Mathematique. Dette senteret har stått for mange av de viktigste bidragene til morfologien, og er fortsatt en stor ressurs på området. I mange år foregikk nesten all morfologisk forskning i Frankrike. På åttitallet forandret dette seg imidlertid raskt. I 1982 ga Jean Serra ut boken "Image Analysis and Mathematical Morphology", som demonstrerte et relativt enkelt sett med morfologiske operasjoner, som allikevel hadde stor slagkraft. Det var kanskje denne som var selve hovedgrunnen til at matematisk morfologi spredte seg og ble en viktig tenkemåte innen bilde og signalbehandling. Spesielt viktig for utbredelsen var det at forskere i USA fattet interesse for temaet. 2
3 Konseptet med vannskilletransformen ble introdusert av D. Digabel og C. Lantuéjoul i Dette var noe de kom fram til mens de analyserte tverrsnitt av steinprøver, som kan sees på som tverrsnitt i topografiske landskaper. Vannskillelinjene er kantene som går mellom bassenger i et topologisk landskap. Transformen ble formalisert året etter av Lantuéjoul i samarbeid med S. Beucher, og det var de som først benyttet seg av konseptet til det som det brukes til i dag: segmentering. Det ble etter hvert utviklet programvare og spesialdesignet maskinvare som segmenterte bilder med vannskilletransformen. Det var imidlertid et stort problem som hindret utstrakt bruk: den krevde tunge beregninger og brukte dermed altfor lang tid til at det var nyttig til noe særlig. I 1990 presenterte Luc Vincent og Pierre Soille en algoritme for vannskilletransformen som kunne kjøre effektivt på vanlige datamaskiner. Denne algoritmen var ikke bare mye raskere enn tidligere algoritmer, men den slo også spesialdesignede instrumenter ned i støvlene. Med sin store hastighetsforbedring, og faktisk også økning i nøyaktighet, ble den i løpet av 90 tallet tatt aktivt i bruk i de fleste områder der segmentering av bildedata er nødvendig. Vannskilletransformen Oversvømming Grafen til et gråtonebilde kan sees på som et geografisk terreng der de høye pikselverdiene ligger høyt i terrenget og de lave langt nede. Anta at vi har et gråtonebilde, representert ved dens graf. Vi slipper en vanndråpe på et tilfeldig punkt og ser hva som skjer. Vanndråpen vil da renne nedover den bratteste skråningen til den havner på et lokalt minimumspunkt. Settet med punkter som som lar vanndråpen renne ned i samme minimum kalles et vannfangbasseng (catchment basin på engelsk). Selve vannskillet ligger i de punktene på grafen der vannet kan renne begge veier. Den mest brukte algoritmen for vannskilletransformen tar utgangspunkt i denne geografiske tolkningen, men istedenfor å la det regne over hele grafen kan vi tenke oss at vi lager hull i alle regionale minima, og senker terrenget ned i vann. Det vil fylles gradvis, og når vann fra to bassenger møtes markeres et vannskille. I én dimensjon ser denne "oversvømmingen" slik ut: 3
4 WS CB(M2) CB(M2) CB(M1) M1 1 CB(M2) CB(M 1) M2 M1 2 CB(M1) M2 M1 M2 3 Demonstrasjon av hvordan vannskilletransformen ved oversvømming fyller opp bassengene (CB) gradvis, og finner et vannskille (WS) i det to bassenger møter hverandre. Metoder for å detektere vannskiller Det er i hovedsak to typer algoritmer som brukes for å detektere vannskiller: enten simulerer man oversvømmelsesprosessen, eller så beregner man hvert vannskillepunkt direkte på bildet. Pierre Soille og Luc Vincent presenterte i 1991 en algoritme for vannskilletransformen. Denne algoritmen kan sees på som en revolusjon for transformen, rett og slett fordi den var mye raskere enn alle de andre algoritmene som fantes på den tiden. Beregninger som før tok mange timer kunne nå reduseres til minutter, eller til og med sekunder. Denne algoritmen simulerer oversvømmelsesprosessen, og tilsvarende algoritmer som har kommet i ettertid baserer seg i stor grad på denne. Det er denne algoritmen jeg har valgt å implementere. Dette fordi den er velbrukt, populær, klart definert, og intuitiv i forhold til at den simulerer en fysisk oversvømmelsesprosess. Den andre klassen av algoritmer er basert på topografiske avstandsfunksjoner, som ble beskrevet av Meyer i Dette er en algoritme som ser på hver piksel og beveger seg rundt i bildet langs skråningene. Denne metoden er lettere å parallellisere over flere prosessorer fordi den, i motsetning til Vincent og Soilles metode, ikke er like avhengig av dataene den beregner underveis. Anvendelser Det mest åpenbare en vannskilletransform kan brukes til er segmentering av faktiske topologiske data. Forskere tar ofte utgangspunkt i en DEM (Digital Elevation Model), et bilde med pikselverdier som angir hvor høyt de ligger i terrenget. På et slikt bilde gir vannskillene en helt konkret og nyttig beskrivelse av terrenget. Transformen er imidlertid brukt mye mer til segmentering av bilder. 4
5 Vanligvis beregner man vannskillene på gradienten til et bilde. På denne måten får man vannskillene på kantene til bildet. Når man skal segmentere et bilde er man som regel interessert i å skille objekter fra bakgrunnen i kantene. Hvis man kjører vannskilletransformen på et vanlig bilde er det ikke først og fremst kantene man finner, men gjerne heller noe udefinert midt mellom kantene. Derfor er vanlig prosedyre å først beregne gradientmagnituden til bildet som skal segmenteres, og deretter finne vannskillene fra denne. Gradientmagnituden har lokale maksimumsverdier langs kantene i originalbildet som transformen detekterer som vannskiller derfor gir dette en god segmentering. Til denne transformen er det svært vanlig å bruke en morfologisk gradient, for eksempel beucher gradienten, som er definert som den aritmetiske forskjellen mellom dilasjonen og erosjonen til bildet: B f = B f B f Her er B struktur elementet og f originalbildet. Det er ikke bare vanlige todimensjonale bilder som har utbytte av vannskilletransformen. De vanligste algoritmene kan relativt enkelt utvides til flere dimensjoner, noe som er helt nødvendig i mange fagfelt. Et eksempel på dette er medisinsk bildeanalyse. Der kan man for eksempel ha tredimensjonale representasjoner av en hjerne som man ønsker å segmentere. Dette gir som regel enormt mange punkter som må beregnes, noe som krever store maskinressurser. For å få en rask utregning av dataene er det gjerne nødvendig å splitte opp beregningene på en serie av prosessorer, noe vannskilletransformen er godt egnet til. Enkelte algoritmer kan parallellisere beregningene så godt at man får en nesten lineær økning i hastigheten i forhold til antall prosessorer. En annen anvendelse av transformen, som ikke innebærer gradienter, er når man ønsker å skille objekter som er "koblet sammen" under segmentering. Hvis man for eksempel har et bilde av en haug med klinkekuler som man ønsker å telle, vil en vanlig segmentering gjerne føre til at to klinkekuler henger sammen. Jeg antar at vi i dette tilfellet har et binært bilde av klinkekulene. Ved å beregne avstandstransformen av et slikt bilde, får vi et gråtonebilde som har minimumsverdi i midten av kulene, og gradvis høyere verdi desto nærmere man kommer bakgrunnen. Hvis vi nå beregner vannskillene i dette bildet får vi skiller som går midt mellom klinkekulene, og de kan dermed plukkes ut én etter én. Vannskilletransformen gir klare vannskiller som bare er én piksel i bredden. Dette gjør at den presist kan detektere små variasjoner i terrenget. Dette skaper imidlertid også problemer, fordi et vanlig bilde gjerne inneholder mye man ikke ønsker å detektere blant annet støy. 5
6 Oversegmentering Oversegmentering er et betydelig problem med vannskilletransformen. Slik den er definert finner den absolutt alle bassengene i bildet, uansett hvor små de måtte være. Dette kan for eksempel se slik ut: En enkel løsning på dette problemet, som jeg også har forsøkt å implementere, er å beregne h minima transformen til bildet. Denne resulterer i et bilde hvor alle bassengene som er grunnere enn en verdi h 1 undertrykkes. Den er én av flere aktuelle homotopi modifikasjoner av bildet. Markører For å bestemme en verdi h, må man vite noe på forhånd om bildet. Dette er noe Serge Beucher tar opp i [1]. Han beskriver en segmenteringsparadigme som deler prosessen i to: en "intelligent" del og en "mekanisk" del. Den mekaniske delen er utførelsen av vannskilletransformen, som han mener bør gå helt automatisk. Den intelligente delen av prosessen handler om å finne markører i bildet. Disse markørene er definerer hvor oversvømmelsesprosessen skal foregå. Det er ikke lenger nok å ukritisk starte oversvømmelsen i de regionale minimumspunktene nå fylles "vannet" opp kun gjennom markørene, som kan sees på som hull i vann modellen. Dette fører til at man vil ende opp med like mange vannbassenger som markører. Hvis markørene er satt fornuftig, vil den endelige segmenteringen gi et godt resultat. Det er mange måter å finne markørene på. Den enkleste er kanskje å la brukeren av systemet tegne inn markører manuelt. Dette benyttes til tider, og kan være en god løsning der det er vanskelig å finne objektene. Ofte er det altfor tidkrevende å manuelt tegne inn markører. I [2] beskriver Soille hvordan han og Misson i 2001 detekterte skillet mellom årringene i avkappede trær. De automatiserte prosessen med å finne markører ved å utføre en åpne lukke 6
7 transformasjon, etterfulgt av en åpning, "black top hat", og deretter en terskling av denne. Denne terskelen fungerte som markører i gradientbildet. Denne triksingen med enkle morfologiske operatorer viser at det er mange teknikker som kan brukes til å finne markører. Hovedpoenget er at det er en prosess som må tilpasses den enkelte segmenteringen, mens vannskilletransformen er et avslutningssteg som går helt automatisk. Algoritmen Jeg har valgt å implementere algoritmen som Vincent og Soille presenterte i [3] i Denne algoritmen er fortsatt regnet for å være en av de raskeste, i mange tilfeller raskest, og den er den desidert mest brukte. Den er i tillegg ganske enkel å forstå fordi den baserer seg på en topografisk prosess. I [4] konstruerte Roerdink og Meister følgende rekursive definisjon av algoritmen med morfologiske operatorer: { Xh min = { p D f p =h min }=T h X h 1 = MIN h 1 IZ T X h min h [ h min, h max h 1 Her er f et digitalt gråtonebilde i domenet D, med hmin og hmax som minimum og maksimumsverdier i bildet. X h er unionen av vannfangbassengene som har minimum i nivået hmin. Ved min rekursjon beregnes så hvert nye nivå h+1. I dette nivået er det muligheter for å finne to typer punkter: 1. Nye lokale minima. MINh+1 er unionen av alle minimumsverdier i bildet på nivå h En utvidelse av de bassengene som allerede er funnet. I så fall beregner man de geodetiske influenssonene til Xh, i området definert av Th+1, som er en terskling av verdiene fram til nivå h+1 ( T h ={ p D f p h } ). Denne rekursjonen definerer vannfangbassengene, og det som da står igjen er vannskillene. Vannskillene, WS(f), i bildet f er komplementet til unionen av alle bassengene: WS f =X h C max 7
8 Selve implementasjonen av denne definisjonen gjøres ikke rekursivt. Jeg har implementert algoritmen slik som den ble anbefalt av Vincent og Soille i 1991 ([3]). Denne pseudokoden er basert på Roerdink og Meijsters beskrivelse av algoritmen i [4]: Initialiseringer: 1: INN: 2 dimensjonalt gråtonebilde im 2: UT: gråtonebilde labels, som definerer bassengene og vannskillene 3: #define MASK 2 // hvert nye nivå får denne verdien 4: #define INIT 1 // startverdien til labels 5: #define WSHED 0 // vannskillepikslene får denne verdien 6: curlab < 0 // gjeldende label 7: for all pixels p 8: labels[p] < INIT 9: dist[p] < 0 // dist brukes til mellomlagring av avstander 10:end for For å slippe å løpe gjennom bildet hver gang man skal plukke ut piksler i en bestemt terskling av bildet, begynner algoritmen med å sortere alle pikslene etter pikselverdi i en kø. Dette gir direkte tilgang til hver piksel i den rekkefølgen det er behov for. 11:fifo >push_back(all pixels in im) 12:sort(fifo) // sorter fifo køen stigende etter pikselverdi Begynner så oversvømmingen. Dette er i praksis en geotetisk SKIZ av nivå h 1 inne i nivå h 13:for h = hmin to hmax 14: for all pixels p with im[p]=h 15: labels[p] < MASK // merk av alle pikslene på nivå h 16: if p has neighbor q with (labels[q] > 0 labels[0] == WSHED) 17: dist[p] < 1; fifo.push_back(p) 18: end if 19: end for 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: curdist < 1 fifo.push_back(fictious) // legg til en juksepiksel loop // utvid bassengene p < fifo.pop_front() // hent neste piksel i køen if p = FICTICIOUS if fifo.empty() break loop else fifo.push_back(fictitious); curdist ++ p = fifo.pop_front() end if end if for all q neighboring p // ser på alle nabopikslene til p if dist[q] < curdist && (labels[q] > 0 labels[q] = WSHED) // q er enten et basseng eller et vannskille 8
9 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: if labels[q] > 0 if labels[p] = MASK labels[p] = WSHED labels[p] < labels[q] else if labels[p]!= labels[q] labels[p] < WSHED end if else if labels[p] = MASK then labels[p] < WSHED end if else if labels[q] = MASK && dist[q] = 0 // har funnet et platåpiksel dist[q] < curdist + 1; fifo.push_back(q) end if end for end loop Detektér og prosesser nye minima på nivå h 50: for all pixels p with im[p] = h 51: dist[p] < 0 // resetter avstanden til pikslene 52: if labels[p] = MASK // p er inni et nytt minimum 53: curlab < curlab + 1 // nytt basseng, lager nytt label 54: fifo.push_back(p); label[p] < curlab 55: while!fifo.empty() 56: q < fifo.pop_front() // hent neste piksel fra køen 57: for all r neighboring q // alle nabopikslene til q 58: if labels[r] = MASK 59: fifo.push_back(r) 60: labels[r] < curlab 61: end if 62: end for 63: end while 64: end if 65: end for 66:end for Jeg har forsøkt å gjøre pseudokoden likest mulig C++koden, så variabelnavnene er stort sett de samme begge steder. Jeg har også kommentert hvor man står i forhold til pseudokoden enkelte steder i C++ koden. Implementasjonsbeskrivelse Verktøy I løpet av de siste årene har Python vokst frem som et språk som kan brukes i mange forskjellige sammenhenger. Det er i utgangspunktet et skript språk, som tidligere stort sett ble brukt til å skrive små kodesnutter for å løse enkle problemer. De siste årene har det begynt å komme en del større programsystemer som helt eller delvis er skrevet 9
10 i Python. Det er spesielt populært blant forskere, og det har derfor blitt utviklet et stort bibliotek for vitenskapelig programmering, men også store firmaer som Google har tatt det i bruk som rammeverk for deres tjenester. Grunnen til at det er mulig å skrive store programmer i Python uten at det i særlig grad går ut over hastighetskrav, er tett integrering med C. Python er skrevet i C, og det er lagt vekt på å gjøre det enkelt å skrive tilleggsmoduler i C som kan importeres direkte i egne Python skript. Det er dette jeg skal utnytte i denne oppgaven, men istedenfor å skrive koden i C, skriver jeg den i C++, og benytter meg av et verktøy som heter SWIG for å automatisere oversettingen til Python moduler. SWIG Simplified Wrapper and Interface Generator Når Python skal importere en kompilert tilleggsmodul, laster interpretereren inn noen faste funksjoner og tabeller fra den kompilerte koden. C funksjonene man ønsker å kalle fra Python må skrives på en helt spesiell måte, med en god del feilsjekkingsrutiner og oversettelsesrutiner av Python datastrukturer til C strukturer, og omvendt. Dette gjør at man må skrive mye kode som er svært lik for hver funksjon man kaller. Derfor er det nyttig med programmer som genererer denne koden automatisk, slik at man kan fokusere på det interessante programmeringsarbeidet. Dette hindrer også programmereren i å begå en del feil som først oppdages under kjøring av programmet. SWIG (Simplified Wrapper and Interface Generator) er et svært avansert system for å generere denne typen kode. Pakken tar utgangspunkt i kode skrevet i enten C eller C++, og lager såkalt wrappe kode for hver komponent i koden. Wrappe koden er C kode som kompileres sammen med resten av modulen, og blir "inngangsportalen" for Python inn i resten av den kompilerte koden. I tillegg lager SWIG et eget Python skript som gjør at man kan benytte funksjonene, klassene og variablene på nesten samme måte som man ville gjort det i originalspråket. SWIG har vært i bruk siden 1996 og utvikles aktivt. Kildekoden er helt åpen, og man har lov til å bruke den til det meste. Lisensen minner om GPL, men har ikke restriksjoner for kommersiell utnyttelse. Programpakken begrenser seg overhodet ikke til Python: den kan også generere wrappe kode for blant annet Perl, Tcl/Tk og Ruby. Den bedriften som sannsynligvis er mest kjent for å bruke Python i sin utvikling, Google, har også tatt i bruk SWIG. Dette er med på å gjøre SWIG til et stuerent produkt som neppe kommer til å avvikles med det første. Denne tryggheten betyr mye dersom man utvikler store programsystemer. 10
11 PIL Python Imaging Library Når jeg gikk i gang med dette prosjektet trengte jeg en enkel måte å laste inn bilder til Python modulen. Jeg endte opp med en pakke som anbefales av bildemiljøet på python.org: Python Imaging Library. Dette er en ikke alt for kompleks pakke som enkelt kan brukes til å laste inn bilder av mange forskjellige formater. Den første versjonen av PIL kom i 1995, og biblioteket utvikles fortsatt aktivt. Kildekoden er åpen og lisensen som følger med gir mulighet for det meste, også kommersiell virksomhet. Den er imidlertid eid av et kommersielt firma, PythonWare, så det kan tenkes at de velger å ta penger for pakken i fremtiden. Derfor ser jeg det som et mål å ikke integrere morfologi modulen i altfor stor grad med PIL. Den store fordelen med å benytte PIL til dette prosjektet er at bildedataene lagres internt i en C struct som jeg lett kan aksessere i C++ koden min. I Python sender jeg med minneadressen til bildet, og får full tilgang i C++. Kode Både Python og C++ er et såkalt multi paradigme språk. Det vil si at de ikke tvinger programmereren til en bestemt stil, men at man for eksempel kan velge hvor objektorientert man ønsker å skrive koden. I dette prosjektet har jeg valgt en C++ løsning som er relativt objektorientert, samtidig som jeg i selve vannskilletransformen stort sett aksesserer bildedataene direkte, slik man gjerne gjør det i C. Den ferdige utgaven av morfologimodulen ligger i to filer: _morph.so og morph.py. so filen inneholder den kompilerte C++ koden, og py filen inneholder python kode som gir tilgang til denne og bygger opp et klassehierarki tilsvarende den jeg har skrevet i C++. For å benytte seg av modulen kan man importere py filen slik: from morph import * Class MorphImage Modulen er bygget rundt én sentral klasse: MorphImage. I denne legges bildedataene til et bilde, og den inneholder en del enkle funksjoner for å manipulere disse. Pikslene ligger lagret i 2 dimensjonale C arrayer som MorphImage objektene peker på. Klassen inneholder to enkle funksjoner: erode() og dilate(). Kaller man disse, returneres et nytt MorphImage objekt med en erodert/dilatert versjon av bildet i originalobjektet. Jeg har foreløpig kun benyttet meg av et enkelt, fire nabos strukturelement, men etter hvert som klassen utvikler seg vil det være naturlig å introdusere strukturelementer av ubestemt oppbygning. Jeg regner da med å ha en 11
12 egen klasse for strukturelementer, og hvert MorphImage objekt vil inneholde et objekt av denne klassen som den benytter til morfologiske operasjoner. Jeg har definert noen operatorer som gjør at man blant annet kan legge sammen to objekter av klassen MorphImage, og få ut en ny MorphImage. Dette fungerer knirkefritt i Python, så man kan for eksempel skrive følgende kode i Python (MI1 og MI2 er objekter av MorphImageI klassen): MI2 = MI1.dilate() MI1.erode() Dette er en enkel måte å beregne beucher gradienten til et bilde på. Det er riktignok ikke en effektiv måte å gjøre det på, men det illustrerer hvordan modulen kan benyttes til å utføre morfologiske operasjoner på en lettleselig måte. Det ideelle med hensyn til hastighet hadde vært å utføre erosjonen og dilasjonen i samme gjennomgang av bildet. Dette kan enkelt implementeres ved å trekke laveste verdi innenfor strukturelementet (erosjonen) fra høyeste verdi (dilasjonen). MorphImage inneholder funksjoner for å kopiere PIL bilder inn i et MI objekt. Disse kan kun kalles fra en konstruktør. I øyeblikket er dette den naturlige måten å laste inn et bilde på, men dersom det skulle vise seg å være ønskelig å importere på andre måter burde det være enkelt å legge til funksjonalitet for det. På grunn av måten den er bygget opp på kan den også jobbe direkte på et PIL bilde. Dette kan være effektivt, men innebærer også en del risiko. Hvis man forandrer egenskapene til PIL bildet vil resultatene mest sannsynlig føre til at programmet avbrytes med segmenteringsfeil. Klassen er basert på templates. Når et objekt av klassen opprettes må man sende med en type, for eksempel 'int'. Denne typen definerer størrelsen på hver piksel. Dette fungerer fint når man oppretter objekter i C++, fordi kompilatoren da har mulighet til å kompilere versjoner av klassen for den aktuelle typen. I Python går ikke denne løsningen, siden den baserer seg på ferdigkompilert kode. Derfor har jeg foreløpig definert at MorphImage<int> skal hete MorphImageI i Python, og dette er den eneste typen som det går an å bruke i øyeblikket. Dette på grunn av kompatibilitet med PIL. I MorphImage har jeg også lagt inn funksjonen reconstructbyerosion. Denne tar et MorphImage objekt som input, og bruker dette som markør i en rekonstruksjon av bildet ved erosjon. Fordelen med denne funksjonen er at det går an å skive h minima transformen på en enkel måte i Python: MI_HMIN = MI_mask.reconstructByErosion(MI_marker + h) Ulempen med funksjonen er at den er ekstremt treg. Jeg implementerte den først og fremst for å demonstrere hva slags effekt en HMIN transformasjon har på et bilde som skal vannskilletransformeres. 12
13 WatershedTransform Selve vannskilletransformen har jeg implementert i en egen klasse, WatershedTransform. Grunnen til at jeg har valgt å gjøre det sånn er at jeg ser på denne transformasjonen som en litt større enhet. Den kan returnere både vannskillene og vannbassengene i forskjellige MorphImage objekter. Vannbassengene opprettes automatisk når man kaller compute(), og returneres av getlabels(), mens vannskillene opprettes fra vannbasseng dataene hvis man kaller funksjonen getwatersheds(). Vanlig bruk av klassen i Python foregår slik: wst = WatershedTransformI(morphHMIN) wst.compute() # utfører watershed beregningene Selve beregningen skjer i compute funksjonen. Vannskillene er nå beregnet, og for å få tilgang til dataene kan man så skrive: ws = wst.getwatersheds() eller lab = wst.getlabels() Som for klassen MorphImage har jeg bare kompilert en int versjon av denne klassen. Den ser slik ut for Python: WatershedTransformI. En interessant videreutvikling av denne klassen er å implementere markører som en del av vannskilletransformen. Problemer I alle operasjonene har jeg benyttet meg av 4 naboskap. Dette har jeg gjort direkte i hver funksjon, uten noen automatisering av å trekke ut naboene. I en utvikling av programmet er dette en av de første tingene jeg bør ta tak i. Jeg ser for meg en løsning hvor jeg bruker C++ iteratorer til å lage et generelt naboskapssystem som tar hensyn til kantene, og som både kan benytte seg av 4 og 8 naboer. Jeg bør også ta tak i problemet med at man bare kan bruke int piksler i bildene. Ved å skrive litt Python kode som automatisk velger rett klasse (MorphImageI for int piksler, MorphImageB for binære pikselverdier, etc.) kan dette foregå uten at brukeren trenger å tenke noe særlig over hva som skjer. Modulen har i øyeblikket en del minnelekkasjer. Spesielt når man oppretter objekter i Python vil de ikke alltid slettes når objektene ikke lenger brukes. Dette er et problem som jeg ikke har rukket å ta tak i, som jeg bør få orden på så fort som mulig. Det er ikke spesielt kritisk når man kun gjør få operasjoner på små bilder, siden dataene slettes når programmet avsluttes, men dersom man opererer på store bilder er dette 13
14 uholdbart. Resultater Jeg har testet følgende bilde i implementasjonen min: Dette bildet er spesielt kunstig fordi det har en helt jevn datagenerert skyggelegging. Det vil imidlertid gi en god pekepinn på om vannskilletransformen virker. Jeg laster inn bildet, og kaller vannskilletransformen slik i Python: pilin = Image.open('test1.png') morphin = MorphImageI(pilInI.im.id) # kopierer til mitt eget format wst = WatershedTransformI(morphIn) wst.compute() # utfører watershed beregningene Resultatet ser slik ut: Dette ser fornuftig ut, men det har kommet litt for mange bassenger. Derfor kjører jeg operasjonen om igjen, men undertrykker de minste bassengene ved en HMIN5 transformasjon før jeg sender morphin bildet til WatershedTransformI. Dette kan skrives slik i python: morphin = morphin.reconstructbyerosion(morphin + 5) Resultatet ser slik ut: 14
15 Det første bildet viser de forskjellige bassengene i bildet, og det andre viser vannskillene. Her skiller algoritmen ut de store, synlige bassengene i bildet. Dette tyder på at algoritmen fungerer som den skal. Dette er et kunstig eksempel, men allikevel høyst aktuelt i forhold til det å skille objekter som ligger inntil hverandre i et binært bilde. Ved å utføre en avstandstransform på et slikt binært bilde, vil man få et bilde som har mange av de samme egenskapene som det i det forrige eksempelet. Her er et litt mer realistisk eksempel: Den vanligste måten å skille ut objekter fra et bilde er at man først beregner kantene i bildet. Det har jeg gjort ved å beregne beucher gradienten til bildet: Kjører jeg vannskilletransformen på dette bildet ser resultatet slik ut: 15
16 Her ser vi det vanligste problemet med watershed transformen: den finner altfor mange bassenger. Hvis jeg derimot behandler gradient bildet først med en HMIN transform kan jeg undertrykke de grunneste bassengene. Disse er de bassengene hvor kantene til originalbildet har lavest gradientmagnitude. Jeg har prøvd meg fram med forskjellige h verdier, og kom fram til at h=4 ga et interessant resultat: Dette bildet demonstrerer at vannskilletransformen skiller godt mellom små objekter i bildet. Det er lett å legge merke til hvor detaljert den skiller de små vinduene nederst på bygningen. Det er imidlertid et problem som gjør disse dataene relativt unyttige i seg selv: man må vite på forhånd hva man ønsker å trekke ut av et bilde, og sette parametre deretter. Ved å undertrykke de bassengene som er 12 eller grunnere (HMIN12) får jeg dette resultatet: Her får jeg en bedre beskrivelse av de store objektene i bygningen. Hele poenget er at for å få en god segmentering må man vite en del om det man segmenterer på forhånd. Selve vannskilletransformen går helt automatisk, men preprosesseringen av bildet må 16
17 kontrolleres på en eller annen måte. Dersom jeg for eksempel ønsket å skille bygningen fra resten av bildet, kunne en god løsning vært å finne ut såpass mye om bildet på forhånd at man kunne sette én markør rundt bygningen, og en inni. En enkel løsning på problemet er å tegne disse inn manuelt. Konklusjon Vannskilletransformen er et nyttig verktøy til å segmentere et bilde. Den har etter hvert blitt tatt i omfattende bruk i industriområder hvor det er behov for automatisert utplukking av objekter i bilder. Min algoritme for vannskilletransformen har fungert som jeg hadde forventet, på samme måte som Vincent og Soille demonstrerte i 1991 ([3]).Sammen med HMIN transformen gir den en god segmentering på mange typer bilder. Et problem som kan oppstå når man utvikler programmer er at utviklingen av bibliotekene man gjør seg avhengig av stopper opp, eller kommersialiseres. I koden min har jeg benyttet meg av Python Imaging Library (PIL) og SWIG. Jeg har lagt inn støtte for å importere og operere direkte på PIL bilder, men PIL er ikke nødvendig for å utføre morfologiske operasjoner. SWIG er i øyeblikket helt nødvendig for å oversette modulen til Python, men dersom det skulle vise seg at SWIG etter hvert blir foreldet, finnes det andre programmer som kan utføre den samme jobben uten alt for mye innsats fra programmererens side. Jeg tror at Python har en stor framtid innen bildeanalyse. Verktøy som SWIG gir programmereren muligheter til å skrive tunge beregningsløkker i kompilert kode, og mindre tidkrevende operasjoner i Python. I Python slipper man å kompilere programmene til stadighet, og oppbygningen gjør at man kan abstrahere bort unødvendige detaljer, og heller konsentrere seg om bildeanalysen. Jeg mener at jeg med denne modulen har laget et godt utgangspunkt for å utvikle et bibliotek for generelle morfologioperasjoner. Med mye finpussing og mange nye detaljer, kan den bli et nyttig verktøy som i kan brukes til prototyping og utprøving av morfologiske teknikker, og forhåpentligvis også reelle, komplette programmer. Bibliografi [1] S. Beucher. The Watershed Transform Applied to Image Segmentation., :299 17
18 [2] [3] [4] 314, 1992 Soille, Pierre. Morphological Image Analysis, 2nd ed, Springer Verlag. ISBN Vincent, Luc and Soille, Pierre. Watersheds in Digital Spaces: An Efficient Algorithm Based on Immersion Simulations. IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol 13, No. 6: , June 1991 Roerdink, Jos B.T.M and Arnold Meijster. The Watershed Transform: Definitions, Algorithms and Parallelization Strategies. Fundamenta Informaticae, 41: , 2001 Vevsider Simplified Wrapper and Interface Generator (SWIG): Python Imaging Library: Jean Serras historiske tilbakeblikk på matematisk morfologi: 18
Matematisk morfologi V
Matematisk morfologi V Lars Aurdal Norsk regnesentral Lars.Aurdal@nr.no 4. desember 2003 Copyright Lars Aurdal, NTNU/NR Oversikt, kursdag 5 Segmentering: Watershedtransformen. Copyright Lars Aurdal, NTNU/NR
DetaljerOversikt, kursdag 5. Matematisk morfologi V. Hva er segmentering. Hva er segmentering. Lars Aurdal Norsk regnesentral
Matematisk morfologi V Lars Aurdal Norsk regnesentral Lars.Aurdal@nr.no 4. desember 2003 Segmentering: Watershedtransformen. Oversikt, kursdag 5 Copyright Lars Aurdal, NTNU/NR Copyright Lars Aurdal, NTNU/NR
DetaljerMatematisk morfologi IV
Matematisk morfologi IV Lars Aurdal Norsk regnesentral Lars.Aurdal@nr.no. desember 3 Copyright Lars Aurdal, NTNU/NR Oversikt, kursdag Geodesi-transformasjoner: Geodesi-dilasjon. Geodesi-erosjon. Geodesi-rekonstruksjon.
DetaljerMotivasjon. Litt sett-teori. Eksempel. INF Mesteparten av kap i DIP Morfologiske operasjoner på binære bilder.
1 Motivasjon INF 2310 Mesteparten av kap 9.1-9.5 i DIP Morfologiske operasjoner på binære bilder Basis-begreper Fundamentale operasjoner på binære bilder Sammensatte operasjoner Eksempler på anvendelser
DetaljerInnhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk
Innhold uke 7 Objektorientert programmering i Python: Introduksjon IN1000 Høst 2017 uke 7 Siri Moe Jensen Lite tilbakeblikk: Prosedyrer og funksjoner Objektorientert programmering Introduksjon: Hvorfor,
DetaljerMotivasjon. Litt sett-teori. Eksempel. INF Kap. 11 i Efford Morfologiske operasjoner. Basis-begreper
Basis-begreper INF 2310 08.05.2006 Kap. 11 i Efford Morfologiske operasjoner Fundamentale operasjoner på binære bilder Sammensatte operasjoner Morfologisk filtrering Morfologiske operasjoner på gråtonebilder
DetaljerMotivasjon. INF 2310 Morfologi. Eksempel. Gjenkjenning av objekter intro (mer i INF 4300) Problem: gjenkjenn alle tall i bildet automatisk.
INF 230 Morfologi Morfologiske operasjoner på binære bilder:. Basis-begreper 2. Fundamentale operasjoner på binære bilder 3. ammensatte operasjoner 4. Eksempler på anvendelser flettet inn GW, Kapittel
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i : INF3 Digital bildebehandling Eksamensdag : Onsdag. juni Tid for eksamen : 4:3 8:3 Oppgavesettet er på : 5 sider Vedlegg : Ingen
DetaljerOversikt, kursdag 4. Matematisk morfologi IV. Geodesi-transformasjoner: Dilasjon. Geodesi-transformasjoner
Matematisk morfologi IV Lars Aurdal Norsk regnesentral Lars.Aurdal@nr.no. desember Geodesi-transformasjoner: Oversikt, kursdag Geodesi-dilasjon. Geodesi-erosjon. Geodesi-rekonstruksjon.. Åpning/lukning
DetaljerHva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først
Køer Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først Et nytt element legges alltid til sist i køen Skal vi ta ut et element, tar vi alltid
DetaljerMorfologiske operasjoner på binære bilder
Digital bildebehandling Forelesning 13 Morfologiske operasjoner på binære bilder Andreas Kleppe Repetisjon av grunnleggende mengdeteori Fundamentale operatorer Sammensatte operatorer Eksempler på anvendelser
DetaljerMAT1030 Forelesning 28
MAT1030 Forelesning 28 Kompleksitetsteori Roger Antonsen - 12. mai 2009 (Sist oppdatert: 2009-05-13 08:12) Forelesning 28: Kompleksitetsteori Introduksjon Da er vi klare (?) for siste kapittel, om kompleksitetsteori!
DetaljerKanter, kanter, mange mangekanter. Introduksjon: Steg 1: Enkle firkanter. Sjekkliste. Skrevet av: Sigmund Hansen
Kanter, kanter, mange mangekanter Skrevet av: Sigmund Hansen Kurs: Processing Tema: Tekstbasert, Animasjon Fag: Matematikk, Programmering, Kunst og håndverk Klassetrinn: 8.-10. klasse, Videregående skole
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2310 Digital bildebehandling Eksamensdag: Mandag 1. juni 2015 Tid for eksamen: 14:30 18:30 Oppgavesettett er på: 6 sider Vedlegg:
DetaljerHva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først
Køer Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først Et nytt element legges alltid til sist i køen Skal vi ta ut et element, tar vi alltid
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i : INF310 Digital bildebehandling Eksamensdag : Tirsdag 5. juni 007 Tid for eksamen : 09:00 1:00 Oppgavesettet er på : 5 sider
DetaljerForelesning 30. Kompleksitetsteori. Dag Normann mai Informasjon. Oppsummering
Forelesning 30 Kompleksitetsteori Dag Normann - 14. mai 2008 Informasjon Det er lagt ut program for orakeltjenestene i MAT1030 denne våren på semestersiden. Det blir ikke ordinære gruppetimer fra og med
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i : INF2310 Digital bildebehandling Eksamensdag : Tirsdag 5. juni 2007 Tid for eksamen : 09:00 12:00 Oppgavesettet er på : 5 sider
DetaljerMorfologi i Binære Bilder
Morfologi i Binære Bilder Lars Vidar Magnusson February 26, 2018 Delkapittel 9.1 Preliminaries Delkapittel 9.2 Dilation and Erosion Delkapittel 9.3 Opening and Closing Delkapittel 9.4 The Hit-or-Miss Transformation
DetaljerKanter, kanter, mange mangekanter
Kanter, kanter, mange mangekanter Nybegynner Processing PDF Introduksjon: Her skal vi se på litt mer avansert opptegning og bevegelse. Vi skal ta utgangspunkt i oppgaven om den sprettende ballen, men bytte
DetaljerKøbenhavn 20 Stockholm
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i IN 115 Algoritmer og datastrukturer Eksamensdag: 26. mai 2001 Tid for eksamen: 9.00 15.00 Oppgavesettet er på 7 sider. Vedlegg:
DetaljerMatematisk morfologi II
Matematisk morfologi II Lars Aurdal Norsk regnesentral Lars.Aurdal@nr.no 4. desember 2003 Copyright Lars Aurdal, NTNU/NR Oversikt, kursdag 2 Elementære operasjoner: Erosjon. Dilasjon. Sammensatte operasjoner:
DetaljerOversikt, kursdag 2. Matematisk morfologi II. Morfologiske operatorer, erosjon og dilasjon. Morfologiske operatorer, erosjon og dilasjon
Matematisk morfologi II Lars Aurdal Norsk regnesentral Lars.Aurdal@nr.no 4. desember 2003 Elementære operasjoner: Erosjon. Dilasjon. Oversikt, kursdag 2 Sammensatte operasjoner: Åpning. Lukning. Flosshatt-transformasjoner.
DetaljerMAT1030 Diskret matematikk
MAT1030 Diskret matematikk Forelesning 30: Kompleksitetsteori Dag Normann Matematisk Institutt, Universitetet i Oslo 14. mai 2008 Informasjon Det er lagt ut program for orakeltjenestene i MAT1030 denne
DetaljerMAT1030 Diskret Matematikk
MAT1030 Diskret Matematikk Forelesning 29: Kompleksitetsteori Roger Antonsen Institutt for informatikk, Universitetet i Oslo 13. mai 2009 (Sist oppdatert: 2009-05-17 22:38) Forelesning 29: Kompleksitetsteori
DetaljerLæringsmål uke 7. Objektorientert programmering i Python: Introduksjon. Innhold uke 7. Lite tilbakeblikk: Programflyt og skop
Læringsmål uke 7 Objektorientert programmering i Python: Introduksjon IN1000 Høst 2018 uke 7 Siri Moe Jensen Kjenne til motivasjon og bakgrunn for objektorientert programmering Kunne definere en klasse,
DetaljerForelesning 29: Kompleksitetsteori
MAT1030 Diskret Matematikk Forelesning 29: Kompleksitetsteori Roger Antonsen Institutt for informatikk, Universitetet i Oslo Forelesning 29: Kompleksitetsteori 13. mai 2009 (Sist oppdatert: 2009-05-17
DetaljerHva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først
Køer Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først Et nytt element legges alltid til sist i køen Skal vi ta ut et element, tar vi alltid
DetaljerReelle tall på datamaskin
Reelle tall på datamaskin Knut Mørken 5. september 2007 1 Innledning Tirsdag 4/9 var tema for forelesningen hvordan reelle tall representeres på datamaskin og noen konsekvenser av dette, særlig med tanke
Detaljerprogrameksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"
Et større programeksempel Hvordan løse et reelt problem med en objektorientert fremgangsmåte En større problemstilling I uke 4 skrev vi et program for å sjekke om et gen (en tekstfil) inneholdt ordet "TGA"
DetaljerObjektorientert programmering i Python
Objektorientert programmering i Python IN1000 Høst 2019 uke 8 Siri Moe Jensen Læringsmål uke 8 Repetisjon fra forrige uke Definere en klasse, opprette og arbeide med objekter: How-to
DetaljerMorfologiske operasjoner på binære bilder
Digital bildebehandling Forelesning 15 Morfologiske operasjoner på binære bilder Fritz Albregtsen Repetisjon av grunnleggende mengdeteori Fundamentale operatorer Sammensatte operatorer Eksempler på anvendelser
Detaljer2 Om statiske variable/konstanter og statiske metoder.
Litt om datastrukturer i Java Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo 1 Innledning Dette notatet beskriver noe av det som foregår i primærlageret når et Javaprogram utføres.
DetaljerMorfologi i Binære Bilder II
Morfologi i Binære Bilder II Lars Vidar Magnusson March 28, 2017 Delkapittel 9.3 Opening and Closing Delkapittel 9.4 The Hit-or-Miss Transformation Opening (Åpning) Opening er en morfologisk operasjon
DetaljerOm du allerede kjenner Scratch og har en Scratchbruker kan du gå videre til Steg 1.
Pingviner på tur Skrevet av: Geir Arne Hjelle Kurs: Scratch Tema: Blokkbasert, Spill Fag: Programmering Klassetrinn: 1.-4. klasse, 5.-7. klasse, 8.-10. klasse Introduksjon Velkommen til Scratch. Vi skal
DetaljerEt større programeksempel. Hvordan løse et reelt problem med en objektorientert fremgangsmåte
Et større programeksempel Hvordan løse et reelt problem med en objektorientert fremgangsmåte Plan for forelesingen Beskrive en større problemstilling Planlegge programmet Skrive koden, én klasse om gangen
DetaljerEtter uke 6 skal du. Introduksjon til objektorientert programmering. Hva skjedde ~1967? INF1001. Grunnkurs i objektorientert programmering
Etter uke 6 skal du Kjenne til motivasjonen for objektorientert programmering Introduksjon til objektorientert programmering INF1001 Høst 2016 Forstå hva en klasse er, og forskjellen på klasse og objekt
DetaljerDebugging. Tore Berg Hansen, TISIP
Debugging Tore Berg Hansen, TISIP Innhold Innledning... 1 Å kompilere og bygge et program for debugging... 1 Når debugger er i gang... 2 Symbolene i verktøylinjen... 3 Start på nytt... 3 Stopp debugging...
DetaljerIntroduksjon. Morfologiske operasjoner på binære bilder. Litt mengdeteori. Eksempel: Lenke sammen objekter INF
INF230 5.05.202 Morfologiske operasjoner på binære bilder Repetisjon av grunnleggende mengdeteori Fundamentale operatorer Sammensatte operatorer Eksempler på anvendelser er flettet inn DIP: 9.-9.4, 9.5.,
DetaljerDonkey Kong. Introduksjon. Oversikt over prosjektet. Skrevet av: Geir Arne Hjelle
Donkey Kong Skrevet av: Geir Arne Hjelle Kurs: Scratch Tema: Blokkbasert, Spill, Animasjon Fag: Naturfag, Programmering, Engelsk, Kunst og håndverk Klassetrinn: 5.-7. klasse, 8.-10. klasse Introduksjon
DetaljerIntroduksjon. Litt mengdeteori. Eksempel: Lenke sammen objekter. Morfologiske operasjoner på binære bilder. INF2310 Digital bildebehandling
Digital bildebehandling Forelesning 3 Morfologiske operasjoner på binære bilder Andreas Kleppe Repetisjon av grunnleggende mengdeteori Fundamentale operatorer Sammensatte operatorer Eksempler på anvendelser
DetaljerPython: Rekursjon (og programmering av algoritmer) Python-bok: Kapittel 12 + teoribok om Algoritmer
Python: Rekursjon (og programmering av algoritmer) Python-bok: Kapittel 12 + teoribok om Algoritmer TDT4110 IT Grunnkurs Professor Guttorm Sindre Læringsmål og pensum Mål Forstå, og kunne bruke, algoritmer
DetaljerOppgave 1. Sekvenser (20%)
Det matematisk-naturvitenskapelige fakultet UNIVERSITETET I BERGEN Eksamen i emnet I 20 - Algoritmer, datastrukturer og programmering Mandag 2.Mai 200, kl. 09-5. Ingen hjelpemidler tillatt. Oppgavesettet
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i INF1010 Objektorientert programmering Eksamensdag: 6. juni 2013 Tid for eksamen: 09.00 15.00 Oppgavesettet er på 5 sider. Vedlegg:
Detaljerpublic static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren
Prosedyrer Hensikten med en prosedyre Hensikten med en prosedyre er, logisk sett, å representere en jobb eller en funksjonalitet i et eller flere programmer. Bruk av entall er viktig: vi har generelt en
DetaljerHusk at du skal ha to vinduer åpne. Det ene er 'Python Shell' og det andre er for å skrive kode i.
Skilpaddeskolen Skrevet av: Oversatt fra Code Club UK (//codeclub.org.uk) Oversatt av: Bjørn Einar Bjartnes Kurs: Python Tema: Tekstbasert Fag: Programmering, Kunst og håndverk Klassetrinn: 8.-10. klasse
DetaljerOPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?
OPPGAVESETT 4 PROSEDYRER Oppgavesett 4 i Programmering: prosedyrer. I dette oppgavesettet blir du introdusert til programmering av prosedyrer i Java. Prosedyrer er også kjent som funksjoner eller subrutiner.
DetaljerHeap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock
Heap og prioritetskø Marjory the Trash Heap fra Fraggle Rock Binær heap En heap er et komplett binært tre: Alle nivåene i treet, unntatt (muligens) det nederste, er alltid helt fylt opp med noder Alle
DetaljerIN1000 Obligatorisk innlevering 7
IN1000 Obligatorisk innlevering 7 Frist for innlevering: 23.10. kl 12:00 Introduksjon I denne innleveringen skal du lage et program som simulerer cellers liv og død. Dette skal du gjøre ved hjelp av en
DetaljerINF1010 notat: Binærsøking og quicksort
INF1010 notat: Binærsøking og quicksort Ragnhild Kobro Runde Februar 2004 I dette notatet skal vi ta for oss ytterligere to eksempler der rekursjon har en naturlig anvendelse, nemlig binærsøking og quicksort.
Detaljerpublic static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren
Prosedyrer Hensikten med en prosedyre Hensikten med en prosedyre er, logisk sett, å representere en jobb eller en funksjonalitet i et eller flere programmer. Bruk av entall er viktig: vi har generelt en
DetaljerAlgoritmer og Datastrukturer
Eksamen i Algoritmer og Datastrukturer IAI 21899 Høgskolen i Østfold Avdeling for informatikk og automatisering Lørdag 15. desember 2001, kl. 09.00-14.00 Hjelpemidler: Alle trykte og skrevne hjelpemidler.
DetaljerNorsk informatikkolympiade runde
Norsk informatikkolympiade 2017 2018 1. runde Sponset av Uke 46, 2017 Tid: 90 minutter Tillatte hjelpemidler: Kun skrivesaker. Det er ikke tillatt med kalkulator eller trykte eller håndskrevne hjelpemidler.
DetaljerPong. Oversikt over prosjektet. Steg 1: En sprettende ball. Plan. Sjekkliste. Introduksjon
Pong Introduksjon Pong er et av de aller første dataspillene som ble laget, og det første dataspillet som ble en kommersiell suksess. Selve spillet er en forenklet variant av tennis hvor to spillere slår
DetaljerINF Innleveringsoppgave 6
INF1010 - Innleveringsoppgave 6 Frist: Onsdag 16. mars, 10:00 Maks 6 poeng Om obligatorisk oppgave 4, 6 og 7 i INF1010, våren 2016: "Leger og resepter" Du skal jobbe med en problemstilling omkring leger
DetaljerNOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse. INF 5110, 10/5-2011, Stein Krogdahl
NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse Dessverre litt få figurer INF 5110, 10/5-2011, Stein Krogdahl Oversikt over Javas class-filer og byte-kode Disse formatene ble planlagt fra start
DetaljerRekursjon. Binærsøk. Hanois tårn.
Rekursjon Binærsøk. Hanois tårn. Hvorfor sortering (og søking) er viktig i programmering «orden» i dataene vi blir fort lei av å lete poleksempel internett «alt» er søking og sortering alternativer til
DetaljerNorgestur. Introduksjon. Steg 1: Et norgeskart. Sjekkliste. Scratch. Skrevet av: Geir Arne Hjelle
Scratch Norgestur Skrevet av: Geir Arne Hjelle Kurs: Scratch Språk: Norsk bokmål Introduksjon Bli med på en rundreise i Norge! Vi skal lage et spill hvor du styrer et helikopter rundt omkring et kart over
DetaljerBinære trær: Noen algoritmer og anvendelser
Binære trær: Noen algoritmer og anvendelser Algoritmer / anvendelser: Søking i usortert binært tre Telling av antall noder og nivåer i treet Traversering av binære trær Binære uttrykkstrær Kunstig intelligens(?):
DetaljerAlgoritmer og Datastrukturer
Eksamen i Algoritmer og Datastrukturer IAI 21899 Høgskolen i Østfold Avdeling for informatikk og automatisering Torsdag 3. november 2, kl. 9. - 14. Hjelpemidler: Alle trykte og skrevne hjelpemidler. Kalkulator.
DetaljerNOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse
NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse Dessverre litt få figurer INF 5110, 8/5-2012, Stein Krogdahl Byte-koden for Java og.nett (C#) http://en.wikipedia.org/wiki/java_bytecode_instruction_listings
DetaljerHvordan angripe en større oppgave? (og hva skal jeg gjøre i oblig 7!?)
Hvordan angripe en større oppgave? (og hva skal jeg gjøre i oblig 7!?) Skaff deg et godt overblikk... Les oppgaveteksten godt! Forstå hva oppgaven skal gjøre. Se på eksempelkjøringen! Hvilke klasser trenger
DetaljerOversikt, kursdag 3. Matematisk morfologi III. Hit-or-miss transformen og skjeletter. Hit-or-miss transformen og skjeletter
Matematisk morfologi III Lars Aurdal Norsk regnesentral Lars.Aurdal@nr.no 4. desember 2003 Sammensatte operasjoner: Hit-or-miss-transformen. Skjeletter. Oversikt, kursdag 3 Copyright Lars Aurdal, NTNU/NR
Detaljer1. Å lage programmer i C++
Avdeling for informatikk og e-læring, Høgskolen i Sør-Trøndelag Å lage programmer i C++ Tore Berg Hansen og Else Lervik Rividert siste gang 24. august 2006 1. Å lage programmer i C++ Resymé: Dette notatet
Detaljer1. Å lage programmer i C++
Avdeling for informatikk og e-læring, Høgskolen i Sør-Trøndelag Å lage programmer i C++ Tore Berg Hansen og Else Lervik Rividert siste gang 29. august 2005 1. Å lage programmer i C++ Resymé: Dette notatet
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i Eksamensdag: 12. desember 2008 Tid for eksamen: 9.00 12.00 Oppgavesettet er på 7 sider. Vedlegg: Tillatte hjelpemidler: INF2220
DetaljerTDT4113 - Datateknologi, programmeringsprosjekt
TDT4113 - Datateknologi, programmeringsprosjekt Oppgave 1: Stein, Saks, Papir Dette dokumentet beskriver den første oppgaven i ProgLab 2, som vi kaller Stein, Saks, Papir. For denne oppgaven gjelder at:
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i : INF2310 Digital bildebehandling Eksamensdag : Fredag 29. mars 2019 Tid for eksamen : 14:30 18:30 (4 timer) Oppgavesettet er
DetaljerMAT-INF 1100: Obligatorisk oppgave 1
13. september, 2018 MAT-INF 1100: Obligatorisk oppgave 1 Innleveringsfrist: 27/9-2018, kl. 14:30 i Devilry Obligatoriske oppgaver («obliger») er en sentral del av MAT-INF1100 og er utmerket trening i å
Detaljer3. obligatoriske innlevering, høsten 2014
3. obligatoriske innlevering, høsten 2014 {Jonathan Feinberg, Joakim Sundnes} {jonathf,sundnes}@simula.no November 3, 2014 Innleveringskrav Denne skal følge malen gitt på emnesidene Legges ut 2. september.
DetaljerEKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00
EKSAMEN Emnekode: ITF20006 Emne: Algoritmer og datastrukturer Dato: 9. mai 2016 Eksamenstid: 09:00 13:00 Hjelpemidler: Alle trykte og skrevne Faglærer: Jan Høiberg Om eksamensoppgavene: Oppgavesettet består
DetaljerNorsk informatikkolympiade runde
Norsk informatikkolympiade 2016 2017 1. runde Sponset av Uke 46, 2016 Tid: 90 minutter Tillatte hjelpemidler: Kun skrivesaker. Det er ikke tillatt med kalkulator eller trykte eller håndskrevne hjelpemidler.
DetaljerHvorfor objektorientert programmering? Objektorientert programmering i Python: Introduksjon. Læringsmål uke 7. Undervisning og pensum IN1000
Objektorientert programmering i Python: Introduksjon IN1000 Høst 2019 uke 7 Siri Moe Jensen Læringsmål uke 7 Kjenne til motivasjon og bakgrunn for objektorientert programmering Kunne definere en klasse,
DetaljerForelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Dag Normann
MAT1030 Diskret Matematikk Forelesning 25: Trær Dag Normann Matematisk Institutt, Universitetet i Oslo Forelesning 25 27. april 2010 (Sist oppdatert: 2010-04-27 14:16) MAT1030 Diskret Matematikk 27. april
DetaljerA study of different matching heuristics. Hovedfagspresentasjon Jan Kasper Martinsen
A study of different matching heuristics Hovedfagspresentasjon Jan Kasper Martinsen (janma@ifi.uio.no) Terminologi: Graf teori En graf består av et sett med noder Nodene er tilknyttet hverandre ved hjelp
DetaljerKompleksitetsanalyse Helge Hafting 25.1.2005 Opphavsrett: Forfatter og Stiftelsen TISIP Lærestoffet er utviklet for faget LO117D Algoritmiske metoder
Helge Hafting 25.1.2005 Opphavsrett: Forfatter og Stiftelsen TISIP Lærestoffet er utviklet for faget LO117D Algoritmiske metoder Innhold 1 1 1.1 Hva er en algoritme?............................... 1 1.2
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i IN 115 og IN 110 Algoritmer og datastrukturer Eksamensdag: 14. mai 1996 Tid for eksamen: 9.00 15.00 Oppgavesettet er på 8 sider.
DetaljerINF Algoritmer og datastrukturer
INF2220 - Algoritmer og datastrukturer HØSTEN 2009 Institutt for informatikk, Universitetet i Oslo INF2220, forelesning 6: Grafer Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 6 1 / 31 Dagens plan:
DetaljerFra Python til Java, del 2
Fra Python til Java, del 2 Hvordan kjøre Java? På Ifis maskiner På egen maskin Et eksempel Array-er For-setninger Lesing og skriving Metoder Biblioteket Hva trenger vi egentlig? Å kjøre Java For å kunne
DetaljerGrunnleggende Grafalgoritmer II
Grunnleggende Grafalgoritmer II Lars Vidar Magnusson March 17, 2015 Kapittel 22 Dybde-først søk Topologisk sortering Relasjonen til backtracking Dybde-Først Søk Dybde-først søk i motsetning til et bredde-først
DetaljerHvorfor objektorientert programmering?
Objektorientert programmering i Python: Introduksjon IN1000 Høst 2019 uke 7 Siri Moe Jensen Læringsmål uke 7 Kjenne til motivasjon og bakgrunn for objektorientert programmering Kunne definere en klasse,
DetaljerGJENNOMGANG UKESOPPGAVER 9 TESTING
GJENNOMGANG UKESOPPGAVER 9 TESTING INF1050 V16 KRISTIN BRÆNDEN 1 A) Testing viser feil som du oppdager under kjøring av testen. Forklar hvorfor testing ikke kan vise at det ikke er flere gjenstående feil.
DetaljerMAT1030 Diskret Matematikk
MAT1030 Diskret Matematikk Forelesning 25: Trær Dag Normann Matematisk Institutt, Universitetet i Oslo 27. april 2010 (Sist oppdatert: 2010-04-27 14:15) Forelesning 25 MAT1030 Diskret Matematikk 27. april
DetaljerInformasjon Eksamen i IN1000 høsten 2017
Informasjon Eksamen i IN000 høsten 207 Tid 8. desember kl. 09.00 (4 timer) Faglærerne vil besøke lokalet ca kl 0. Oppgavene Oppgave 2b og 2c er flervalgsoppgaver. Her får man det angitte antall poeng om
DetaljerIntroduksjon til objektorientert programmering
Introduksjon til objektorientert programmering Samt litt mer om strenger og variable INF1000, uke6 Ragnhild Kobro Runde Grunnkurs i objektorientert programmering Strategi: Splitt og hersk Metoder kan brukes
DetaljerDisjunkte mengder ADT
Binære relasjoner A A = {(x, y) x, y A}: mengden av ordnede par over A. Disjunkte mengder ADT Weiss kap. 8.1 8.5 Løser ekvivalensproblemet Lett og rask implementasjon Vanskelig tidsforbrukanalyse Ark 1
DetaljerMatematisk Morfologi Lars Aurdal
Matematisk Morfologi Lars Aurdal FORSVARETS FORSKNINGSINSTITUTT Motivasjon. Plan Grunnleggende setteori. Grunnleggende operasjoner. Dilasjon. Erosjon. Sammensatte operasjoner Åpning Lukning Algoritmer.
DetaljerINF2810: Funksjonell Programmering
INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Erik Velldal Universitetet i Oslo 9. februar 2017 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens prosedyrer
DetaljerLærerveiledning - Straffespark
Lærerveiledning - Straffespark Skrevet av: Geir Arne Hjelle Kurs: Scratch Tema: Blokkbasert, Spill Fag: Matematikk, Programmering Klassetrinn: 1.-4. klasse, 5.-7. klasse, 8.-10. klasse Om oppgaven I denne
DetaljerOppgave 1 - Linux kommandolinje (%)
Løsningsforslag Eksamen høst 2017 Operativsystemer Oppgave 1 - Linux kommandolinje (%) a) pwd b) ps Oppgave 2 - Bash-scripting (%) a) ping -i 5 www.hin.no b) ping -c 1 www.hin.no ping -c 1 -t 1 www.hin.no
DetaljerNIO 1. runde eksempeloppgaver
NIO 1. runde eksempeloppgaver Oppgave 1 (dersom du ikke klarer en oppgave, bare gå videre vanskelighetsgraden er varierende) Hva må til for at hele det følgende uttrykket skal bli sant? NOT(a OR (b AND
DetaljerINF Algoritmer og datastrukturer
INF2220 - Algoritmer og datastrukturer HØSTEN 2009 Institutt for informatikk, Universitetet i Oslo INF2220, forelesning 10: Disjunkte Mengder Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 10 1 / 27
DetaljerSnake Expert Scratch PDF
Snake Expert Scratch PDF Introduksjon En eller annen variant av Snake har eksistert på nesten alle personlige datamaskiner helt siden slutten av 1970-tallet. Ekstra populært ble spillet da det dukket opp
DetaljerLøsnings forslag i java In115, Våren 1998
Løsnings forslag i java In115, Våren 1998 Oppgave 1 // Inne i en eller annen klasse private char S[]; private int pardybde; private int n; public void lagalle(int i) if (i==n) bruks(); else /* Sjekker
DetaljerProgrammeringsspråket C Del 3
Programmeringsspråket C Del 3 Michael Welzl E-mail: michawe@ifi.uio.no 29.08.13 inf1060 1 Dynamisk allokering Ofte trenger man å opprette objekter under kjøringen i tillegg til variablene. Standardfunksjonen
DetaljerDel 4 Noen spesielle C-elementer
Del 4 Noen spesielle C-elementer 1 RR 2016 Header-filer inneholder Prototypene til funksjonene i standard biblioteket Verdier og definisjoner som disse funksjonene bruker #include #include
DetaljerNorgestur. Introduksjon. Steg 1: Et norgeskart. Sjekkliste. Skrevet av: Geir Arne Hjelle
Norgestur Skrevet av: Geir Arne Hjelle Kurs: Scratch Tema: Blokkbasert, Spill Fag: Matematikk, Programmering, Samfunnsfag Klassetrinn: 1.-4. klasse, 5.-7. klasse, 8.-10. klasse Introduksjon Bli med på
DetaljerTDT4105 Informasjonsteknologi, grunnkurs
1 TDT4105 Informasjonsteknologi, grunnkurs Matlab: Sortering og søking Anders Christensen (anders@idi.ntnu.no) Rune Sætre (satre@idi.ntnu.no) TDT4105 IT Grunnkurs 2 Pensum Matlab-boka: 12.3 og 12.5 Stoffet
DetaljerSolidPlant er perfekt for deg som jobber med design av rørsystemer og anlegg, og er kjent med SolidWorks.
SolidPlant, det eneste virkelig spesifikasjonsstyrte anleggsdesign programmet for SolidWorks. Ved å kombinere intuitive parametrisk styrte SolidWorks med en sofistikert database for å generere alle komponenter
DetaljerDagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner
Dagens plan: INF2220 - Algoritmer og datastrukturer HØSTEN 2009 Institutt for informatikk, Universitetet i Oslo INF2220, forelesning 10: Disjunkte Mengder Definisjon av binær relasjon Definisjon av ekvivalens
Detaljer