Vannskilletransformen implementert i C++/Python. Reidar Øksnevad

Størrelse: px
Begynne med side:

Download "Vannskilletransformen implementert i C++/Python. Reidar Øksnevad"

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 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

Detaljer

Oversikt, kursdag 5. Matematisk morfologi V. Hva er segmentering. Hva er segmentering. Lars Aurdal Norsk regnesentral

Oversikt, 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

Detaljer

Matematisk morfologi IV

Matematisk 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.

Detaljer

Motivasjon. Litt sett-teori. Eksempel. INF Mesteparten av kap i DIP Morfologiske operasjoner på binære bilder.

Motivasjon. 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

Detaljer

Innhold 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. 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,

Detaljer

Motivasjon. Litt sett-teori. Eksempel. INF Kap. 11 i Efford Morfologiske operasjoner. Basis-begreper

Motivasjon. 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

Detaljer

Motivasjon. INF 2310 Morfologi. Eksempel. Gjenkjenning av objekter intro (mer i INF 4300) Problem: gjenkjenn alle tall i bildet automatisk.

Motivasjon. 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

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET 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

Detaljer

Oversikt, kursdag 4. Matematisk morfologi IV. Geodesi-transformasjoner: Dilasjon. Geodesi-transformasjoner

Oversikt, 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

Detaljer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Hva 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

Detaljer

Morfologiske operasjoner på binære bilder

Morfologiske 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

Detaljer

MAT1030 Forelesning 28

MAT1030 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!

Detaljer

Kanter, kanter, mange mangekanter. Introduksjon: Steg 1: Enkle firkanter. Sjekkliste. Skrevet av: Sigmund Hansen

Kanter, 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

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET 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:

Detaljer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Hva 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

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET 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

Detaljer

Forelesning 30. Kompleksitetsteori. Dag Normann mai Informasjon. Oppsummering

Forelesning 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

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET 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

Detaljer

Morfologi i Binære Bilder

Morfologi 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

Detaljer

Kanter, kanter, mange mangekanter

Kanter, 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

Detaljer

København 20 Stockholm

Kø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:

Detaljer

Matematisk morfologi II

Matematisk 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:

Detaljer

Oversikt, kursdag 2. Matematisk morfologi II. Morfologiske operatorer, erosjon og dilasjon. Morfologiske operatorer, erosjon og dilasjon

Oversikt, 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.

Detaljer

MAT1030 Diskret matematikk

MAT1030 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

Detaljer

MAT1030 Diskret Matematikk

MAT1030 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

Detaljer

Læ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. 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,

Detaljer

Forelesning 29: Kompleksitetsteori

Forelesning 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

Detaljer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Hva 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

Detaljer

Reelle tall på datamaskin

Reelle 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

Detaljer

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

programeksempel 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"

Detaljer

Objektorientert programmering i Python

Objektorientert 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

Detaljer

Morfologiske operasjoner på binære bilder

Morfologiske 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

Detaljer

2 Om statiske variable/konstanter og statiske metoder.

2 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.

Detaljer

Morfologi i Binære Bilder II

Morfologi 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

Detaljer

Om du allerede kjenner Scratch og har en Scratchbruker kan du gå videre til Steg 1.

Om 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

Detaljer

Et 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 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

Detaljer

Etter uke 6 skal du. Introduksjon til objektorientert programmering. Hva skjedde ~1967? INF1001. Grunnkurs i objektorientert programmering

Etter 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

Detaljer

Debugging. Tore Berg Hansen, TISIP

Debugging. 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...

Detaljer

Introduksjon. Morfologiske operasjoner på binære bilder. Litt mengdeteori. Eksempel: Lenke sammen objekter INF

Introduksjon. 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.,

Detaljer

Donkey Kong. Introduksjon. Oversikt over prosjektet. Skrevet av: Geir Arne Hjelle

Donkey 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

Detaljer

Introduksjon. Litt mengdeteori. Eksempel: Lenke sammen objekter. Morfologiske operasjoner på binære bilder. INF2310 Digital bildebehandling

Introduksjon. 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

Detaljer

Python: 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 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

Detaljer

Oppgave 1. Sekvenser (20%)

Oppgave 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

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET 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:

Detaljer

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

public 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

Detaljer

Husk at du skal ha to vinduer åpne. Det ene er 'Python Shell' og det andre er for å skrive kode i.

Husk 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

Detaljer

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

OPPGAVE 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.

Detaljer

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Heap 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

Detaljer

IN1000 Obligatorisk innlevering 7

IN1000 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

Detaljer

INF1010 notat: Binærsøking og quicksort

INF1010 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.

Detaljer

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

public 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

Detaljer

Algoritmer og Datastrukturer

Algoritmer 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.

Detaljer

Norsk informatikkolympiade runde

Norsk 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.

Detaljer

Pong. Oversikt over prosjektet. Steg 1: En sprettende ball. Plan. Sjekkliste. Introduksjon

Pong. 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

Detaljer

INF Innleveringsoppgave 6

INF 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

Detaljer

NOTAT (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. 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

Detaljer

Rekursjon. Binærsøk. Hanois tårn.

Rekursjon. 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

Detaljer

Norgestur. Introduksjon. Steg 1: Et norgeskart. Sjekkliste. Scratch. Skrevet av: Geir Arne Hjelle

Norgestur. 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

Detaljer

Binære trær: Noen algoritmer og anvendelser

Binæ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(?):

Detaljer

Algoritmer og Datastrukturer

Algoritmer 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.

Detaljer

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse

NOTAT (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

Detaljer

Hvordan 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!?) 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

Detaljer

Oversikt, kursdag 3. Matematisk morfologi III. Hit-or-miss transformen og skjeletter. Hit-or-miss transformen og skjeletter

Oversikt, 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

Detaljer

1. Å lage programmer i C++

1. Å 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

Detaljer

1. Å lage programmer i C++

1. Å 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

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET 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

Detaljer

TDT4113 - Datateknologi, programmeringsprosjekt

TDT4113 - 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:

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET 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

Detaljer

MAT-INF 1100: Obligatorisk oppgave 1

MAT-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 å

Detaljer

3. obligatoriske innlevering, høsten 2014

3. 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.

Detaljer

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

EKSAMEN. 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

Detaljer

Norsk informatikkolympiade runde

Norsk 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.

Detaljer

Hvorfor objektorientert programmering? Objektorientert programmering i Python: Introduksjon. Læringsmål uke 7. Undervisning og pensum IN1000

Hvorfor 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,

Detaljer

Forelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Dag Normann

Forelesning 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

Detaljer

A study of different matching heuristics. Hovedfagspresentasjon Jan Kasper Martinsen

A 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

Detaljer

Kompleksitetsanalyse Helge Hafting 25.1.2005 Opphavsrett: Forfatter og Stiftelsen TISIP Lærestoffet er utviklet for faget LO117D Algoritmiske metoder

Kompleksitetsanalyse 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

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET 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.

Detaljer

INF Algoritmer og datastrukturer

INF 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:

Detaljer

Fra Python til Java, del 2

Fra 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

Detaljer

Grunnleggende Grafalgoritmer II

Grunnleggende 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

Detaljer

Hvorfor objektorientert programmering?

Hvorfor 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,

Detaljer

GJENNOMGANG UKESOPPGAVER 9 TESTING

GJENNOMGANG 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.

Detaljer

MAT1030 Diskret Matematikk

MAT1030 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

Detaljer

Informasjon Eksamen i IN1000 høsten 2017

Informasjon 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

Detaljer

Introduksjon til objektorientert programmering

Introduksjon 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

Detaljer

Disjunkte mengder ADT

Disjunkte 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

Detaljer

Matematisk Morfologi Lars Aurdal

Matematisk Morfologi Lars Aurdal Matematisk Morfologi Lars Aurdal FORSVARETS FORSKNINGSINSTITUTT Motivasjon. Plan Grunnleggende setteori. Grunnleggende operasjoner. Dilasjon. Erosjon. Sammensatte operasjoner Åpning Lukning Algoritmer.

Detaljer

INF2810: Funksjonell Programmering

INF2810: 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

Detaljer

Lærerveiledning - Straffespark

Læ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

Detaljer

Oppgave 1 - Linux kommandolinje (%)

Oppgave 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

Detaljer

NIO 1. runde eksempeloppgaver

NIO 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

Detaljer

INF Algoritmer og datastrukturer

INF 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

Detaljer

Snake Expert Scratch PDF

Snake 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

Detaljer

Løsnings forslag i java In115, Våren 1998

Lø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

Detaljer

Programmeringsspråket C Del 3

Programmeringssprå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

Detaljer

Del 4 Noen spesielle C-elementer

Del 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

Detaljer

Norgestur. Introduksjon. Steg 1: Et norgeskart. Sjekkliste. Skrevet av: Geir Arne Hjelle

Norgestur. 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å

Detaljer

TDT4105 Informasjonsteknologi, grunnkurs

TDT4105 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

Detaljer

SolidPlant er perfekt for deg som jobber med design av rørsystemer og anlegg, og er kjent med SolidWorks.

SolidPlant 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

Detaljer

Dagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner

Dagens 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