Hej, du får ladda in aktuell bild i en picturebox och därefter tillverka Ok men då har jag principen klar! Jag ska experimentera så snart jag hinner. Nja, riktigt så skulle jag inte beskriva en algoritm i frågan. Re: Niklas Det är ju exakt det jag gör? Hej Niklas, Ok... ?Ta bort röda ögon
Jag letar efter en artikel om att ta bort röda ögon på digitalfoton. Vad jag behöver är kodexempel på hur man kan implementera en sån funktion.Sv: Ta bort röda ögon
en arbetskopia:
Dim bmp As Bitmap = PictureBox1.Image.Clone
Sen i klickhändelsen för Pictureboxen, får du returnera muskoordinaterna:
dim p as point
p.X = e.X : p.Y = e.X
Efter detta ska dessa värden kalibreras så att de korrelerar till de faktiska
koordinater av ursprungsbilden, oberoende av PictureBox1 ev. bildminskning och offset.
nu får köra en nästlad for next- loop som som motsvarar ett grid-format område av
valfri storlek runt de nymoddade kordinaterna p.X och p.Y.
i denna "gridloop" får du m.h.a :
bmp.GetPixel och
bmp.SetPixel
ändra rgb-värdet om du tycker att gränsvärdet för rött uppnåts!
hade jag tid skulle jag skrivit hela programmet åt dig, men nu är det golf!Sv:Ta bort röda ögon
Hoppas golfen gick bra!
/RickardSv: Ta bort röda ögon
Hade snarare använt någon "filling algorithm" med en toleransnivå. Röda ögon har nästan alltid väldigt skarpa kanter och klarar sig med en tolerans på säg 50. (dvs avstånd("färgkoordinat förra", "färgkoordinat nya" <50)
Avstånd blir sqrt(r1^2-r2^2+ g1^2+ ... )
Grejen är också att "röda" ögon inte alltid är helt röda, utan kan ha ganska många variationer.
Principen är:
1. Utgå från en koordinat. Gör en matris, lika stor som bilden, med två bool. Den första beskriver om pixeln är besökt, den andra om pixeln ska färgas.
2. Anropa följande på första koordinaten.
3. Om pixeln redan är besökt, avsluta. Sätt annars till pixeln som besökt
4. Om det är den första pixeln, sätt den till "ska färgas". Kolla annars om avståndet i pixelfärg är tillräckligt nära föregående. Är den det, sätt till "ska färgas", annars "ska inte färgas".
5. Om den ska färgas, anropa funktionen från 3 på alla grannar (rekursivt).
Den kan modifieras så att man istället för att titta på "senaste färg" kollar på "första färgen". Det ger ett lite mer tillförlitligt resultat, och ser dessutom till att den inte fyller stora områden som har gradienter med samma färg.
Annars kan man just i fallet "röda ögon" tänka sig en enklare variant.
Man letar horisontellt och vertikalt efter punkter där man når sluten på cirkeln. Då har man fyra punkter på den (det behövs egentligen bara tre), och man kan ganska lätt bestämma cirkeln med en ekvation. Sen så fyller du just den cirkeln med svart.Sv:Ta bort röda ögon
Jag tycker att du överkomplicerar när du vill använda de de genombrända röda nyanserna.
De är enligt mig redan förstörda och tjänar litet och missvisande syfte.
Jag tror mer på att man bör lokaliserar de "röda" pixelerna och sen återskapar en harmonisk övergång från irisenfärg till den vit reflektionen i puppilens mitt. Detta kan man säkert göra med nån enkel algorithm.
Tjosan!Sv: Ta bort röda ögon
"Min" algoritm lokaliserar de röda pixlarna och markerar tydligt vilka de är med en bool. I princip kan ju även lite fuzzy logic slängas in. Exakt vad man gör med dem är ju upp till var och en. Sen är jag tveksam av din tolkning, jag hade för mig att de röda ögonen var effekter i pupillen, och ska isf rimligtvis färgas svarta.
Ärligt talat förstår jag inte vad du menar med att jag "överkomplicerar".Sv:Ta bort röda ögon
Jag säger som Stenmark: " Det är inte lätt och förklara, för en som inte begrip"
eller varför inte
" never argue with a idiot, he'll only drag you down to his level and beat you through experience "
förresten vem sa att pupillen inte skulle vara svart?
övergången jag pratar om är givetvis svart men går från Irisfärgen till vitt!Sv: Ta bort röda ögon
Exakt vad är det jag inte förstår?
Jag har en misstanke om att jag är kapabel till jag åtminstone förstår <b>vad</b> det inte är jag i så fall förstår.
Det du skriver i ditt första svar är i princip att du gör en rektangel på mxn pixlar kring de punkterna man klickar på, och sen färga de pixlar som är för långt ifrån rött till en annan färg. Allt det andra är bara triviala skalningar och implementationsdetaljer.
Vad jag då föreslår är en enkel fyllningsalgoritm som utgår från de punkterna man klickar och därifrån letar utåt för att hitta kanterna på den röda fläcken. På så sätt kan man hantera röda ögon av godtycklig storlek, och med godtycklig nyans av rött. Det klarar inte din variant.
<b>>förresten vem sa att pupillen inte skulle vara svart?</b>
<b>>övergången jag pratar om är givetvis svart men går från Irisfärgen till vitt!</b>
"Övergången är svart"?
"men går från irisfärgen till vitt"?
En övergång kan per definition inte bara ha en färg, men jag antar att du menar något i stil med irisfärg som går över i svart, vilket slutligen går över i vitt, till något som skall föreställa någon slags glans.
Då säger jag:
1. Kanten mellan iris och pupillen är skarp. Eftersom den är skarp vill vi inte ha någon mjuk övergång.
2. Att själv skapa en reflektion som inte finns i bilden känns dels lite krystat, dels ganska onödigt.
<b>>" never argue with a idiot, he'll only drag you down to his level and beat you through experience "</b>
Intressant!
Vad har du själv för utbildning inom, säg, bildbehandling?
Vad jag vet så är det nästan exakt den metod jag föreslår som används i senaste versionen av Adobe Photoshop för borttagning av röda ögon. Men jag har säkert fel. Berätta gärna mer!