Jag använde GetPixel för att läsa av skärmen. Nu vill jag se om en viss pixel är "ganska" grön. Problemet är att många färger som inte uppfattas som gröna innehåller mycker grönt (vitt t.ex.). Finns det något enkelt sätt att göra detta? Det skall gå att skilja från röda, svarta och vita nyanser. Du får väl ta fram värdet på G i RGB vit är 255,255,255 >vit är 255,255,255 Hmm, det blev visst inte så bra ändå. Mitt problem är att det blir större skillnad på ljusröd och mörkröd än på t.ex. ljusgrön och ljusröd. Hur skall jag göra? Det går att lösa rätt bra och enkelt med ett neuralt nätverk. Det fanns en metod på adressen http://neuralnetworks.ai-depot.com/Tutorial/Recognition.html, men den verkar inte fungera längre, och det står inget om att länken är kass på http://ai-depot.com/Features/Tutorials.html, varifrån man hittar det. ?? Hej, Det räcker inte. Niklas, <b>>Läs gärna <b>HELA</b> texten.</b> Tack Johan, jag skall kika på ditt tips nu. Konstigt att något som är så enkelt att uppfatta för oss kan vara så klurigt att göra matematiskt. Ett neuralt nätverk är ett försök att kopiera en mänsklig hjärna. I princip kan man säga att du har ett antal neuroner, som motsvarar hjärnceller. Dessa har några insignaler, och några utsignaler, och varje ensklid neuron är mycket enkel. Sen sammankopplar du neuronerna på lite olika sätt, och i slutändan så har du en eller flera utgångar som ger något slags resultat beroende på vad du har för värde på ingångarna. Det låter väldigt intressant. Det att man så att säga matar systemet med exempel tilltalar mig. Tror du att det är svårt att lära sig för en hobbyprogrammerare som läst 2 år som civilingenjör? Jo, det är nog inget problem, jag har själv bara läst tre år civ.ing., och inte speciellt programmeringsrelaterat. Det låter ju sjukt tufft! Jag har lite svårt att se någon tillämpning av det för mig bara. Jag håller just nu på att skriva ett pokerprogram. Delen där den beräknar statistik fungerar genom att den simulerar massa pokeromgångar. Skulle det gå att göra mha nn månne? Njae... även om nn är ett väldigt allmänt verktyg så är det inte lämpat för så alla syften, mest saker i stil med "sånt människor är ganska bra på, men datorer är dåliga på", typ teckenigenkänning, "hitta kortaste vägen", shack, osv.Färg ur GetPixel
Sv: Färg ur GetPixel
Normalt i dom Gröna nyanserna är G 255 och dom andra två mindre än 255
Det finns inget Grönt i Vit som du skriver Vit är Vit och inget annat RGB 0,0,0Sv:Färg ur GetPixel
dvs full röd , full grön , full blå
för att få fram rgb så kan du göra:
http://www.devx.com/vb2themax/Tip/18735
för att se om en färg är "grön" så får du använda en rgb kub
och mäta avståndet från full grön till den färgen du jämför med..
för att mäta avsåndet till en färg så använder du typ pytagoras fast i 3d.
dist = sqrt ( (r1-r2)^2 + (g1-g2)^2 + (b1-b2)^2) )
ju mindre dist är , desto mer lik är färgen den du jämför med...
//RogerSv: Färg ur GetPixel
dvs full röd , full grön , full blå
Javisst så är det,för tidigt på morgonen.
Tack för ditt tips,gick direkt i "godislådan"
SvenSv:Färg ur GetPixel
Sv: Färg ur GetPixel
Det finns också en SOM-metod beskriven på http://ai-depot.com/Tutorial/SomColour.html, men den är gjord för lisp, och då tror jag den är svår att översätta.
Principen är ändå ganska enkel:
Dela upp färgen i tre delar, r g och b.
Ha tre stycken in-neuroner, en per färg.
Ha ett dolt lager (typ 3-5 neuroner, har jag för mig), och en ut-neuron.
Mata den med ett antal "standardfärger", och deras förväntade svar (rött=0, vitt=0, etc.), kör den genom en genetisk algoritm, för att få fram bra värden på neuronerna, spara värdena och lägg in nätverket i ditt program (kan du göra som ren kod).Sv: Färg ur GetPixel
större skillnad på ljusröd och mörkröd än ljusgrön och mörkgrön??
då har du garanterat skrivit fel i formeln... (tex någon miss och gjort r1-b2 eller liknande på något ställe)Sv: Färg ur GetPixel
Färger kan uttryckas på lite olika sätt. Vanligt från programmerarsynpunkt är att man jobbar med just RGB blandningar. Tryckerier jobbar med CMYK blandningar, medans reklammakare vanligtvis jobbar med HSL blandningar. De flesta bildbehandlingsprogram har stöd för alla tre. Lösningen på ditt problem är att konvertera till den HSL.
HSL = Hue, Saturation, Luminosity = Färgton, Färgmättnad, Ljusstyrka
Jobbar man i .Net så är detta enkelt eftersom detta finns inbyggt i ramverket, jobbar man i VB 6 så får man göra denna matematiska omvandling själv.
Sedan när du omvandlat dina två färger (orginalet och den du vill jämföra) så jämför du helt enkelt dina H värden om jag fattat din fråga rätt. Eventuellt vill man kanske ta hänsyn till S värdet också. Om du nu vill jämföra både H och S så gör inte misstaget att försöka använda Pytagoras. Istället skall du mäta de respektive individuella avstånden i absoluta tal och sedan vikta dessa efter behov, samt slutligen addera dessa två för att få ett totalt avstånd.
Vill man veta mera så kan jag rekommendera http://www.undu.com/DN971201/00000019.htm som är lite teori kring olika sätt att uttrycka färg, eller http://abstractvb.com/code.asp?A=926 som är en färdig VB 6 funktion att klippa och klistra.
Lycka till!
// JohanSv:Färg ur GetPixel
Om bara h är tillräckligt nära så får man fortfarande med gråa färger, vita färger och svarta färger.
Det enda sättet att göra på är att använda att avståndet skall vara tillräckligt litet, men att bara använda avståndet kan skilja sig från den intiutiva uppfattningen av färger. Man vill egentligen helst göra någon typ av "snitt" i en av färgkuberna, och det lättaste sättet att hitta vilket är i mitt tycke att låta ett NN göra det. Men det beror naturligtvis helt och hållet på vilka krav som ställs och i vilket område det är tänkt att användas.Sv: Färg ur GetPixel
Läs gärna <b>HELA</b> texten.
Beroende på hur noggrann man vill vara så jämför man enbart H eller både H och S. Enbart jämföra H kan ge felindikering vid vissa gråa nyanser precis som du anger, men då använder man som sagtr både H och S om man vill undvika detta.
Att använda ett NN är att verkligen överanstränga sig i onödan, det är en massa jobb att implementera och det blir långsamt att använda. Dessutom är resutlatet väldigt osäkert och det är en stor risk för att det blir fel om man inte är van vid NN och dessutom väldigt noggrann. Jag får känslan av att du just nu pluggar NN och därför ser det som första alternativ, men jag tycker inte det är optimalt.
// JohanSv:Färg ur GetPixel
Naturligtvis har jag gjort det...
<b>>Beroende på hur noggrann man vill vara så jämför man enbart H eller både H och S. Enbart jämföra H kan ge felindikering vid vissa gråa nyanser precis som du anger, men då använder man som sagtr både H och S om man vill undvika detta.</b>
Ja, men låt säga att du har L=0. Vad får du då? Svart!
(eller vitt för L=max, vilket håll det är kommer jag aldrig ihåg).
<b>>Att använda ett NN är att verkligen överanstränga sig i onödan, det är en massa jobb att implementera och det blir långsamt att använda. </b>
Vi pratar om en extremt statisk NN, kan man lätt få ihop på nån timme. Själva NN:et är bara till för att få fram parametrarna, sen kan det skrivas i ren kod, med parametrarna inskrivna som konstanter. Tiden ökar på sin höjd marginellt.
<b>>Dessutom är resutlatet väldigt osäkert och det är en stor risk för att det blir fel om man inte är van vid NN och dessutom väldigt noggrann. </b>
Håller med till viss del, men med tillräcklig träning på nätverket är det inga problem. Ett NN är ju i princip ett plan som skär kuben i det här fallet, och det enda viktiga är att välja rätt färger.
<b>>Jag får känslan av att du just nu pluggar NN och därför ser det som första alternativ, men jag tycker inte det är optimalt.</b>
Då är din känsla fel. Jag ser det som ett alternativ eftersom han inte har fått de andra lösningarna att fungera, och eftersom det faktiskt är ganska enkelt. Sv: Färg ur GetPixel
Vad är egentligen neurala nätverk? Det låter väldigt intressant.Sv: Färg ur GetPixel
Dessa kan då lösa många olika sorters problem genom att man tränar upp dem. Har funderat på att kanske skriva en artikel om dem, men man får se om jag hinner.
I ditt fall så skulle hela det neurala nätverket motsvara ett plan i kuben, kan man säga, och genom att träna det med olika färger så lägger det sig rätt. Genom att lägga till fler neuroner utökar man komplexiteten hos funktionen, och man kan få mycket specialicerade funktioner som kan lösa alla möjliga skumma villkor.
Men de ska användas rätt, och för rätt indata. I just ditt fall är det en ganska logisk grej, som passar väl för just NN, och därför föreslog jag det.Sv:Färg ur GetPixel
Sv:Färg ur GetPixel
Sök på "neural networks" så hittar du nog något...
Så mycket linjär algebra är det faktiskt inte.
I princip kan vi säga att man gör så här i varje neuron:
- ett antal input, I1, I2, ...
in i dessa input kommer siffror (av någon storleksordning)
- på varje input använder du en funktion, dvs. f1(I1), f2(I2), ...
denna brukar helt enkelt vara multiplikation med ett tal x1, x2, ..., alltså att man har ett antal input, och man skalar dem på något lämpligt sätt.
-sen tar man summan av alla dessa tal, och kör deet genom en funktion, och det blir det nya outputet, typ:
ut=g(f1(i1)+f2(i2)...)
Och denna g kan till exempel vara ett enkelt steg, dvs om summan av alla tal är mindre än y så ge ute n 0:a och summan är större ge ut en 1:a.
Varje enskild sån här neuron är nästan löjligt enkel, men tillsammans kan de göra ganska komplexa system. Man kopplar helt enkelt output från en nod till input för nästa, etc. Till slut har man en eller flera "totaloutput". I ditt fall hade det varit tre input, en per färg, och en output, "grön/inte grön", och några neuroner emellan. Så för varje input får du ut ett svar.
För att sen träna nätverket finns flera olika sätt. Antingen gör man det genom att konstatera "hur man bör förändra" nätverket, vilket jag inte är speciellt insatt i, eller så kör man med en genetisk algoritm.
Det går helt enkelt ut på att man skapar en "DNA-kod" för varje neuralt nätverk, t.ex. x1, x2, y, osv. Sen slumpar man fram en massa neurala nätverk, kollar vilka som klarar sin uppgift bäst, och låter dem leva vidare, samt lägger till lite mutationer, skapar barn etc. Det är det som är träningen.
Till slut hittar man en som klarar alla krav man ställer i träningen, och då tar man den, och använder den i programmet.Sv: Färg ur GetPixel
Sv:Färg ur GetPixel
Just statistik är nog högst olämpat, ser inte ens hur man skulle kunna försöka lösa det. Om man däremot hamnar i en situation där man ställs inför ett val eller en situation där man ska "avgöra om något uppfyller ett villkor", så kan det ibland vara läge att fundera på om ett nn kan underlätta.
Sen ska man inte ha allt för stor tilltro till dem heller, de är inte magiska. Hjärnan innehåller ett antal miljarder neuroner, om jag inte minns fel, och de är dels analoga, dels kommunicerar de på två olika sätt, och dels är de självföränderliga. Så en liten grej på några hundra neuroner klarar inte av vad som helst.