I början av veckan skrev jag i rapporten om lite metoder inom bildanalys som tröskling, linjär (faltning) och ickelinjära (morfologi) metoder samt snakes. Det finns fortfarande kvar en del detaljer som ska fyllas i tills mitten av nästa vecka då jag ska skicka in en ny version av rapporten till min handledare. Mot slutet av veckan började jag också på en beskrivning av den mjukvara som jag hittils har ur en funktionell synpunkt.
På implementeringssidan ordnade jag kod för att spara en "körning" (alla frames som renderas från programmet startas till att det avslutas) som ett videoklipp i godtyckligt format. Detta är ganska nödvändigt att både kunna läsa från och skriva till videofilmer så fort man börjar vilja göra saker som kan ta flera sekunder per bildruta, eftersom tålamodet lätt tar slut och man har svårt att följa med vad som händer när man inte kan se processen snabbare än vad datorn hinner med att rendera. Jag har också tittat på om det går att använda förväntad position på regionen (inte bara area) för att begränsa region growing-processen och det ser lovande ut.
Eftersom de kvarvarande på företaget kommer byta kontor kommande vecka har jag tagit hem mina saker och kommer resterande tid arbeta hemifrån eller från universitetet. Jag fick låna hem nätverkskameran som jag använder och mina program fungerar nu på min egen dator, så enda potentiella nackdelen med att jobba hemifrån skulle vara om min disciplin inte räcker till.
Nästa vecka kommer jag fylla ut de delar av rapporten som jag börjat på i veckan (främst snakes och morfologi). Jag ska också försöka hålla målet i sikte att med någorlunda precision kunna spåra en hand, oavsett vilka förenklande antaganden eller metoder jag behöver använda. Det är 6 veckor kvar av de ursprungliga 20 nu. Eventuellt har jag täckt tillräckligt mycket mark (nästan uteslutande inom hudsegmentering och implementering av allmänna metoder) med mitt arbete redan nu , men jag skulle väldigt gärna hinna undersöka kvarstående hinder för att klassificera enkla tecken åtminstone översiktligt. Det skulle också göra mina resultat mycket lättare att strukturera och presentera.
2008-09-26
2008-09-19
Vecka 38
Jag har under veckan förbättrat metoderna för att samla in huddata genom region growing. När bara en uppsättning datapunkter användes blev resultatet ofta väldigt ostabilt eftersom kameran bara fått se handen ur en vinkel. På bilden nedan har jag visat upp handflatan för kameran som samlade in några tusen färgvärden och byggde en hudmodell.
Mahalanobiskartan för modellen visas nedan (mörka områden är nära hud här).
Området på undersidan av handen är skuggbelagt och eftersom hudvärden endast togs från framsidan av handen under direkt belysning ges dom låg hudtillhörighet (ljus färg på bilden). När jag istället lät funktionerna kontinuerligt plocka ut färgvärden som matchade den förväntade arean inom någon procent blev resultatet en snabbt ökande datamängd som sällan plockade ut falska hudvärden. Genom att spara huddata till fil och tillåta programmet att läsa in och utöka den kan man bygga på en databas av hudvärden för olika förhållanden (och i längden olika användare). Bilden nedan visar att alla delar av händerna ges hög hudtillhörighet i en modell byggd på en större mängd huddata (drygt 100 000 vektorer som var och en svarar mot en hudpunkt).
Eftersom flera saker i bakgrunden kan ha samma färg som hudområden löser såklart detta inte hela problemet, men det går nu att automatiskt och snabbt ge programmet mycket stora datamängder utan särskilt begränsande antaganden och att i förväg träna hudmodellen så den finns redo för kommande körningar. Beräkningen av kovariansmatrisen, dess invers och medelvektorn är beroende på datamängdens storlek men behöver bara göras en gång, varefter tiden som krävs för att beräkna Mahalanobisavståndet för en pixel är konstant.
Jag har under veckan också inarbetat rörelse som ett energimått för snakes. Metoden jag använt är MHI (Motion History Images), vilket ger en gråskalebild som den nedan där de rörelse upptäcks blir vita, medan pixlar som haft rörelse i föregående bildrutor "tonar bort".
De tre ledtrådarna som mina snakes just nu söker efter i bilden är respons från färgmodellen, konturer och rörelse. Värdena beräknas normalt i ett litet grannskap kring varje punkt och skalas om till ett [0, 1]-intervall innan de viktas ihop. Eftersom en snake är en energiminimerande spline är det låga värden (mörka områden) som bedöms som hud. Bilden nedan visar Mahalanobiskartan för en bild.
Nästa bild är kontur (via pseudofärg-morfologi som jag nämnt tidigare).
Det var lite problem med sättet jag avgjorde om det fanns rörelse eller inte i en bild, men just nu lagrar jag ett antal tidigare bildrutor och jämför nuvarande bildruta mot dom. Fördelen är att förändringar i kamerans position eller kroppshållning "tonar bort" när rörelsen avstannar, men det finns också nackdelar. Inuti ett föremål som rör sig kommer en given punkt inte uppfattas som att den har förändrats mellan två bildrutor, vilket ofta ger stora "stationära" områden inuti rörliga föremål (som händer), som på bilden nedan.
När dessa viktas ihop blir resultatet som på bilden nedan, vilket alltså visar hur en snake skulle uppfatta bilden ifall grannskapsområdet var hela bilden.
Det finns fortfarande stora hinder till att spåra hudområden i föränderliga ljusmiljöer, eftersom dessa tre mått inte räcker till för att hitta hud och bara hud. Bilden nedan visar energilandskapet när jag rör handen över en bakgrund som tilldelas i princip samma mått på hudgrad som min hand. Detta gör att rörelse inte kan upptäckas där och konturerna är mycket svaga eller obefintliga.
Poängen är alltså att de ledtrådar mitt program använder sig av just nu för att försöka följa händerna (färg, kontur och rörelse) inte kommer vara tillräckliga i en svår och varierande miljö. Det är här som det börjar bli aktuellt att tänka på förenklande antaganden, som att det inte finns några hudfärgade föremål som rör sig utöver händerna, eller till och med att det inte finns hudfärgade föremål utöver händerna alls i bilden. Med det senare antagandet skulle det räcka att använda metoderna för att bygga en hudmodell med region growing och sedan använda Mahalanobiskartan direkt för att klassificera hudområden. Det börjar också bli tid att undersöka lite olika features som kan användas för att givet segmenterade händer avgöra vad de sysselsätter sig med. Nästa vecka ska jag skriva på kapitel av rapporten som börjat halka efter mer och mer och senare under veckan undersöka hur jag enklast kan förenkla inspelningsmiljön.
Mahalanobiskartan för modellen visas nedan (mörka områden är nära hud här).
Området på undersidan av handen är skuggbelagt och eftersom hudvärden endast togs från framsidan av handen under direkt belysning ges dom låg hudtillhörighet (ljus färg på bilden). När jag istället lät funktionerna kontinuerligt plocka ut färgvärden som matchade den förväntade arean inom någon procent blev resultatet en snabbt ökande datamängd som sällan plockade ut falska hudvärden. Genom att spara huddata till fil och tillåta programmet att läsa in och utöka den kan man bygga på en databas av hudvärden för olika förhållanden (och i längden olika användare). Bilden nedan visar att alla delar av händerna ges hög hudtillhörighet i en modell byggd på en större mängd huddata (drygt 100 000 vektorer som var och en svarar mot en hudpunkt).
Eftersom flera saker i bakgrunden kan ha samma färg som hudområden löser såklart detta inte hela problemet, men det går nu att automatiskt och snabbt ge programmet mycket stora datamängder utan särskilt begränsande antaganden och att i förväg träna hudmodellen så den finns redo för kommande körningar. Beräkningen av kovariansmatrisen, dess invers och medelvektorn är beroende på datamängdens storlek men behöver bara göras en gång, varefter tiden som krävs för att beräkna Mahalanobisavståndet för en pixel är konstant.Jag har under veckan också inarbetat rörelse som ett energimått för snakes. Metoden jag använt är MHI (Motion History Images), vilket ger en gråskalebild som den nedan där de rörelse upptäcks blir vita, medan pixlar som haft rörelse i föregående bildrutor "tonar bort".
De tre ledtrådarna som mina snakes just nu söker efter i bilden är respons från färgmodellen, konturer och rörelse. Värdena beräknas normalt i ett litet grannskap kring varje punkt och skalas om till ett [0, 1]-intervall innan de viktas ihop. Eftersom en snake är en energiminimerande spline är det låga värden (mörka områden) som bedöms som hud. Bilden nedan visar Mahalanobiskartan för en bild.
Nästa bild är kontur (via pseudofärg-morfologi som jag nämnt tidigare).
Det var lite problem med sättet jag avgjorde om det fanns rörelse eller inte i en bild, men just nu lagrar jag ett antal tidigare bildrutor och jämför nuvarande bildruta mot dom. Fördelen är att förändringar i kamerans position eller kroppshållning "tonar bort" när rörelsen avstannar, men det finns också nackdelar. Inuti ett föremål som rör sig kommer en given punkt inte uppfattas som att den har förändrats mellan två bildrutor, vilket ofta ger stora "stationära" områden inuti rörliga föremål (som händer), som på bilden nedan.
När dessa viktas ihop blir resultatet som på bilden nedan, vilket alltså visar hur en snake skulle uppfatta bilden ifall grannskapsområdet var hela bilden.
Det finns fortfarande stora hinder till att spåra hudområden i föränderliga ljusmiljöer, eftersom dessa tre mått inte räcker till för att hitta hud och bara hud. Bilden nedan visar energilandskapet när jag rör handen över en bakgrund som tilldelas i princip samma mått på hudgrad som min hand. Detta gör att rörelse inte kan upptäckas där och konturerna är mycket svaga eller obefintliga.
Poängen är alltså att de ledtrådar mitt program använder sig av just nu för att försöka följa händerna (färg, kontur och rörelse) inte kommer vara tillräckliga i en svår och varierande miljö. Det är här som det börjar bli aktuellt att tänka på förenklande antaganden, som att det inte finns några hudfärgade föremål som rör sig utöver händerna, eller till och med att det inte finns hudfärgade föremål utöver händerna alls i bilden. Med det senare antagandet skulle det räcka att använda metoderna för att bygga en hudmodell med region growing och sedan använda Mahalanobiskartan direkt för att klassificera hudområden. Det börjar också bli tid att undersöka lite olika features som kan användas för att givet segmenterade händer avgöra vad de sysselsätter sig med. Nästa vecka ska jag skriva på kapitel av rapporten som börjat halka efter mer och mer och senare under veckan undersöka hur jag enklast kan förenkla inspelningsmiljön.
2008-09-12
Vecka 37
I veckan har jag utökat min region growing-metod så den nu ritar ut en markering där handen antas befinna sig vid kalibrering och även en ellips som svarar mot den förväntade arean. Själva processen sker iterativt med längre och längre accepterade avstånd mellan färgvärden så länge arean på det markerade området är närmare ellipsens area än föregående steg. Detta resulterar i ett antal färgvektorer för de pixlar som tros tillhöra hudområden. Statistiken över hudfärg kan sedan användas i flera olika färgmodeller. Om färgvärdenas medelvektor och kovariansmatris beräknas kan Mahalanobisavståndet beräknas, vilket är likt Euklidiskt avstånd men också tar hänsyn till att de tre färgkanalerna inte är oberoende av varandra.
När en pixel som ligger på kanten till den växande regionen undersöks används just nu bara pixelns egna färgvärde och grannens. En förbättring skulle kunna vara att vikta den tillåtna avvikelsen i färg för att en pixel ska inkluderas med avståndet från ellipsens mittpunkt eller till närmsta pixel på dess kant. Just nu är sådana förbättringar inte särskilt aktuella, eftersom resultatet är en ganska sofistikerad färgmodell, vilket tydligt visar på bristen med färginformation. Bilden nedan visar en inverterad "Mahalanobis-karta", vilket bara är en bild där Mahalanobisavståndet till varje punkt (givet tidigare huddata från region growing-metoden) beräknats och inverterats, så mörka värden svarar mot högt avstånd från hudfärg och ljusa områden är nära hudfärg.
Det är inte svårt att se problemen med bilden, belysningen gör att stora delar av dörren och väggen till stora delar överlappar hudens färgvärden. Detta visar att oavsett hur sofistikerad färgmodell som används så behövs även annan information. Det är där snakes kommer tillbaks in i bilden, eftersom all information som kan beräknas för en viss pixel givet dess grannskap kan matas in som ett nytt energimått i modellen. På bilden nedan söker sig punkterna mot områden som har lågt Mahalanobisavstånd (igen baserat på tidigare skapad hudmodell) och starka kanter (givet av gradientoperation med pseudofärg-morfologi). De försöker också hålla jämna avstånd mellan varandra och bilda mjuka kurvor, vilket är standard.
Ormen kan inte utifrån denna informationen förlitligt fånga och spåra handen. Det finns gott om kanter i bilden utöver handen, och även hudfärgade föremål När jag rörde handen (långsamt) vänsterut i bilden hakade ett antal punkter istället fast i dörrkarmen eftersom den kanten var skarpare och färgen var nära nog.
Den information som behövs är rörelse, t.ex. genom motion history images, vilket är något som jag ska försöka få att fungera nästa vecka. Om handens konturer bara kan hittas en gång kan positionen från föregående bildruta användas för att uppskatta dess förväntade position i nästa bildruta. På grund av detta kan det vara lönsamt att undersöka om det finns smartare sätt att placera ut snakepunkterna initialt (just nu sätter jag dom bara på kanten av samma ellips som i region growing-metoden). Jag kommer troligtvis ägna tid åt att skriva på rapporten också, det finns gott om relativt enkla metoder som jag har använt men inte beskrivit ännu.
När en pixel som ligger på kanten till den växande regionen undersöks används just nu bara pixelns egna färgvärde och grannens. En förbättring skulle kunna vara att vikta den tillåtna avvikelsen i färg för att en pixel ska inkluderas med avståndet från ellipsens mittpunkt eller till närmsta pixel på dess kant. Just nu är sådana förbättringar inte särskilt aktuella, eftersom resultatet är en ganska sofistikerad färgmodell, vilket tydligt visar på bristen med färginformation. Bilden nedan visar en inverterad "Mahalanobis-karta", vilket bara är en bild där Mahalanobisavståndet till varje punkt (givet tidigare huddata från region growing-metoden) beräknats och inverterats, så mörka värden svarar mot högt avstånd från hudfärg och ljusa områden är nära hudfärg.
Det är inte svårt att se problemen med bilden, belysningen gör att stora delar av dörren och väggen till stora delar överlappar hudens färgvärden. Detta visar att oavsett hur sofistikerad färgmodell som används så behövs även annan information. Det är där snakes kommer tillbaks in i bilden, eftersom all information som kan beräknas för en viss pixel givet dess grannskap kan matas in som ett nytt energimått i modellen. På bilden nedan söker sig punkterna mot områden som har lågt Mahalanobisavstånd (igen baserat på tidigare skapad hudmodell) och starka kanter (givet av gradientoperation med pseudofärg-morfologi). De försöker också hålla jämna avstånd mellan varandra och bilda mjuka kurvor, vilket är standard.
Ormen kan inte utifrån denna informationen förlitligt fånga och spåra handen. Det finns gott om kanter i bilden utöver handen, och även hudfärgade föremål När jag rörde handen (långsamt) vänsterut i bilden hakade ett antal punkter istället fast i dörrkarmen eftersom den kanten var skarpare och färgen var nära nog.
Den information som behövs är rörelse, t.ex. genom motion history images, vilket är något som jag ska försöka få att fungera nästa vecka. Om handens konturer bara kan hittas en gång kan positionen från föregående bildruta användas för att uppskatta dess förväntade position i nästa bildruta. På grund av detta kan det vara lönsamt att undersöka om det finns smartare sätt att placera ut snakepunkterna initialt (just nu sätter jag dom bara på kanten av samma ellips som i region growing-metoden). Jag kommer troligtvis ägna tid åt att skriva på rapporten också, det finns gott om relativt enkla metoder som jag har använt men inte beskrivit ännu.
2008-09-05
Vecka 36
Mer än 50% av den planerade tiden för exjobbet har förflutit nu och jag försöker sålla mellan de metoder jag vill undersöka för att välja ut dom som jag förväntar mig kommer ge mest nytta. I syfte att producera en bra kantdetektor som fungerar i låg upplösning och drar nytta av färginformation skrev jag i början av veckan funktioner för gråskalemorfologi. Till skillnad från de tidigare som bara arbetat med formen på binära objekt (svarta eller vita men inget mellanläge) kan de utökade funktionerna behandla bilder i gråskala. Genom att använda samma operator på de tre färgkanalerna i en RGB-bild kan de också användas för en slags "pseudofärg-morfologi", där resultatet är en färgbild. Resultatet är drastiskt när strukturelementet som använts är någorlunda stort eller upplösningen är låg och även smått skrämmande när testbilderna innehåller en person (som mig). På bilden nedan har jag eroderats med en cirkelformat element, vilket gör att ljusa områden "krymper" medan mörka "växer" (eftersom varje pixel tilldelas det lägsta färgvärdet inom elementet).
Nästa bild är en dilation med samma element, vilket omvänt gör att ljusa områden "växer" medan mörka "krymper".
För att visa att mitt vanliga utseende inte är fullt lika skrämmande har nästa bild inte manipulerats alls.
Slutligen kan erosioner och dilationer användas som utgångspunkt för många andra operationer, som på bilden nedan där jag gjort en "öppning", vilket helt enkelt är en erosion följd av en dilation.
Resultatet blir att (ljusa) objekt under strukturelementets storlek raderas från bilden. Det krävs ingen större fantasi för att lista ut att det också går att göra en "stängning" genom en dilation följd av en erosion. Bilden som produceras syns nedan. Om man selektivt tillämpade denna teknik skulle t.ex. ansikten ganska enkelt kunna suddas ut för att förhindra identifiering.
Dessa kan också byggas på vidare, till exempel genom att beräkna tophat som är skillnaden mellan en bild och dess "öppning" och tar bort bakgrunden (originalet med små och ljusa föremål bortplockade genom öppningen) från bilden.
Från början sökte mina gråskalefunktioner efter de lägsta (vid erosion) eller högsta (vid dilation) färgvärdena individuellt i varje kanal, vilket gjorde att resultatet för en viss pixel kunde bli en färgvektor som inte fanns i bilden. Nästa utökning var att söka efter den "lägsta" eller "högsta" vektorn (av tre färgvärden) för varje pixel, vilket kan beräknas på många olika sätt. Jag valde Euklidiskt avstånd (norm) för varje vektor. Detta gav en version av "färgmorfologi", som dock förstärker brus, eftersom slumpvisa förändringar i färgvärden kan orsaka rejält avvikande vektorer, som alltid kommer väljas ut i operationerna. Det har visat sig att färgmorfologi är ett rejält stort område med många olika idéer, särskilt inom kantdetektering, vilket också var mitt syfte med att undersöka metoderna. I nuläget verkar det dock för mig som om att tidsinvesteringen för att undersöka "riktig" färgmorfologi och implementera metoderna är vettigare att lägga på andra saker. Mina "pseudofärg"-metoder fungerar tillräckligt bra för att söka reda på kanter i bilden (som nedan), sen kan jag använda andra tekniker för att använda information baserad på färg, rörelse (och förhoppningsvis textur, mer om det senare) och kombinera resultatet till något som är robust. Så är min tankegång just nu i alla fall.
Kantdetekteringen kan byggas som en morfologisk grundoperation i samma funktion som erosion (minsta värdet) och dilation (högsta värdet) genom att söka rätt på det maximala avståndet mellan två värden, där värden kan vara skalärer som på bilderna här eller vektorer som i de något långsammare och kraftigt brus-höjande färgoperationerna jag skrivit. Med morfologiska kantoperatorer som ger ganska acceptabelt resultat ägnade jag lite tid i slutet av veckan åt att undersöka region growing, vilket är processen att plocka ut en/några pixlar som seed, som sedan kontrollerar enligt något kriteria om deras grannar borde ingå i regionen tills den slutat växa. De kriterier jag använt hittils är likhet med seed-pixlarnas färg och likhet med grannen som ingår i regionens färg. Region growing är ganska enkelt (kan dock ta tid på större bilder) men ger ganska lovande resultat. Nedan är ett exempel när hela handen och inget annat plockats ut genom att jämföra grannarnas färg.
Och på bilden nedan har jämförelsen med seed-pixlarnas färg misslyckats totalt eftersom regionen inte kan växa längre bort utan att passera över områden med "fel" färg (även om exakt samma färgvärden finns lite längre bort från mitten).
Syftet med metoden är för att användaren i kalibreringsfasen ska kunna hålla upp handen framför kameran, som plockar ut färgvärden och bygger en modell för huden. Det optimala vore sedan att under körning spåra handen och periodvis uppdatera färgmodellen så att systemet inte tappar bort handen ens om ljusförhållandena ändras (inom rimliga gränser).
Nästa vecka ska jag implementera några färgmodeller som jag tidigare tittat på för att producera ett mått på hur sannolikt det är att en viss pixel tillhör handen, som Mahalanobisavstånd och en approach där systemet lär sig vilka regler (som exempelvis att R-värdet för en pixel ska vara mellan 50 och 100) som ger högst grad korrekt klassificering av hudpixlar. Måttet på hudsannolikhet för ett färgvärde ska i sin tur in som en av flera energimått som ormen (aktiva konturen) söker sig mot, tillsammans med kantmått och förväntad position på handen (utifrån tidigare känd position och riktningen på handens rörelse). Jag ska också se om det går att använda en kantdetektering för att beräkna ett enkelt texturmått genom antalet pixlar som ingår i en kant i ett litet område eller liknande, eftersom händer verkar innehålla många "kanter".
Nästa bild är en dilation med samma element, vilket omvänt gör att ljusa områden "växer" medan mörka "krymper".
För att visa att mitt vanliga utseende inte är fullt lika skrämmande har nästa bild inte manipulerats alls.
Slutligen kan erosioner och dilationer användas som utgångspunkt för många andra operationer, som på bilden nedan där jag gjort en "öppning", vilket helt enkelt är en erosion följd av en dilation.
Resultatet blir att (ljusa) objekt under strukturelementets storlek raderas från bilden. Det krävs ingen större fantasi för att lista ut att det också går att göra en "stängning" genom en dilation följd av en erosion. Bilden som produceras syns nedan. Om man selektivt tillämpade denna teknik skulle t.ex. ansikten ganska enkelt kunna suddas ut för att förhindra identifiering.
Dessa kan också byggas på vidare, till exempel genom att beräkna tophat som är skillnaden mellan en bild och dess "öppning" och tar bort bakgrunden (originalet med små och ljusa föremål bortplockade genom öppningen) från bilden.Från början sökte mina gråskalefunktioner efter de lägsta (vid erosion) eller högsta (vid dilation) färgvärdena individuellt i varje kanal, vilket gjorde att resultatet för en viss pixel kunde bli en färgvektor som inte fanns i bilden. Nästa utökning var att söka efter den "lägsta" eller "högsta" vektorn (av tre färgvärden) för varje pixel, vilket kan beräknas på många olika sätt. Jag valde Euklidiskt avstånd (norm) för varje vektor. Detta gav en version av "färgmorfologi", som dock förstärker brus, eftersom slumpvisa förändringar i färgvärden kan orsaka rejält avvikande vektorer, som alltid kommer väljas ut i operationerna. Det har visat sig att färgmorfologi är ett rejält stort område med många olika idéer, särskilt inom kantdetektering, vilket också var mitt syfte med att undersöka metoderna. I nuläget verkar det dock för mig som om att tidsinvesteringen för att undersöka "riktig" färgmorfologi och implementera metoderna är vettigare att lägga på andra saker. Mina "pseudofärg"-metoder fungerar tillräckligt bra för att söka reda på kanter i bilden (som nedan), sen kan jag använda andra tekniker för att använda information baserad på färg, rörelse (och förhoppningsvis textur, mer om det senare) och kombinera resultatet till något som är robust. Så är min tankegång just nu i alla fall.
Kantdetekteringen kan byggas som en morfologisk grundoperation i samma funktion som erosion (minsta värdet) och dilation (högsta värdet) genom att söka rätt på det maximala avståndet mellan två värden, där värden kan vara skalärer som på bilderna här eller vektorer som i de något långsammare och kraftigt brus-höjande färgoperationerna jag skrivit. Med morfologiska kantoperatorer som ger ganska acceptabelt resultat ägnade jag lite tid i slutet av veckan åt att undersöka region growing, vilket är processen att plocka ut en/några pixlar som seed, som sedan kontrollerar enligt något kriteria om deras grannar borde ingå i regionen tills den slutat växa. De kriterier jag använt hittils är likhet med seed-pixlarnas färg och likhet med grannen som ingår i regionens färg. Region growing är ganska enkelt (kan dock ta tid på större bilder) men ger ganska lovande resultat. Nedan är ett exempel när hela handen och inget annat plockats ut genom att jämföra grannarnas färg.
Och på bilden nedan har jämförelsen med seed-pixlarnas färg misslyckats totalt eftersom regionen inte kan växa längre bort utan att passera över områden med "fel" färg (även om exakt samma färgvärden finns lite längre bort från mitten).
Syftet med metoden är för att användaren i kalibreringsfasen ska kunna hålla upp handen framför kameran, som plockar ut färgvärden och bygger en modell för huden. Det optimala vore sedan att under körning spåra handen och periodvis uppdatera färgmodellen så att systemet inte tappar bort handen ens om ljusförhållandena ändras (inom rimliga gränser).Nästa vecka ska jag implementera några färgmodeller som jag tidigare tittat på för att producera ett mått på hur sannolikt det är att en viss pixel tillhör handen, som Mahalanobisavstånd och en approach där systemet lär sig vilka regler (som exempelvis att R-värdet för en pixel ska vara mellan 50 och 100) som ger högst grad korrekt klassificering av hudpixlar. Måttet på hudsannolikhet för ett färgvärde ska i sin tur in som en av flera energimått som ormen (aktiva konturen) söker sig mot, tillsammans med kantmått och förväntad position på handen (utifrån tidigare känd position och riktningen på handens rörelse). Jag ska också se om det går att använda en kantdetektering för att beräkna ett enkelt texturmått genom antalet pixlar som ingår i en kant i ett litet område eller liknande, eftersom händer verkar innehålla många "kanter".
Prenumerera på:
Inlägg (Atom)