[ Viktor85 @ 08.12.2011. 09:52 ] @
Zdravo svima,

Par dana pokusavam da pronadjem na googl-u, forumima itd. kako u Javi napisati klasu koja iscrtava sliku predstavljenu 2d matricom na ekran. Indeksi matrice predstavljaju piksele, a njihova vrednost odredjuje kojom bojom ce piksel biti iscrtan. Ono sto je problem je sto boje treba da budu crne - najveca vrednost i bele - najmanja vrednost, dok ostale vrednosti nekom nijansom sive (u zavisnosti od vrednosti ). Naravno ne treba mi gotovo resenje ali bar neka kratka uputstva bi mi mnogo znacila hvalal unapred
[ Deki11 @ 08.12.2011. 22:18 ] @
Ajd samo smernice da ti dam :)

Najpre boja: tebi treba sive nijanse, a kod njih su sve 3 komponente boje (R, G, B) jednake.

Prodji kroz sve vrednosti matrice i pronadji maksimalnu vrednost, i upamti je (npr. maxValue) , ona ce sluziti za normalizaciju.
Zatim odredjujemo boju svakog piksela:

float componentIntensity = 1.0f - currentPixValue/maxValue

Oduzimanje od 1 je potrebno jer bi u suprotnom najveca vrednost bila bela (1.0, 1.0, 1.0), a nama treba crna (0.0, 0.0, 0.0))
Dakle, boja tekuceg piksela je
(componentIntensity , componentIntensity , componentIntensity ).

Ajd ako se ne snadjes, razjasnicemo detaljnije.


[ sanchi @ 09.12.2011. 13:13 ] @
Imas ovde neko uputstvo za iscrtavanje pojedinacnih pixela... nisam probala. Valjda iteracija kroz matricu nece biti problem :)
http://stackoverflow.com/questions/3325546/how-to-color-a-pixel
[ G.Kaplan @ 09.12.2011. 19:49 ] @
i ja pokusavam nesto slicno. tacnije, hocu da slici izvucem ivice (sobelom npr.) i da je takvu snimim u grayscale varijanti, sto mi ne uspeva. procedura je sledeca: sliku prvo pretvorim u matricu, pa predjem maskom preko nje i na kraju matricu konvertujem nazad u sliku.

rezultat je sledeci:

http://imageshack.us/photo/my-images/577/penji.jpg/
http://imageshack.us/photo/my-images/824/imgcon.png/


evo i delova koda:

1) slika u matru
Code:

private int[][] toMatrix(){
        int[][] matrix = new int[this.img.getHeight()][this.img.getWidth()];        
        
        for(int i = 0; i < this.img.getHeight(); i++){
            for(int j = 0; j < this.img.getWidth(); j++){
                matrix[i][j] = convertePixToGray(this.img.getRGB(i, j));
            }
        }    
        return matrix;
    }    

    private int convertePixToGray(int pixel){
        int r, g, b;
        
        Color c = new Color(pixel);
        
        r = c.getRed();
        g = c.getGreen();
        b = c.getBlue();
        //ovo bi valjda trebalo da izracuna intenzitet sivila?
        return (int) (0.2989 * r + 0.5870 * g + 0.1140 * b);
    }


2) nazad
Code:

public void matrixToImage(){
        for(int i = 0; i < this.img.getHeight(); i++){
            for(int j = 0; j < this.img.getWidth(); j++){
                this.img.setRGB(i, j, this.matrix[i][j]);    
            }
        }    
    }


moguce da sam negde napravio strasnu glupost jer o citavom problemu (img processing) znam jako malo, a i s javom sam na vi. sugestije su dobrodosle.
[ Deki11 @ 09.12.2011. 23:59 ] @
@G.Kaplan
greska je matrix[j] = convertePixToGray(this.img.getRGB(i, j));
Ovu vrednost koju si dobio sa convert treba da dobiju sve 3 komponente,
dakle,

int a = convertePixToGray(this.img.getRGB(i, j));
matrix[j] = a<<16 + a<<8 + a;

ili u prevodu: bitovi 16-23 predstavljaju R komponentu, bitovi 8-15 su G komponenta, a 0-7 su B komponenta.
I sve tri mora da budu jednake da bi boja bila siva!
(A ono '<<' je shiftovanje bitova za 16 odn. 8 mesta...)

Probaj pa javi rezultate.

[ G.Kaplan @ 10.12.2011. 14:37 ] @
hvala na odgovoru ali rezultat je: http://imageshack.us/photo/my-images/811/imgcon.png/
ovo je bez izvlacenja ivica, znaci samo slika u matricu i nazad.

Code:

private int convertePixToGray(int pixel){
        int r, g, b;
        int res;
        
        Color c = new Color(pixel);
        
        r = c.getRed();
        g = c.getGreen();
        b = c.getBlue();
        
        res = (int)(0.2989 * r + 0.5870 * g + 0.1140 * b);
        return res << 16 + res << 8 + res;
    }


ova izmena na kraju je resila prob. hvala.
Code:

c = new Color(res, res, res);
return c.getRGB();    



[Ovu poruku je menjao G.Kaplan dana 10.12.2011. u 16:30 GMT+1]
[ Deki11 @ 10.12.2011. 19:16 ] @
Moja greska, zaboravio sam zagrade. Dakle, treba:

return (res << 16) + (res << 8) + res;