Ottenere valore di pixel in scala di grigi da spazio colore RGB in Java utilizzando BufferedImage

StackOverflow https://stackoverflow.com/questions/2499545

Domanda

Qualcuno sa di un modo semplice per convertire il valore RGBint tornato da <BufferedImage> getRGB(i,j) in un valore in scala di grigi?

Stavo per la media semplice dei valori RGB da loro rottura di utilizzare questo;

int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;

e poi rosso medio, verde, blu.

ma mi sento come in una semplice operazione come devo essere perso qualcosa ...

Dopo una grande risposta a una domanda diversa, mi dovrebbe chiarire che cosa voglio.

Voglio prendere il valore RGB tornato da getRGB (i, j), e trasformarla in un bianco-valore nella gamma 0-255 che rappresenta il "Tenebre" di quel pixel.

Ciò può essere ottenuto facendo la media e tale, ma io sono alla ricerca di un'implementazione OTS per salvare me poche righe.

È stato utile?

Soluzione

questo non è così semplice come sembra perché ci esiste una risposta corretta al 100% per quanto per mappare un colore in scala di grigi.

il metodo userei è quello di convertire RGB a HSL poi 0 la porzione S (ed eventualmente convertire in RGB), ma questo potrebbe non essere esattamente quello che vuoi. (È equivalente alla media del valore massimo e minimo rgb in modo un po 'diverso alla media di tutti e 3)

Altri suggerimenti

esercitazione mostra 3 modi per farlo:

Modificando ColorSpace

ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
BufferedImage image = op.filter(bufferedImage, null);

Con il disegno ad un BufferedImage scala di grigi

BufferedImage image = new BufferedImage(width, height,
    BufferedImage.TYPE_BYTE_GRAY);
Graphics g = image.getGraphics();
g.drawImage(colorImage, 0, 0, null);
g.dispose();

Utilizzando GrayFilter

ImageFilter filter = new GrayFilter(true, 50);
ImageProducer producer = new FilteredImageSource(colorImage.getSource(), filter);
Image image = this.createImage(producer);

della media suona bene, anche se Matlab rgb2gray utilizza somma ponderata.

Matlab rgb2gray

Aggiorna
Ho provato l'implementazione del metodo Matlab in Java, forse ho fatto male, ma la media ha dato risultati migliori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top