Projekt i Bildanalys: Mönsterigenkänning inom bioinformatik 2001-11-30 av Jonas Hjelm (F98) och Åsa Jönsson (F98) Handledare: Henrik Malm Jonas Hjelm f98jhj@efd.lth.se Åsa Jönsson f98ajo@efd.lth.se
Inledning Vi har i vårt projekt studerat och analyserat så kallade micro arrayer. Micro arrayer används inom biomedicinen för att t.ex. jämföra förekomsten av olika gener i två olika prover. Proverna kan t.ex. utgöras av genuppsättningarna i en frisk och en cancersjuk cell. Målet med analysen av dessa genkartor var att kunna jämföra förekomsten av varje gen i de två proverna. För att kunna göra detta fick vi använda oss av många av de instrument vi studerade i kursen, bland annat grånivåtransformation, adressering och segmentering. För att skriva de programmen vi behövde på ett effektivt sätt hade vi egentligen behövt använda oss av pekare. Men eftersom ingen av oss har läst så mycket programmering kände vi oss osäkra på hur det skulle kunna göras. Därför har vi istället enbart skrivit våra program i MatLab. Det innebär att en del av de funktioner vi skrivit blivit stora och tar väldigt lång tid att köra om bilderna är för stora. Programmet är skrivet för att fungera på hela bilden, men på grund av att det tar så väldigt lång tid att köra programmet om bilden är för stor så kör vi bara vårt program på en del av den ursprungliga bilden. Beskrivning av en micro array DNA micro arrayer är solida ytor (ofta glas) på vilken man har placerat ut DNA-molekyler. DNA-molekylerna är utplacerade fläckvis där varje fläck skiljer sig åt genom att olika gener är märkta med ett färgämne. Varje gen består av tjugo till flera hundra nukleotider och varje fläck innehåller 10 7-10 8 DNA-molekyler. Det kan i sin tur finnas tiotusentals fläckar på en array. Idealt sett så skulle varje fläck bara innehålla en markerad gen, men det är väldigt svårt att uppnå varför varje fläck kommer att innehålla spår av andra gener. Fläckarna är placerade på provplattan (micro arrayen) i ett matrismönster och i en ordning som avspeglar genföljden i DNA-molekylen. Man kan således associera varje fläck med en viss gen. Innan man placerar ut DNA-molekylerna på plattan markerar man alla gener i det ena provet med ett färgämne (rött) och alla generna i det andra provet med ett annat (grönt), det vill säga man fluorescerar vid olika våglängder. Genom att blanda proverna med samma markerade gen i samma proportioner och mäta fluorescensen från varje fläck då den belyses med två lasrar, vars våglängder ligger inom respektive färgämnes absorptionsområde, så kan den relativa förekomsten av genen i de två proven bestämmas. Exempel på en micro array-bild kan ses i bild 1 nedan. Bild 1: Fluorescensbild av en micro array. Man kan tydligt se att förekomsten av olika gener i de två proven skiljer sig åt (röd resp. grön intensitet).
Att analysera en micro array Den micro array som vi jobbat med var uppdelad i en bild med provet som var färgat rött och en bild med provet som var färgat grönt. Dessa bilder var ganska mörka och alla fläckar gick inte att urskilja. För att underlätta adresseringen och segmenteringen av bilderna slog vi därför först samman de två bilderna till en och utförde sedan en grånivåtransformation. Fläckarna blev då ljusare och resultatet blev bättre. När intensiteterna sedan skulle beräknas gick vi tillbaka till de två ursprungliga bilderna för att kunna jämföra deras relativa intensiteter. Den analys av micro array bilder som vi utfört kan delas upp i tre steg: Adressering: processen då varje fläcks koordinater bestäms Segmentering: varje pixel klassificeras antingen som tillhörande en fläck eller som bakgrundspixel Intensitetsbestämning: fläckarnas intensiteter i den röda och den gröna bilden beräknas och jämförs Adressering Med adressering menar man bestämmandet av fläckarnas koordinater. Då fläckarna är utplacerade i matrisformationer (se bild 1) kan man bestämma alla fläckarnas koordinater med kännedom av bara fem väl valda fläckars koordinater, förutsatt att antalet grupper i x- och y- led och storleken på matriserna är känt. Om fläckmatriserna alltid hade varit utplacerade parallellt med bildkanterna skulle det ha räckt med att få tre fläckkoordinater givna för att bestämma alla de övriga fläckarnas koordinater, men eftersom så inte alltid är fallet måste man kompensera för det. De fem fläckarna vars koordinater vi använde oss av är: 1. Övre vänstra fläcken i översta vänstra matrisen (fläck 1) 2. Undre vänstra fläcken i översta vänstra matrisen (fläck 2) 3. Undre vänstra fläcken i understa vänstra matrisen (fläck 3) 4. Övre högra fläcken i översta vänstra matrisen (fläck 4) 5. Övre högra fläcken i översta högra matrisen (fläck 5) När alla fläckarnas koordinater beräknas så utgår vi från fläck 1:s koordinater och lägger till en viss mängd pixlar för att hamna på platsen för den önskade fläcken. Med hjälp av koordinaterna för fläck 2 respektive fläck 4 och dimensionen på fläckmatriserna så beräknas avståndet mellan två fläckar i y-led respektive x-led (i programmet gridmaker4 betecknas dessa variabler med yspotdist resp. xspotdist). Koordinaterna för fläck 3 resp. fläck 5 används i sin tur, med vetskap om antalet fläckmatriser i y- och x-led, för att bestämma avståndet i y- och x-led mellan två fläckmatriser (i gridmaker4 kallat ydist och xdist). Då vi har studerat ett antal micro array-bilder har vi upptäckt att alla fläckmatriser ligger på samma linjer i x- och y-led, d.v.s. de är inte förskjutna från varandra relativt dessa linjer. Vidare så förekommer ingen rotation av matriserna relativt varandra vilket medför att de tänkta linjerna skär samma rader i de olika fläckmatriserna. Avståndet mellan fläckarna inom en fläckmatris kan variera något vilket leder till att de till fläcken hörande koordinaterna kanske inte ligger i fläckens centrum. I programmet centermatrix3 sker en kompensering delvis för detta då fläckarnas koordinater revideras genom att man letar upp pixeln med högst intensitet inom ramen för en matris, i vars mitt orginalkoordinaten ligger, och sedan sätter dessa koordinater till fläckens
intensitetsmaximum. Storleken på matrisen och därmed på kompenseringen anges som inparameter och måste vara ett udda tal (kallat certanty i programmet). Den enda större oregelbundenheten som kan förekomma i bilden är således en rotation av hela matrisen av fläckmatriser relativt bildens kanter. Då bilderna är stora medför detta att även en liten rotation kan ge de beräknade fläckkoordinaterna helt fel värde om man ingen kompensation sker. Genom att beräkna hur många pixlar högre upp/längre ner fläck 5 ligger relativt fläck 1 och dela med skillnaden i x-koordinater erhålles en dimensionslös rotationskonstant (i programmet gridmaker kallat rotkomp). Då man vill beräkna y- koordinaterna för en godtycklig fläck så använder man sig av konstanten genom att multiplicera den med skillnaden i x-koordinat mellan fläcken och fläck 1. Resultatet man då erhåller lägger man till den tilltänkta y-koordinaten som en kompensation för effekten av rotationen i y-led. På motsvarandesätt revideras fläckarnas tilltänkta x-koordinater. Segmentering Segmenteringen kan utföras på många olika sätt, och de metoder som används idag skiljer sig mycket åt. Det finns till exempel metoder som bygger på att alla fläckar antas vara cirklar av fix diameter, och metoder som anpassar sig precis efter fläckarnas form. Det senare är givetvis att föredra eftersom fläckarna långt ifrån alltid har samma form, och vi valde att implementera en sådan metod, nämligen Watershed-metoden. I Watershed-metoden ses bilden som en slags topografikarta där intensiteterna betecknar höjden. Principen är att man börjar med att välja ut de pixlar som har den lägsta intensiteten i bilden, i min. Man fortsätter sedan att fylla på vatten i de pixlar som har intensiteten i min +1. Denna procedur fortsätter upp till en viss förutbestämd gräns. Resultatet blir då att de pixlar med intensiteter som är större än gränsen tillhör själva watersheden, och resterande pixlar utgör bassängerna där emellan. Bilden delas alltså upp i olika regioner. När man har en bild med objekt som man vill segmentera ut och skilja från bakgrunden, som i fallet med micro arrayer, vill man hitta konturerna till objekten. Detta kan göras genom att man beräknar gradienten för bilden (absolutbeloppet av gradienten i varje pixel) och sedan letar upp watershed-pixlarna i gradientbilden. Då kommer nämligen kanterna lämnas kvar eftersom gradienten har störst värde där. Skulle man istället försöka köra watershedproceduren direkt i bilden, utan att beräkna gradienten först, riskerar man att missa vissa av pixlarna inuti objektet eftersom det är möjligt att några av dem är mörkare än gränsen. I vår segmentering följde vi principen att beräkna gradienten för bilden och sedan leta upp watershedpixlarna. De pixlar med gradientvärden som är mindre än gränsvärdet sätts till negativa och övriga, de så kallade watershedpixlarna, får behålla sitt värde. Gradientberäkningen fungerade bra och i de flesta fall var gradienten som störst vid fläckarnas konturer. Svårigheterna uppstod när gränsen för vilka intensiteter som skulle godkännas som watershedpixlar skulle bestämmas. Storleken av gradienten i varje pixel varierar nämligen mycket och dessutom har några av pixlarna inne i fläckarna relativt höga gradientvärden. Om gränsen sätts för högt blir inte alla konturerna slutna kurvor, och det ställer till problem när man sedan ska identifiera alla pixlar som ligger innanför konturen som pixlar tillhörande fläckarna. Om gränsen däremot sätts för lågt uppstår problem eftersom pixlar innanför konturen med höga gradientvärden då är kvar och det gör också identifieringen av vilka pixlar som tillhör fläcken svårare. Vi testade oss fram med olika
gränsvärden och valde ett som vi tyckte var den bästa kompromissen mellan de två problemen. Identifieringen av alla de pixlar som ligger innanför watershed-konturen som pixlar tillhörande fläcken var en av de saker som ställde till mest problem. I identifieringen utgår vi från den pixel i varje fläck som har högst intensitet och som erhålles från adresseringen. Sedan vandrar vi åt alla möjliga håll utifrån den pixeln tills vi stöter på en pixel med positivt värde, det vill säga en watershedpixel. Eftersom alla pixlar som inte tillhör watersheden har negativt värde i det här läget blir det problem att veta var man ska stanna om konturen inte är sluten, som till exempel i fläcken längst ner till vänster i bilden i bilaga 1. Där kommer vår implementering inte klara av identifieringen. Vi kunde inte lösa problemet och valde därför att skriva ut från programmet vilka fläckar som inte har slutna konturer. Dessa kommer då inte behandlas vidare i programmet utan vill man titta närmre på dessa fläckar får man gå in och göra det manuellt. Nästa problem i identifieringen är att om den pixel som erhålles från adresseringen, alltså den pixel vi utgår från i identifieringen, skulle ha ett positivt värde så fungerar inte vår implementering heller. Detta kan inträffa om det finns pixlar inuti fläcken som har så höga gradientvärden att de definieras som watershedpixlar, se till exempel den översta vänstra fläcken i bilden i bilaga 1. Vår identifieringsprocedur utgår ifrån att alla pixlar inuti fläcken har negativt värde och att endast kantpixlarna har positiva värden. Om vi ändå skulle göra vår identifiering då det finns positiva pixlar innanför konturen så skulle endast en del av fläcken identifieras som fläck och man skulle alltså inte få med alla pixlarna. Vi tyckte därför det var bättre att endast skriva ut från programmet vilka fläckar det här felet uppstår för. Det skulle vara intressant att höra med någon som har kunskap om den medicinska aspekten av micro arrayer vad som vore bäst att göra med de fläckar som av någon av dessa två anledningar inte kan genomgå identifieringen. När vi har testkört vårt program har det klarat att identifiera cirka hälften av fläckarna, lite mer eller mindre beroende på hur man väljer gränsvärdet. Beräkning av intensiteterna För att fläckarnas intensiteter ska kunna beräknas så exakt som möjligt måste man kompensera för bakgrundens intensitet. Då fläckarna i genomsnitt är runda och har diffusa gränser mot bakgrunden så har vi valt att göra en bakgrundskompensering som mäter bakgrunden så långt ifrån fläckarnas centrum som möjligt. Detta område tycker vi borde ligga mitt emellan fläckarna. Bakgrunden är inhomogen vilket medför att kompenseringen måste ske individuellt för varje fläck. Detta uppnås genom att skapa fyra kors som ligger snett ovanoch nedanför varje fläck, förutsatt att detta är möjligt utan att gå utanför bilen. Korsen är placerade på ett halvt fläckavstånd (xspotdist resp. yspotdist) i x- resp. y-led, från fläckarnas centrum. Korsens höjd resp. bredd blir, om möjligt utan att korset ligger utanför bilden, lika med avståndet mellan fläckarna i y- resp. x-led. Då fläckarnas högsta intensiteter sällan ligger i fläckarnas mitt så utgår vi i beräkningen av bakgrundsintensiteten från fläckarnas beräknade centrumkoordinater innan de ersätts av koordinaterna för pixeln med högst intensitet inom fläcken (vilket görs i programmet centermatrix3).
Intensitetsmätningen för varje fläck sker sedan genom att alla pixelvärdena som tillhör fläcken summeras. För varje pixel som summeras så subtraheras den för fläcken unika bakgrundsintensiteten varvid man kompenserar för bakgrundsintensiteten. I programmet relint2 görs detta för de två ursprungliga bilderna, varefter kvoten mellan de två bildernas fläckintensiteter beräknas. Detta blir då den relativa intensiteten, vilken är den som är intressant i sammanhanget. Sammanfattning Det här projektet innehöll många delar av bildanalys. Vi fick testa många olika instrument i vår analys av micro array bilderna, allt från grånivåtransformation till segmentering med Watershed-metoden. Vi stötte på en hel del problem på vägen, dels beroende på vår bristande kunskap i programmering men också beroende på att bilderna inte var så perfekta som man kunde önska. Vårt program fungerar bra om fläckarna är tydliga och har jämn intensitet, det vill säga om de är optimala. Problemen uppstår när intensitetsvariationerna blir för stora. Detta är antagligen det allra vanligaste i verkligheten och det var intressant att få försöka lösa dessa problem. Källor Yang, Buckley, Dudoit och Speed: Comparison of methods for image analysis on cdna microarray data. Technical report no 584, November 2000, University of California, Berkely. http://industry.ebi.ac.uk/~brazma/biointro/biology.html#microarrays Vincent och Soille: Watersheds in digital spaces. IEEE transactions on pattern analysis and machine intelligence, vol 13, no. 6, June 1991
Bilaga 1 Bilden visar watershedpixlarna som erhållits efter att gradienten av ursprungsbilden beräknats. Det syns tydligt att alla fläckar inte ger slutna konturer och att det finns watershedpixlar även inuti fläckarna.