A09-17Kuvanrekisteröinti indosyaniinivihreä videoangiografiaan

Samankaltaiset tiedostot
Ohjelmointi 1. Kumppanit

S09 04 Kohteiden tunnistaminen 3D datasta

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Zeon PDF Driver Trial

Algoritmit 1. Luento 3 Ti Timo Männikkö

CUDA. Moniydinohjelmointi Mikko Honkonen

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

Videon tallentaminen Virtual Mapista

Harjoitustyön testaus. Juha Taina

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Opi kuvin: By Choice v.1.4 asennus Asennus järjestelmänvalvojan oikeuksin

Matopeli C#:lla. Aram Abdulla Hassan. Ammattiopisto Tavastia. Opinnäytetyö

ANVIA ONLINE BACKUP ASENNUSOPAS 1(7) ANVIA ONLINE BACKUP ASENNUSOPAS 1.0

Tietotekniikan valintakoe

11/20: Konepelti auki

Python-ohjelmointi Harjoitus 2

PRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER

Ohjelmoinnin peruskurssi Y1

Nexetic Shield Unlimited

JOHDATUS TEKOÄLYYN TEEMU ROOS

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

P6SLite ohjaus- ja zoom komennot

811312A Tietorakenteet ja algoritmit I Johdanto

Ohjeissa pyydetään toisinaan katsomaan koodia esimerkkiprojekteista (esim. Liikkuva_Tausta1). Saat esimerkkiprojektit opettajalta.

Kon Mekanismiopin perusteet

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

S14 09 Sisäpeltorobotti AS Automaatio ja systeemitekniikan projektityöt. Antti Kulpakko, Mikko Ikonen

Valppaan asennus- ja käyttöohje

Ohjelmoinnin perusteet Y Python

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

erasmartcardkortinlukijaohjelmiston

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Johdatus ohjelmointiin

Lue käyttöohje huolellisesti läpi ennen tuotteen käyttöönottoa.

Kanta ja Kannan-vaihto

erasmartcard-kortinlukijaohjelmiston asennusohje (mpollux jää toiseksi kortinlukijaohjelmistoksi)

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Rahastosalkun faktorimallin rakentaminen

Vektorien pistetulo on aina reaaliluku. Esimerkiksi vektorien v = (3, 2, 0) ja w = (1, 2, 3) pistetulo on

CTRL+F Android-sovellus

Tieverkon kunnon stokastinen ennustemalli ja sen soveltaminen riskienhallintaan

Kuvaruudun striimaus tai nauhoitus. Open Broadcaster Software V.20. Tero Keso, Atso Arat & Niina Järvinen (muokattu )

Algoritmit 2. Luento 13 Ti Timo Männikkö

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014

Kieliversiointityökalu Java-ohjelmistoon. Ohje

Kopioi cd-levyt kiintolevylle, niin fyysiset levyt joutavat eläkkeelle.

ELOKUVATYÖKALUN KÄYTTÖ ANIMAATION LEIKKAAMISESSA. Kun aloitetaan uusi projekti, on se ensimmäisenä syytä tallentaa.

Kuvaruudun striimaus tai nauhoitus. Open Broadcaster Software V.20. Tero Keso, Atso Arat, Niina Järvinen & Valtteri Virtanen (muokattu 20.2.

Nexetic Shield Unlimited

Fluoresenssitomografian simulointia Loppudokumentti

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

ax + y + 2z = 0 2x + y + az = b 2. Kuvassa alla on esitetty nesteen virtaus eräässä putkistossa.

z 1+i (a) f (z) = 3z 4 5z 3 + 2z (b) f (z) = z 4z + 1 f (z) = 12z 3 15z 2 + 2

Kerro kuvin: InPrint 2.8 asennus Asennus järjestelmänvalvojan oikeuksin

Hellä ensikosketus. Tomi Kiviniemi

Suoran yhtälöt. Suoran ratkaistu ja yleinen muoto: Suoran yhtälö ratkaistussa, eli eksplisiittisessä muodossa, on

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

GPS Miten opin käyttämään? Mihin käytän?

Picasa 3 -kuvankäsittelyopas, osa 2, käytä tehokkaasti

4.3. Matemaattinen induktio

Telecrane F24 Käyttö-ohje

Kimppu-suodatus-menetelmä

Videon tallentaminen Virtual Mapista

Sääasema Probyte JUNIOR

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

2 Konekieli, aliohjelmat, keskeytykset

AS Automaatio- ja systeemitekniikan projektityöt

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Alkuraportti. LAPPEENRANNAN TEKNILLINEN YLIOPISTO TIETOJENKÄSITTELYN LAITOS CT10A Kandidaatintyö ja seminaari

Käyttäjien tunnistaminen ja käyttöoikeuksien hallinta hajautetussa ympäristössä

TTY TKT-1110 Mikroprosessorit TKT. HEW-ohjeet ver 1.0


2009 Mat Operaatiotutkimuksen Projektityöseminaari L

4. Funktion arvioimisesta eli approksimoimisesta

GIS-automatisointi ja ohjelmointi/skriptaus. Harri Antikainen

Lauseen erikoistapaus on ollut kevään 2001 ylioppilaskirjoitusten pitkän matematiikan kokeessa seuraavassa muodossa:

Tietokanta.java Luokka tarjoaa välineet tietokannan lukemiseen. Haetuista tiedoista muodostetaan kurssi- ja opetus-olioita.

Automaattinen arviointi ja pika-arviointi EXAM-tenteissä. Marjut Anderson

Verkkotietopalvelu Käyttöopas osiot koskien Green Card suoritusten vastaanottajien sekä suorittajien tietojen lisäämistä

Käännös, linkitys ja lataus

Tentin asetukset. Tentin lisääminen. Tentin asetukset

Käyttöliittymän muokkaus

Pika-asennusohjeet Suomeksi

TEEMU ROOS (KALVOT MUOKATTU PATRIK HOYERIN LUENTOMATERIAALISTA)

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

TEHTÄVÄ 4: Microsoft Windows Deployment Services asennus ja hallinta

Käyttöohje. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Hannu Mäkiö. kertolasku * jakolasku / potenssiin korotus ^ Syöte Geogebran vastaus

EMVHost Online SUBJECT: EMVHOST ONLINE CLIENT - AUTOMAATTISIIRROT COMPANY: EMVHost Online Client sovelluksen käyttöohje AUTHOR: DATE:

Nosturirobotti. robotin tarkoitus. mikä on robotin tehtävä. Kurssin robottiohjelmointi, kesä 2011 harjoitustyö

JOHDATUS TEKOÄLYYN TEEMU ROOS

NEX-3/NEX-5/NEX-5C A-DTS (1) 2010 Sony Corporation

Ohjelmoinnin perusteet Y Python

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

Transkriptio:

AS-0.3200 A09-17Kuvanrekisteröinti indosyaniinivihreä videoangiografiaan Projektityö Marianna Kontulainen 12/9/2009

Sisällysluettelo 1 Projektin tavoite... 3 2 ITK-kirjasto... 3 2.1 Kuvanrekisteröintiprosessi... 3 2.2 Intensiteettiin perustuva rekisteröinti... 4 2.3 Piirteisiin perustuva rekisteröinti... 4 3 Projektin kulku... 4 3.1 Ajankäyttö... 4 3.2 Toteutuneet riskit... 5 4 Python-rajapinta... 5 4.1 Asennus... 6 4.2 Koodi... 6 5 Toteutunut ohjelma... 6 5.1 ITK:n asennus ja kääntäminen... 6 5.2 Videomateriaali... 6 5.2 Valitut funktiot... 7 5.3 Ohjelman rakenne... 7 5.4 Käytetyt keinot suorituksen nopeuttamiseksi... 7 5.5 Suorituskyky... 8 6 Kehitysehdotuksia... 8 7 Käytettyä kirjallisuutta... 9

1 Projektin tavoite Projektityön tavoitteena oli tehdä kuvanreksteröintiohjelma indosyaniinivihreä (ICG, indocyanine green) videoangiografiaan. Angiografiassa potilaan verisuoneen ruiskutetaan varjoainetta, jonka jälkeen aineen etenemistä voidaan kuvata mm. röntgenillä tai infrapunakameralla. Indosyaniinivihreä lääketieteessä yleisesti käytetty varjoaine. Aine fluoresoi lähi-infrapuna-alueella, joten yksinkertaisimmillaan infrapunakamerana voidaan käyttää tavallista digikameraa. Kuvanrekisteröinnissä peräkkäiset videoframet kohdistetaan päällekkäin, jolloin kuvauslaitteen liikkumisesta aiheutuva häiriö poistuu. Rekisteröitävä videokuva on peräisin aivoleikkauksesta. Rekisteröinnistä oli tarkoituksena tehdä nopeaa, jotta sitä voitaisiin käyttää onlinekuvanrekisteröinnissä. Reaaliaikaisessa kuvanrekisteröinnissä rekisteröinti pitäisi pystyä suorittamaan 15-25 kertaa sekunnissa. Valmiissa ohjelmassa tulisi myös olla mahdollisuus seurata rekisteröinnin etenemistä ja onnistumista suorituksen aikana. Tavoitteena oli käyttää valmista ITK-kirjastoa (Insight Segmentation and Registration Toolkit) apuna ohjelman toteuttamisessa. ITK-kirjasto on toteutettu C++-kielellä, mutta siitä on olemassa rajapinnat Pythonille, Javalle sekä Matlabille. Projektityön aluksi suunnitelmana oli käyttää Python-rajapintaa, jotta ohjelmointi sujuisi helpommin. 2 ITK-kirjasto 2.1 Kuvanrekisteröintiprosessi ITK:n kuvanrekisteröintiprosessi on kuvan 1 mukainen. Sisääntulona prosessiin syötetään kaksi kuvaa, joista toinen on paikallaan oleva kuva ja toinen liikkuva kuva. Iteraatiosyklin mitta-osiossa lasketaan mitta, joka kuvaa paikallaan olevan ja liikkuvan kuvan välistä eroa. Optimointi-osiossa lasketaan edelliseltä iteraatiokierrokselta saadun mitan perusteella uudet transformaatioparametrit. Transformaatio kohdassa tehdään varsinainen mäppäys kahden kuvan pisteiden välillä käyttäen optimointi-osiossa laskettuja transformaatioparametreja. Interpolointia tarvitaan, koska pisteet eivät aina mäppäydy suoraan gridille vaan hieman ohi siitä. Iterointisykliä toistetaan kunnes liikkuva kuva on saatu kohdistettua riittävän hyvin paikallaan olevan kuvan päälle. Kuva 1. Kuvanrekisteröintiprosessi

2.2 Intensiteettiin perustuva rekisteröinti Intensiteettiin perustuvassa rekisteröintimenetelmässä käytetään koko kuvadataa. Tämän ansiosta rekisteröintiprosessi on automaattinen, mutta laskennallisesti se voi olla hidas erityisesti käytettäessä suuren resoluution kuvia tai tarkkoja 3D-kuvia. Tarkoituksena on minimoida kustannusfunktiota, joka mittaa kuvien intensiteettiien samankaltaisuutta. Tässä projektityössä tehdyssä ohjelmassa rekisteröintimenetelmä on intensiteettiin perustuva, joten tästä menetelmästä kerrotaan tarkemmin luvussa 5. 2.3 Piirteisiin perustuva rekisteröinti Piirteisiin perustuvassa rekisteröinnissä kuvasta valitaan tiettyjä tunnistettavia piirteitä, kuten pisteitä, viivoja tai muotoja. Tämä menetelmän on nopeampi verrattuna intensiteettiin perustuvaan menetelmään, koska rekisteröinnin tekemiseen ei tarvita koko kuvadataa. Ennen rekisteröintiprosessin aloittamista käyttäjän on yleensä valittava piirteet, joiden mukaan rekisteröinti tehdään. Näin ollen rekisteröintiprosessi ei ole täysin automaattinen eikä tapauksesta riippumaton. Angiografiakuvissa piirteinä voisi käyttää esimerkiksi suonien risteyskohtia. Eri leikkauksissa sngiografiassa näkyy kuitenkin erilaisia risteyksiä, jolloin käyttäjän olisi aina osoitettava risteyskohdat. Lisäksi osa piirteistä saattaa olla osan aikaa poissa näkyvistä (kuvan ulkopuolella tai leikkausinstrumentin alla), joka aiheuttaa lisävaikeuksia rekisteröintiin. Piirteiden löytäminen ja tunnistaminen kuvasta ei ole helppo tehtävä. ITK-kirjastossa on funktioita liittyen piirteisiin perustuvaan rekisteröintiin. Yksinkertaisimillaan piirteinä voi siis olla yksittäisiä pisteitä. Minimoidaan kahden kuvan pistejoukkojen etäisyyttä. Ensimmäinen skenaaroi soveltuu jäykkään tai affiini transformaatioon. Siinä kahdessa pistejoukossa on sama määrä pisteitä ja tietyllä pisteellä yhdessä joukossa tiedetään olevan täsmälleen yksi vastaava piste toisessa pistejoukossa. Toisessa skenaariossa pisteiden välistä vastaavuutta ei tunneta eikä pistejoukot ole välttämättä saman kokoisia. Ensimmäisen skenaarion mukaiseen rekisteröintiongelmaa voidaan yrittää ratkaista ITK:n funktiolla LandmarkBasedTransformInitializer. Jos kyseessä on deformaation rekisteröinti, voidaan käyttää ITK:n KernelTransform-funktioita. 3 Projektin kulku 3.1 Ajankäyttö Ajankäyttö on esitetty tarkemmin alla olevassa taulukossa. Projektityöhön käytetty aika vastaa vajaata viittä opintopistettä (127,5h/27h=4,72 op). Projektin aluksi asetin omaksi tavoitteekseni 5 opintopistettä. Viikko Käytetty tuntimäärä: 37 Aiheiden jako, alustavaa tutustumista rekisteröintiin 4 38 Tarkennusta työhön ohjaajalta, suunnittelua työparin kanssa 3,5 Kirjallisuuden lukemista (mm. Insight into Images) 6 39 Tapaaminen ohjaajan ja työparin kanssa 1,5 Työsuunnitelman teko ja esittely 6 Kirjallisuuden lukemista (mm. ITK software guide) 9

40 Python rajapinnan asennus 6,5 Esimerkkien koodausta Pythonilla 13 41 Esimerkkien koodausta Pythonilla 2 42 ITK:n kääntäminen (C++-kieleen siirtyminen) 7 43 Alkeellisen rekisteröintiohjelman koodaus C++:lla 7,5 44 Koeviikko, sain työssä käytettävän videomateriaalin Kahden kuvan kaappaus videomateriaalista ja käyttö tehdyssä ohjelmassa 2 Kuvasarjan teko videomateriaalista kaapatusta kuvasta 4 45 Väliraportin teko ja esittely 5 46 Koodausta (multi resolution menetelmä) 3 47 Koodausta (multi resolution menetelmä) 3,5 48 Lopullisen ohjelman koodaus: Ohjelman perusrakenne, tulosteet 14 Eri funktioiden kokeilua 6 49 Parametrien säätöä ja ohjelman suorituskyvyn arviointia 8 50 Loppudemon esittely ja kalvojen teko 4 Loppudokumentin kirjoitus 12 Yhteensä: 127,5 3.2 Toteutuneet riskit Projektin alussa suurimmaksi riskiksi luokiteltiin epäilys siitä, että ITK-kirjaston ei välttämättä sovellu nopeaan kuvanrekisteröintiin. Erityisesti deformaation rekisteröinti nopeasti aiheutti huolta. Projektin aikana tämä epäilys osoittautui todeksi ja toteutetussa ohjelmassa jäätiin kauaksi tavoitellusta rekisteröintinopeudesta huolimatta erilaisista yrityksistä nopeuttaa suoritusta. Ohjelmointikielen epäiltiin myös aiheuttavan ongelmia. Pythonilla ohjelmointi olisi sopinut minulle paremmin ja työtä aloitettiinkin tekemään Python-rajapinnan avulla. Opettelin ITK-kirjaston käyttöä Pythonilla. Ohjelmoin esimerkkiohjelmia ja kokeilin erilaisten funktioiden toimintaa. Selvisi kuitenkin, että rajapinnan kautta ei ole kaikkia tarvittavia funktioita käytettävissä, joten jouduin vaihtamaan C++-kieleen. Osa Pythonilla ohjelmointiin käytetty aika meni hukkaan ja ohjelmointi C++-kielellä oli hitaampaa, koska minulla ei ollut paljoa kokemusta sillä ohjelmoimisesta. Aloitin tekemään työtä parin kanssa ja hän oli mukana vielä väliraportin aikaan. Myöhemmin selvisi kuitenkin, että parini ei suoritakaan kurssia. Kaikki kurssiin liittyvät tuotokset ovat minun tekemiäni. Odotin kuitenkin saavani apua erityisesti loppudokumentin kirjoittamiseen ja siksi en pysynyt täysin aikataulussa. 4 Python-rajapinta Aloitin tekemään projektityötäni Python-rajapinnan kautta. Ajattelin, että Pythonilla ohjelmoiminen olisi nopeampaa ja itselleni helpompaa. ITK:n ohjelmointikieli on siis C++. Itselläni ei ollut aiempaa kokemusta kyseisestä ohjelmointikielestä, joten työtä nopeuttaakseni päätin käyttää Pythonrajapintaa.

4.1 Asennus Python-rajapinnan käyttöönottoa varten asensin seuraavat ohjelmat: Python 2.16 wrapitk 0.3.0 (binäärit) ITK 3.14.0 4.2 Koodi Opettelin ITK:n käyttöä Pythonilla ja ohjelmoin ITK:n esimerkkejä Pythonilla, jotka oli aiemmin toteutettu C++:lla. Lopputuloksena tästä työstä on muutamia ohjelmia, joissa tehdään yksinkertainen rekisteröinti kahdelle kuvalle. Kaikki funktiot eivät kuitenkaan ole käytössä Pythonrajapinnan kautta. Päätös ohjelmointikielenvaihdosta syntyi, kun selvisi, että esimerkiksi käyttämäni CenteredRigid2DTransform-funktio ei ollut käytettävissä rajapinnan kautta. Lopullisen toteutuksessa en voinut käyttää Pythonilla tekemääni koodia. 5 Toteutunut ohjelma 5.1 ITK:n asennus ja kääntäminen ITK:n kääntämistä ja asennusta varten tarvitsin seuraavat ohjelmat: MinGW 5.1.6 MSYS 1.0.11 Cmake 2.6.4 ITK 3.16.0 ITK Software Guiden luvussa kaksi on selkeät ohjeet kirjaston asennukseen ja tein asennuksen sen mukaan. 5.2 Videomateriaali Alkuperäisenä suunnitelmana oli tehdä ohjelma, joka pilkkoo videomateriaalin ensin yksittäisiin kuviin, suorittaa rekisteröinnin kuville ja yhdistää sitten yksittäiset kuvat takaisin videoksi. Ennen kuin sain videomateriaalin käsiini, etsin valmiita ohjelmia ja muita ratkaisuja, joilla videokuvan saisi helposti jaettua yksittäisiin kuviin. ITK:ssa ei ollut valmiita funktioita tämän tekemiseen. Saadessani lopulta videomateriaalin jouduin muuttamaan suunnitelmiani. Videomateriaalissa kirurgi paineli kudosta leikkaustyökalulla, jolloin verisuonten muoto muuttui. Aikaisemmin oli todettu, että ITK:n rekisteröintifunktiot, jotka ottivat deformaation huomioon olivat liian raskaita reaaliaikaiseen rekisteröintiin. Videomateriaalia oli ilmeisesti käytetty opetustarkoitukseen ja kuvan päälle oli lisätty selventäviä tekstejä. Myös nämä tekstit todettiin ongelmallisiksi rekisteröinnin kannalta. Näistä syistä päätin olla käyttämättä saatua videota sellaisenaan. Sen sijaan kaappasin videomateriaalista yhden kuvan ja liikuttelemalla tätä yhtä kuvaa sain muodostettua sarjan kuvia, jotka syötin ohjelmaani. Käytin apuna vidonkäsittelyohjelmaa. Tekemässäni kuvasarjassa kuvat ovat resoluutioltaan 256x256, ne siirtyvät sekä kiertyvät ja ne on tallennettu png-formaatissa.

5.2 Valitut funktiot Projektityön aikana kokeilin useita rekisteröintifunktioita ja luin ITK Software Guidea sekä dokumentaatiota. Tärkeimpänä valintakriteerinä oli nopeus. Esittelen tässä lyhyesti rekisteröintiprosessin eri osiin liittyvät funktiot. Muitakin funktioita toki käytettiin, mutta nämä ovat rekisteröinnin kannalta tärkeimmät. Transformaatiofunktioksi valitsin CenteredRigid2Dtransformfunktion. Funktio on tarkoitettu jäykkien kappaleiden 2D-kuvien rekisteröintiin. Iteraatioprosessin aikana kuvaa kierretään keskipisteen ympäri, kun normaalisti kierto tehdään kuvan kulmassa olevan pisteen ympäri. Mittana käytin MeanSquaresImageToImageMetric-funktiota, jossa lasketaan keskineliöllinen pikselikohtainen ero intensiteetissä kahden kuvan välillä. Mitan optimaalinen arvo on nolla. Interpolaattorifunktioksi valitsin LinearInterpolateImageFunction-funktion, jossa oletetaan, että intensiteetti muuttuu lineaarisesti grid-sijaintien välillä. Optimointi funktiona käytin RegularStepGradientDescentOptimizer-funktiota. Funktiossa parametreja muutetaan gradientin suuntaan. 5.3 Ohjelman rakenne Ohjelma ajetaan komentoriviltä ja se ottaa komentoriviparametreinä rekisteröitävän kuvasarjan sijainnin ja formaatin, kuvasarjan viimeisen kuvan numeron sekä sijainnin ja formaatin, jolla rekisteröity kuvasarja tallennetaan. Komento, jolla ohjelma käynnistetään on seuraavanlainen Registration1 input/img%03d.png 49 output/out%03d.png Kuvien tiedostoformaatti on png ja tässä esimerkissä rekisteröitävät kuvat löytyvät input-kansiosta ja rekisteröidyt kuvat laitetaan output-kansioon. Kuvien tiedostonimet ovat img000.ong, img001.png, img002.png jne. Toteutetussa ohjelmassa paikallaan oleva kuva on koko ajan kuvasarjan ensimmäinen kuva. Rekisteröintiprosessi tehdään for-loopissa, jossa kuvasarjan jokainen kuva käydään läpi ja asetetaan liikkuvaksi kuvaksi. Rekisteröinti tehdään aina yhdelle kuvaparille kerrallaan. Lopuksi rekisteröity kuvasarja siis palautetaan tiedostoon. 5.4 Käytetyt keinot suorituksen nopeuttamiseksi Kuvamateriaalista tehtiin useita oletuksia, joiden odotettiin nopeuttavan rekisteröintiä. Ensimmäinen oletus oli, että kuvassa ei tapahdu deformaatiota. Tämä oletus tehtiin, koska ITK:n deformaation huomioon ottavien funktioiden suoritus kesti useita minuutteja. Vertasin funktioiden suoritusaikoja ajamalla ITK:n valmiita esimerkkiohjelmia. Projektityössä käytettävä kuvamateriaalissa ei siis tapahdu muodon muutosta, se ainoastaan siirtyy ja kiertyy. Oletettiin myös, että videokuva on pieniresoluutioista eli tässä tapauksessa 256x256. Lisäksi maksimikiertymä ja -siirtymä oletettiin melko pieniksi. Kuvasarja, joka tehtiin tätä projektityötä varten oli kaikkien näiden oletusten mukainen. Kaikki edellä mainituista oletuksista eivät todennäköisesti pätisi oikealle videomateriaalille verisuonikartoituksesta. Kirurgin leikkaustyökalut saattavat olla kohteen edessä ja kirurgi saattaa koskea kudosta niin, että kohteen muoto muuttuu. Resoluutio ja oletus siitä, että kuva liikkuu vain vähän eri framejen välillä voi pitää paikkansa oikeassakin tilanteessa. Eräs keino, jolla ohjelman suoritusta pyrittiin nopeuttamaan oli Multi Resolution menetelmän käyttäminen. Tässä menetelmässä paikallaan olevasta ja liikkuvasta kuvasta muodostetaan

kuvapyramidit, joissa alkuperäisistä kuvista on muodostettu annetujen kutistustekijöiden mukaan pienempiresoluutioisia kuvia. Rekisteröinti tehdään ensin pienimmän resoluution kuville ja iteraatiokierrosten edetessä resoluutiota kasvatetaan. Lisäksi suoritusta voidaan nopeuttaa tekemällä rekisteröinti vain joka toiselle kuvalle. 5.5 Suorituskyky Multi resolution -menetelmä ei nopeuttanut ohjelman suoritusta kuten odotettiin; eroa tuskin huomasi. Menetelmästä on apua, jos rekisteröitävät kuvat ovat kaukana toisistaan. Projektityössä toteutetussa ohjelmassa kuvan oletettiin liikkuvan todella vähän, joten menetelmä ei vähentänyt iteraatiokertoja merkittävästi. Ohjelman suoritukseen kului omalla koneellani kuusi minuuttia. Ohjelman suoritusnopeus riippuu hyvin paljon käytettävän PC:n tehokkuudesta. Kokeilin ohjelman suoritusta myös toisella, tehokkaammalla koneella ja suoritusaika oli 50 sekuntia. Myös sillä oli merkitystä, millä alustalla ohjelma käännettiin. Parhaimmillaan pääsin 40 sekunnin suoritusaikaan. Suoritusaika puolittuu, jos rekisteröinnissä käytetään vain joka toista kuvaa. Jätettäessä joka toinen kuva huomioimatta, suorituksen tarkkuus kärsii ja mitan arvo kasvaa. Ohjelman suoritusajassa jäätiin kauaksi tavoitellusta, mutta optimoimalla ohjelmaa edelleen ja käyttämällä riittävän tehokasta PC:tä voidaan päästä reaaliaikaisen rekisteröinnin tavoitteisiin. Liitteenä on taulukko rekisteröintituloksista. Niistä nähdään, että mitan arvo on yhtä rekisteröintikierrosta lukunnottamatta alle yhden. Ero alkuperäisestä kuvasarjasta laskettujen arvojen ja rekisteröinnin tuloksena saatavien arvojen välillä on todella pieni kierron ja y-suuntaisen translaation kohdalla. X-suunnassa ero on hieman suurempi. Tämä johtuu todennäköisesti vain siitä, että alkuperäisessä kuvasarjassa kuva liikkuu x-suunnassa enemmän, jolloin eroa on jäljellä enemmän myös rekisteröinnin jälkeen. Katsottaessa rekisteröinnin tuloksena saatavaa kuvasarjaa rekisteröinti näyttää onnistuneen hyvin; kuva pysyy paikallaan ja se on riittävän tarkka. 6 Kehitysehdotuksia Toteutettu ohjelma ottaa 50 kuvaa, tekee kaikille rekisteröinnin ja palauttaa 50 rekisteröityä kuvaa. Jos rekisteröintiohjelmaa käytettäisi online-rekisteröinnissä, pitäisi ohjelma toteuttaa niin, että se ottaa yhden kuvaparin eli kaksi peräkkäistä kuvaa, joista ensimmäinen asetetaan paikallaan olevaksi kuvaksi ja toinen liikkuvaksi kuvaksi. Ohjelma tekee tälle kuvaparille rekisteröinnin ja palauttaa yhden rekisteröidyn kuvan. Kuvaparin jälkimmäinen kuva siirtyy seuraavaksi paikallaan olevaksi kuvaksi ja videovirrasta otetaan uusi kuva liikkuvaksi kuvaksi. Jos kuva liikkuu hitaasti kauaksi alkuperäisestä kohteesta ja rekisteröinti tehdään aina kahdelle peräkkäiselle kuvalle, myös rekisteröity kuva alkaa liikkua eikä pysy paikallaan kuten oli tarkoitus. Tästä syystä rekisteröinnissä tulee ottaa huomioon myös ensimmäisen kuvan koordinaatit ja laskea jäljessä tulevien kuvien koordinaatit ensimmäisen kuvan suhteen. Vaikka kuva siirtyisi kokonaan pois ensimmäisen kuvan määrittämältä kohdealueelta, ohjelma säilyttää kuitenkin tiedon liikkuvan kuvan sijainnista, mutta rekisteröity kuva pysyy paikallaan. Koordinaattien selvittämiseksi on tutkittava tarkemmin ITK:n tapaa tehdä rekisteröinti. Mikäli rekisteröinti halutaan tehdä FPGA:lla, on ITK näkemykseni mukaan liian raskas kirjasto siihen tarkoitukseen. Jos rekisteröintiohjelmaa suoritetaan PC:ssä, on ITK:n käyttäminen mahdollista myös

online-rekisteröinnin tapauksessa. Toinen kirjasto, jonka sopivuutta kuvanrekisteröintiin voisi tutkia on OpenCV-kirjasto. OpenCV (Open Source Computer Vision) on konenäkösovelluksia varten tehty avoimen lähdekoodin kirjasto, joka on tarkoitettu erityisesti reaaliaikaiseen kuvaprosessointiin. Kirjaston funktioita voisi soveltaa piirteisiin perustuvaan rekisteröintiin. Lisäksi kirjastosta löytyy valmis funktio still-kuvien kaappaamiseen videokuvasta. 7 Käytettyä kirjallisuutta [1] Tuomas Seppälä; Indosyaniinivihreä silmän optisessa verisuonikartoituksessa; Kandidaatintyö; 10.12.2008 [2] Luis Ibáñez, Will Schroeder, Lydia Ng, Josh Cates, Insight Software Consortium; The ITK Software Guide; 21.11.2005; http://www.itk.org/itksoftwareguide.pdf [3]Terry S. Yoo; Insight into Images: Principles and Practice for Segmentation, Registration, and Image Analysis; 2004; ISBN: 9781568812175 [4] ITK 3.16.0 Documentation; http://www.itk.org/doxygen316/html/index.html

Translaatio x-suunta Alkuperäinen Rekisteröity Ero Translaatio y-suunta Alkuperäinen Rekisteröity Ero -0,4327-0,443225 0,010525 0,03 0,0296787 0,000321-0,8629-0,845099-0,0178 0,0955 0,0961581-0,00066-1,2868-1,27141-0,01539 0,1944 0,199341-0,00494-1,7013-1,66204-0,03926 0,3254 0,32856-0,00316-2,1035-2,0692-0,0343 0,4877 0,4781 0,0096-2,4905-2,4484-0,0421 0,6809 0,68172-0,00082-2,8595-2,80402-0,05548 0,905 0,899196 0,005804-3,2076-3,15464-0,05296 1,1605 1,16268-0,00218-3,5315-3,48507-0,04643 1,4483 1,44401 0,00429-3,8259-3,78412-0,04178 1,7674 1,75448 0,01292-4,0849-4,08075-0,00415 2,1151 2,11324 0,00186-4,304-4,58478 0,28078 2,4882 2,46484 0,02336-4,4799-5,10189 0,62199 2,8826 2,82974 0,05286-4,6109-5,45695 0,84605 3,2941 3,20934 0,08476-4,6967-5,45564 0,75894 3,718 3,64454 0,07346-4,7384-5,37139 0,63299 4,1498 4,09227 0,05753-4,7384-5,23084 0,49244 4,5848 4,5439 0,0409-4,6999-5,04208 0,34218 5,0188 4,99243 0,02637-1,3923-1,57832 0,18602 7,2478 7,23301 0,01479 2,8283 2,79195 0,03635 7,0024 6,99542 0,00698 4,7663 4,8955-0,1292 3,9643 3,96296 0,00134 4,3002 4,58277-0,28257 3,224 3,22876-0,00476 3,7226 4,16671-0,44411 2,576 2,57961-0,00361 3,0392 3,63499-0,59579 2,0483 2,05209-0,00379 2,2687 3,00357-0,73487 1,6546 1,65712-0,00252 1,442 2,30453-0,86253 1,3923 1,39099 0,00131 0,5862 1,53975-0,95355 1,2419 1,23784 0,00406-0,2801 0,760536-1,04064 1,1786 1,16934 0,00926-1,1453-0,0260301-1,11927 1,1782 1,16451 0,01369-2,0096-0,811183-1,19842 1,2198 1,20036 0,01944-2,8745-1,60506-1,26944 1,2859 1,26056 0,02534-3,7416-2,38969-1,35191 1,3601 1,32688 0,03322-4,6116-3,21881-1,39279 1,4244 1,399 0,0254-5,4834-3,99961-1,48379 1,4565 1,41297 0,04353-6,3528-4,85846-1,49434 1,4254 1,39515 0,03025-7,2104-5,62778-1,58262 1,2843 1,24163 0,04267-8,0154-6,37629-1,63911 0,967 0,919734 0,047266-8,6824-7,07593-1,60647 0,4223 0,391676 0,030624-9,1378-8,05585-1,08195-0,3182-0,319606 0,001406-6,4806-6,08801-0,39259-3,7562-3,75003-0,00617-2,1227-2,26594 0,14324-5,2938-5,30608 0,01228 2,0546 1,85378 0,20082-3,8953-3,91062 0,01532

2,5059 2,31534 0,19056-3,1344-3,15343 0,01903 2,8339 2,65613 0,17777-2,3191-2,33513 0,01603 2,9049 2,75736 0,14754-1,4455-1,45794 0,01244 2,4982 2,39005 0,10815-0,6835-0,700194 0,016694 1,7378 1,66525 0,07255-0,2512-0,258878 0,007678 0,878 0,841173 0,036827-0,0617-0,0728046 0,011105 Kierto (astetta) Alkuperäinen Rekisteröity Ero Mitta -0,0242-0,0261431 0,001943 0,64809-0,0638-0,0694899 0,00569 0,261129-0,1057-0,10714 0,00144 0,691726-0,1457-0,142621-0,00308 0,953752-0,1812-0,181969 0,000769 0,857599-0,2096-0,198571-0,01103 0,929318-0,2281-0,235736 0,007636 0,627339-0,2321-0,23165-0,00045 0,767062-0,2142-0,203594-0,01061 1,02915-0,1573-0,161875 0,004575 0,666389 0-0,0026305 0,002631 0,094105 1,3048 1,30684-0,00204 0,772092 2,8872 2,88586 0,00134 0,780323 4 3,998 0,002 0,788467 3,5451 3,54902-0,00392 0,780773 2,9392 2,93653 0,00267 0,788413 2,2756 2,27701-0,00141 0,781152 1,581 1,58028 0,00072 0,785328 0,8678 0,866851 0,000949 0,755358 0,1438 0,1498-0,006 0,83556-0,5854-0,581289-0,00411 0,798325-1,3145-1,31093-0,00357 0,761597-2,0375-2,03635-0,00115 0,777206-2,7453-2,74399-0,00131 0,806379-3,42-3,42189 0,00189 0,772307-4 -4,00214 0,00214 0,795343-4,4146-4,41343-0,00117 0,781488-4,7874-4,78698-0,00042 0,77167-5,1372-5,13704-0,00016 0,785532-5,4683-5,46638-0,00192 0,782117-5,7818-5,78478 0,00298 0,783411-6,0769-6,07539-0,00151 0,786841-6,3513-6,35049-0,00081 0,785445-6,6009-6,6027 0,0018 0,793083-6,8186-6,81585-0,00275 0,785109

-6,9909-6,99128 0,00038 0,782807-7,0875-7,08657-0,00093 0,787904-7 -6,9972-0,0028 0,779246-4,6982-4,70152 0,00332 0,787234-1,7528-1,75096-0,00184 0,80934 0,6622 0,667615-0,00541 0,756987 0,9183 0,918211 8,9E-05 0,788401 0,9179 0,917987-8,7E-05 0,738368 0,8284 0,826982 0,001418 0,802508 0,6907 0,692392-0,00169 0,753825 0,5237 0,523553 0,000147 0,790799 0,34 0,340797-0,0008 0,756534 0,153 0,161736-0,00874 0,524027