Algoritmo para capturar pixel

Pessoal bolei um algoritmo de pixel de vizinhança, para capturar um determinado pixel e verificar se ele possui outros conectados a ele. Caso sim, se for um número de 3 ou mais, desejo modificar o valor destes pixels. Seria uma linha traçada (preta) que tivesse uma outra (nova linha) conectada a ela… O fundo é em branco, a imagem esta em grayscale(). Só que o código em java não esta funcionando.

raster = imagem.getRaster();    
int cores[] = new int[255]; 
int count=0;   
for (int x = 0; x < imagem.getWidth(); x++) {    
    for (int y = 0; y < imagem.getHeight(); y++) {    
        raster.getPixel(x, y, cores); // captura da combinação de cor do pixel    
        if ((cores[x,y]>=0) && (cores[x,y]<5)) { 
            if (cores[x-1]<5) count++;         
            if (cores[x+1]<5) count++; 
            if (cores[y-1]<5) count++;
            if (cores[y+1]<5) count++;
            if ((cores[y-1]<5) && (cores[x-1]<5)) count++; 
            if ((cores[y-1]<5) && (cores[x+1]<5)) count++; 
            if ((cores[y+1]<5) && (cores[x-1]<5)) count++; 
            if ((cores[y+1]<5) && (cores[x+1]<5)) count++;                    
        } 
         if (count >=3) {
               //Aqui vai o código para trocar o valor destes pixels, mas falta eu bolar ainda...
         }         
          count=0;                         
    }    
} 

Na linha 07 esta dando erro…
Essa linha deveria indicar que o pixel dentre deste valor entrasse na condição para calcular os pixels de vizinhança…
alguma idéia?

Que eu saiba, o operador “,” não existe em Java.

Até onde sei o método getPixel() retorna os dados de cor de um único pixel, creio que o resultado é um array de inteiros com 4 elementos (componente R, componente G, componente B e componente Alfa). Para consultar os dados de cor dos pixels adjacentes, você terá de chamar getPixel() para cada um deles com os parâmetros adequados.

[quote=entanglement][quote]
cores[x,y]
[/quote]

Que eu saiba, o operador “,” não existe em Java. [/quote]

realmente o operador esta errado, mas a idéia continua, é fazer a leitura de total a matriz da imagem… posição x e y.

correto, getpixel vai retornar os valores RGB, mas não axei nada na net que trabalhasse com grayscale(), mas mesmo assim, com o valor do RGB tb iria funcionar pela lógica, só seria trabalho a mais…
mas se axar algum metodo que trabalhe só com escala de cinza, tb já é bem vindo…

Como você vai calcular a vizinhança, se só guarda uma linha? Você precisa ter a linha anterior e a próxima linha.

entanglement, voce tem alguma idéia para fazer esse tratamento em uma imagem em escala de cinza?
teria que jogar o valor de cada pixel em uma outra matriz, dae eu teria o valor de cada um.
tentei fazer um outro exemplo, mas também não deu.

raster = imagem.getRaster();
int cores[] = new int[255];
int matriz[][]=new int [100][100];
int count=0;

for (int x = 0; x < imagem.getWidth(); x++) {
    for (int y = 0; y < imagem.getHeight(); y++) {
        raster.getPixel(x, y, cores); // captura da combinação de cor do pixel       
        matriz[x][y]=cores[x];          
    }
}
     for (int x = 0; x < imagem.getWidth(); x++) {
        for (int y = 0; y < imagem.getHeight(); y++){
          if (matriz[x][y]>0) {
              count++;
          }
System.out.println("| "+matriz[x][y]+" |");
System.out.println("Total de Pixels: "+count);  
    }
}

acredito que o problema esteja na linha 09.
???

correto, getpixel vai retornar os valores RGB, mas não axei nada na net que trabalhasse com grayscale(), mas mesmo assim, com o valor do RGB tb iria funcionar pela lógica, só seria trabalho a mais…
mas se axar algum metodo que trabalhe só com escala de cinza, tb já é bem vindo…[/quote]

Você não leu as referências que te passei no outro post até hoje?

http://homepages.inf.ed.ac.uk/rbf/HIPR2/wksheets.htm

escala de cinza é uma simplificação de uma imagem de 24 ou 32 bits(3 bytes, ou 4bytes) para apenas um byte, ou seja uma banda de cor, onde esta é a luminância(L).

enquanto em uma imagem de 24 bits você possui 3 bandas, uma para cada byte, ou seja altura x largura 3, a imagem na escala de cinza possui apenas uma: alturalargura

Para converter uma imagem em escala de cinza, só se precisa calcular a média ou usar a fórmula da luminância, que você encontra novamente no link que estou te repassando.

[quote=juliocbq]Você não leu as referências que te passei no outro post até hoje?
escala de cinza é uma simplificação…
… novamente no link que estou te repassando.
[/quote]

juliocbp, apesar de meu PÉSSIMO ingles, li seu link sim… aos trancos e barrancos… mas vou exemplicar minha dificuldade:
para passar para grayscale eu consegui:

public void converterEscalaCinza(){
    WritableRaster raster; 
      imagemCinza = new BufferedImage(
    imagem.getWidth(), imagem.getHeight(), 
    BufferedImage.TYPE_BYTE_GRAY);
    Graphics g = imagemCinza.getGraphics();
    g.drawImage(imagem, 0, 0, null);
    g.dispose();
    areaImagem.imagem = imagemCinza;
    areaImagem.repaint();

assim eu consigo passar minha imagem para grayscale. minha dúvida é:
com esse código eu consigo ter acesso aos pixel em RGB

for (int x = 0; x < imagem.getWidth(); x++) {    
    for (int y = 0; y < imagem.getHeight(); y++) {    
        raster.getPixel(x, y, cores); // captura da combinação de cor do pixel  "Cores é um VETOR"  
        System.out.println("Coluna: "+x+"  Linha: "+y);
            System.out.println("R("+cores[0]+") G("+cores[1]+") B("+cores[2]+")");

Então: eu não estou conseguindo ter acesso aos pixels em GRAYSCALE() e jogá-los para uma matriz.
Preciso jogar o valor dos pixels da imagem em uma matriz. para poder jogar os outros métodos… e isso que não estou conseguindo fazer…
Então, não sei se estou no caminho certo… mas jogar esse pixels em grayscale na matriz não axei nada na net.
Se consegui ser claro, alguém teria alguma idéia?

Como seus pixels terão apenas uma banda, a luminância, não pode acessá-los em um vetor com 3, concorda?
O erro de execução pode estar aqui:

System.out.println("R("+cores[0]+") G("+cores[1]+") B("+cores[2]+")");

como simplificou os valores e possui somente luminância:

System.out.println("L"+cores[0]);

Pode usar um vetor de bytes, ao invés da classe raster, se achar mais adequado. Dessa maneira pode ver o formato dos pixels(quantos bytes p/ pixel)

ByteArrayOutputStream buff = new ByteArrayOutputStream(); ImageIO.write(bufImage, "jpg", buff); byte[] bytes = buff.toByteArray();

[quote=juliocbq] Como seus pixels terão apenas uma banda, a luminância, não pode acessá-los em um vetor com 3, concorda?
O erro de execução pode estar aqui:

System.out.println("R("+cores[0]+") G("+cores[1]+") B("+cores[2]+")");

como simplificou os valores e possui somente luminância:

System.out.println("L"+cores[0]);

[/quote]

beleza juliocbq…
funcionou, esta preenchendo a matriz perfeitamente…
a minha idéia é a seguinte: após preencher uma outra matriz[][] com o valor dos pixels que capturei pelo getpixel, irei alterar os valores de alguns pixels de 0 para 255 ou vice-versa…
e pretendo escrever uma nova matriz, e mostra-lá num frame…
será que pelo setpixel, eu consigo montar essa nova matriz? colocando uma condição e redesenhando as linhas???

consegue, é o mesmo princípio. Você vai percorrer a imagem e passar o valor de cada pixel.
Mas pode criar uma nova imagem diretamente pelo vetor de bytes que possui usando o operador new.