Pergunta

Alguém sabe de uma maneira simples de converter o valor RGBINT devolvido de <BufferedImage> getRGB(i,j) em um valor em escala de cinza?

Eu ia simplesmente calcular a média dos valores RGB, quebrando -os usando isso;

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

e depois vermelho médio, verde, azul.

Mas sinto que, por uma operação tão simples, devo estar perdendo alguma coisa ...

Depois de uma ótima resposta para uma pergunta diferente, devo esclarecer o que quero.

Quero pegar o valor RGB retornado do getRGB (i, j) e transformá-lo em um valor branco na faixa de 0 a 255, representando a "escuridão" desse pixel.

Isso pode ser realizado com a média e tal, mas estou procurando uma implementação do OTS para me salvar algumas linhas.

Foi útil?

Solução

Isso não é tão simples quanto parece porque lá Não é uma resposta 100% correta sobre como mapear uma cor em escala de escala.

O método que eu usaria é converter RGB em HSL, então a parte S (e opcionalmente converter novamente em RGB), mas isso pode não ser exatamente o que você deseja. (É equivalente à média do valor RGB mais alto e mais baixo, um pouco diferente da média de todos os 3)

Outras dicas

este tutorial mostra 3 maneiras de fazer isso:

Mudando ColorSpace

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

Ao atrair uma escala de cinza BufferedImage

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

Usando GrayFilter

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

A média parece boa, embora o Matlab RGB2Gray use soma ponderada.

Verificar MATLAB RGB2GRAY

ATUALIZAR
Tentei implementar o método MATLAB em Java, talvez tenha feito errado, mas a média deu melhores resultados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top