JAI - modificar um pixel de uma imagem

fmz galera ? procurei aqui no forum mas na achei nada q possa me ajudar…
to tentando modificar um pixel de uma imagem usando o JAI.

PlanarImage pi;
pi = JAI.create(“fileload”, nomeImagem);
getContentPane().add(new DisplayJAI(pi));
int cor, pixel[] = {0, 0, 0,
Raster raster=pi.getData();
BufferedImage bi=null;
bi= pi.getAsBufferedImage();
Raster raster2=null;
WritableRaster rasterW=null;
rasterW=bi.getRaster();

SampleModel sampre=pi.getSampleModel();
RandomIter item=RandomIterFactory.create(pi,null);
for (int l=0 ; l<pi.getHeight() ; l++)
  for (int c=0 ; c<pi.getWidth() ; c++)
  {
    item.getPixel(c,l,pixel);
    raster.getPixel(c,l,pixel);
    rasterW.getPixel(c,l,pixel);//pego o pixel

    cor=(pixel[0]>127 ? 255 : 0);//converte em preto e branco
    pixel[0]=pixel[1]=pixel[2]=cor;
    rasterW.setPixel(c,l,pixel);//devolvo o pixel modificado para o WritableRaster 
  
  }

//como q faço para alterar o PlanarImage ???

Se você puder, não trabalhe com JAI modificando um pixel de cada vez. Isso é muito, MUITO, MUITO lento. Só faça isso para coisas muito pequenas (você vai mudar 10.000 pixels de uma imagem, não 10.000.000 pixels como é o caso típico).

Como você quer efetuar uma operação para converter uma imagem em tons de cinza para preto-e-branco, você tem de olhar isso na documentação, mas acho que é bem mais simples que essa coisa braçal de ficar mexendo em um pixel de cada vez.
Acho que é algo tão fácil quanto copiar sua imagem (em tons de cinza) para uma nova imagem (em preto-e-branco) e especificar alguns parâmetros (no seu caso o “threshold”, que é 127).

Dê uma espiada aqui:
http://incubadora.fapesp.br/sites/marvin/

Pra transformar uma imagem em escala de cinza, basta fazer o seguinte:

public class escala_de_cinza {

public static PlanarImage converterCorParaCinza(PlanarImage src) {
    PlanarImage dst = null;
    double[][] matrix = {
                            { .114D, 0.587D, 0.299D, 0 },
                            { .114D, 0.587D, 0.299D, 0 },
                            { .114D, 0.587D, 0.299D, 0 }
                        };

    if ( src != null ) {
        ParameterBlock pb = new ParameterBlock();
        pb.addSource(src);
        pb.add(matrix);
        dst = JAI.create("bandcombine", pb, null);
    }

    return dst;
}

}

Para deixar uma imagem em somente preto em branco, ou seja, binarizá-la vc deve ter um limiar que significa um ponto onde vc quer que altere a imagem, fica da seguinte maneira:

public class PretoeBranco {

 public PlanarImage getPretoeBrancoImage(PlanarImage source, int limiar) {
    PlanarImage im;
    byte[][] lut = new byte[3][256];
    byte[][] newlut = new byte[3][256];
    
    int i;
    
    for (i = 0; i < limiar; i++ ) {
            lut[0][i] = (byte)0; //R
            lut[1][i] = (byte)0; //G
            lut[2][i] = (byte)0; //B
    }
    
    for(i = limiar; i < 256; i++) {
            lut[0][i] = (byte)255; //R
            lut[1][i] = (byte)255; //G
            lut[2][i] = (byte)255; //B
    }
    
    for (i = 0; i < 256; i++ ) {
        int red   = (int)lut[0][i]&0xFF;
        int green = (int)lut[1][i]&0xFF;
        int blue  = (int)lut[2][i]&0xFF;
        newlut[0][i] = clamp(red);
        newlut[1][i] = clamp(green);
        newlut[2][i] = clamp(blue);
    }        
    
    im = colorize(newlut, source);
    
    return im;
}

private PlanarImage colorize(byte[][] lt, PlanarImage source) {
   
    LookupTableJAI lookup = new LookupTableJAI(lt);

    ParameterBlock pb = new ParameterBlock();
    pb.addSource(source);
    pb.add(lookup);

    PlanarImage dst = JAI.create("lookup", pb, null);
    return dst;
    
}


final static private byte clamp(int v) {
    if ( v > 255 ) {
        return (byte)255;
    } else if ( v < 0 ) {
        return (byte)0;
    } else {
        return (byte)v;
    }
}   

}

como faço para extrair, ler os pixels de uma imagem em escala de cinza?