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".
Inga kommentarer:
Skicka en kommentar