Obtendo valor de pixel de escala de escala de rgb colourspace em java usando bufferiMage
-
21-09-2019 - |
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.
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.