[ sbing @ 20.03.2005. 19:05 ] @
Imam jedan problem.
Ovo je source:

Dim slika As New System.Drawing.Bitmap("C:/NekakvaSlika.bmp")
Dim boja As New System.Drawing.Color()
boja = slika.GetPixel(100, 100)

Sad me zanima kako da ja tu svoju boju konvertiram u crno-bijelu?
Da mi za crnu boju bude:
Boja.R=0
Boja.G=0
Boja.B=0
a za bijelu boju 255.

Pomogla bi mi i neka funkcija koja bi sliku ("C:/NekakvaSlika.bmp") konvertirala u crno-bijelu.
Hitno mi je, pomagajte!
[ havramm @ 20.03.2005. 19:55 ] @
Mozda ovo?
Code:
using (Bitmap bmp = Bitmap.FromFile(imageFile) as Bitmap)
{
    for (int x = 0; x < bmp.Width; x++)
    {
        for (int y = 0; y < bmp.Height; y++)
        {
            Color old = bmp.GetPixel(x, y);
            byte val = (byte)((222 * old.R + 707 * old.G + 71 * old.B) / 1000);
            if (val > 255)
            {
                val = 255;
            }

            if (val < 0)
            {
                val = 0;
            }

            bmp.SetPixel(x, y, Color.FromArgb(val, val, val));
        }
    }
...
}


Ovo je samo izvadjen snippet, ali to sam recimo ja koristio za dobijanje gray slike od slike u boji.
[ sbing @ 20.03.2005. 21:05 ] @
Hvala stari puno si mi pomogao!
[ Shadowed @ 21.03.2005. 14:46 ] @
Pitam se zasto postoje koeficienti za R, G i B. Zasto se ne racuna obicna aritmeticka sredina?
[ havramm @ 21.03.2005. 14:49 ] @
To sam pokupio negde na net-u, ne secam se gde, probao sam, radilo je i bilo je prihvaceno
[ sbing @ 21.03.2005. 22:25 ] @
Meni nije bilo jasno kako se to računa. Što sam god probao nije mi radilo dobro npr. aritmetička sredina. Al, eto, havramm mi je objesnio. Još jednom mu hvala. Radim nešto što bi trebalo biti OMR pa učitavam pixele sa skeniranog papira, pa mi je jako korisno da mi bude crno-bijela slika. Zato mi je trebalo nešto što mi te piksele konvertira u crno-bijele. Može se papir skenirat kao crno-bijeli ali to je nepotrebno maltretiranje krajnjeg korisnika programa pa mi je bolje to riješit ovako, da mi slika na disku bude normalna a da ju program gleda drugačije.
[ mmix @ 22.03.2005. 14:14 ] @
Imaš i ove koeficijente (u hiljaditim delovima), pa probaj i sa njima:

Red: 299
Green: 587
Blue: 114

Inače, ti koeficijenti su jednostavno udeo koji ta boja daje "beloj" boji kad je u maksimalnom intenzitetu. Dakle puna crvena bi na crno belom televizoru dala oko 30% intenziteta. Ovo sve naravno pod uslovom da su RGB krive na svim televizorima i monitorima iste što nisu.
Konverzija direktno zavisi od tvoje primene i šta pokušavaš da prikazeš, tj analiziraš. Npr, medicinski snimak u boji se može konvertovati sa dva različita seta koeficijenata u dijagnostici dva različita oboljenja. Dobija se gray slika koja nije "crno bela" slika koju bi video da pustiš kolor snimak na crno belom televizoru, ali je upotrebljiva za analizu jer ističe problematična područja.
Imajući to u vidu možda bi za tvoju OMR analizu mnogo bolja bila neka druga kombinacija sem ovih koje smo ti dali havramm i ja.

[ sbing @ 22.03.2005. 19:30 ] @
Sistem koji sam odabrao za OMR analizu je kad odredim precizne koordinate kvadratića na slici, ulazim u kvadratić pa odredim broj crnih pixela u njemu. A ako je taj kvadratić obilježen (obojan npr.kemijskom ili običnom olovkom) i ako je slika crno-bijela u njemu mora biti određeni postotak crnih pixela. Isto tako moram tolerirati određeni broj crnih piksela ako je slika loše skenirana. Odredio sam da mora biti bar 30% crnih piksela da kvadratić prepozna kao obilježen (to je dovoljno da prepozna obilježen kvadratić ako je u njega upisan X a dosta loše skenirana slika u njemu neće napraviti 30 posto crnih pixela ako polje nije obilježeno).Tako da mi havramm-ova metoda ne radi problema jer tolerancija od 30% mi je dovoljna da pokrije eventualne pogreške njegove funkcije a ovo tvoje (Red: 299 Green: 587 Blue: 114) ću isprobat pa ako mi bude bolje pretvaralo piksele... Da mi je znat gdje si iskopo te postotke, tražio sam to po netu ali bezuspješno.
[ mmix @ 23.03.2005. 17:52 ] @
Ah,
sad mi je u stvari malo jasnije sta ti hoćeš da uradiš, čista boolean procena da li je neki checkbox na papiru markiran ili ne.

Pazi ovako, kao prvo, veoma je nezahvalno analizirati gray sliku, ništa manje zahvalno od analiziranja kolor slike. Ono što tebi treba da bi olakšao analizu je konverzija u "black & white" raster pa onda računanje procenata crnih tačkica u okviru lociranog boxa, što je mnogo lakše jer su svi pikseli ili crni ili beli . Ovaj dokument ti može pomoći, u njemu imaš objašnjeno matematički nekoliko najrasprostranjenijih dithering algoritama:

Dithering and Raster Graphics

mada lično ja bih izabrao onaj najprostiji, sračunaš intenzitet (tj. gray level) preko bilo "havrammovih" ili "mojih" koeficijenata tako da dobiješ vrednost u opsegu od 0 do 1000 i ako je vrednost ispod nekog threshold-a ubaciš crnu tačkicu u suprotnom belu. Eksperimentiši sa različitim skenerima i različitim olovkama dok ne dobiješ threshold vrednost koja će najmanje grešiti.

Inače, odakle mi koeficijenti, isto ko i havrammovi, došli sa interneta nekad davno To su sračunali ljudi malo više zaluđeni spektrima boja, talasnim dužinama istih i kako se one vide na toshiba flatscreenu
[ sbing @ 23.03.2005. 21:58 ] @
Citat:
mmix: Ah,
sad mi je u stvari malo jasnije sta ti hoćeš da uradiš, čista boolean procena da li je neki checkbox na papiru markiran ili ne.

Pazi ovako, kao prvo, veoma je nezahvalno analizirati gray sliku, ništa manje zahvalno od analiziranja kolor slike. Ono što tebi treba da bi olakšao analizu je konverzija u "black & white" raster pa onda računanje procenata crnih tačkica u okviru lociranog boxa, što je mnogo lakše jer su svi pikseli ili crni ili beli :). Ovaj dokument ti može pomoći, u njemu imaš objašnjeno matematički nekoliko najrasprostranjenijih dithering algoritama:

Otprilike tako sam i radio.
Ovako, taj moj checkbox je dimenzija 16*16 pixela a okvir je debel 2 pixela kad se papir skenira u omjeru 1:1. Sad taj moj checkbox zauzima 256 pixela (16*16), 112 pixela (44% ) zauzima okvir checkbox-a, pa mi na raspolaganju ostane 144 pixela s kojima ja radim. Ja jednostavno provjeravam pixel po pixel i određujem dali je crn ili bijel. Kad provjerim svih 144 pixela (naravno jednu varijablu sam uvećavao za 1 kad naleti na crni pixel) onda gledam koliko ima tih crnih pixela, ako ih je >= 45 (30% od 144) onda je moj checkbox true, inače je false. Ja sam sve to napravio i super radi, testirao sam i nije mi ni jednom pogriješilo. Ali testirao sam sa slikama koje sam u irfanu ručno promijenio u crno-bijele slike. Zato mi je i trebalo nešto kao ovi koeficienti ili ona havramm-ova funkcija, da si program sam to odredi dali je crno ili bijelo. Malo sam skenirao i skužio da mi stvarno sve radi OK i nemam potrebe pisat nikakve kompliciranije kodove od havramm-ovog. Ovaj tvoj PDF će mi sigurno jednoga dana zatrebati al mislim da za ovo vjerovatno neće. Mogu ti poslat na mail kad završim (još malo doradim) da vidiš kak dobro funkcionira. Mislim, ja se tu ne bavim nikakvim spektrima ili sličnim problemima, jedino imam sreće što je papir bijel a bilo kakva kemijska ili obicna olovka otprilike crna pa mi ne trebaju nikakva pre složena konvertiranja u crno-bijelu, jednostavno mi granice onih tvojih koeficienata bez ikakvih problema mogu malo i odstupati.