Converter Imagem de Preto para Branco e de Branco para Preto

Boa tarde, Pessoal.

Estou desenvolvendo uma aplicação onde preciso converter uma imagem colorida para preto e branco primeiro. Logo apos preciso converter onde tem branco para preto e onde tem preto para branco. Encontrei uma função aqui no GUJ que faça a conversão do colorido para o preto e branco. Minha segunda missão é converter onde é preto para branco e onde é branco para preto.

Observei que o @ViniGodoy tem muito conhecimento nesse assunto. Alguem poderia me ajudar?

A primeira função ficou assim:

public static BufferedImage image2BlackWhite(BufferedImage image1) {
	int w = image1.getWidth();
	int h = image1.getHeight();
	byte[] comp = { 0, -1 };
	IndexColorModel cm = new IndexColorModel(2, 2, comp, comp, comp);
	BufferedImage image2 = new BufferedImage(w, h,
	BufferedImage.TYPE_BYTE_INDEXED, cm);
	Graphics2D g = image2.createGraphics();
	g.drawRenderedImage(image1, null);
	g.dispose();
	return image2;
}

Um algoritmo meio bruto (fiz sem testar):

public static BufferedImage invertedBW(BufferedImage source){
  int w = source.getWidth();
  int h = source.getHeight();

  BufferedImage result = new BufferedImage(w,h, BufferedImage.TYPE_INT_ARGB);

  int originalColor;

  Color newColor;
  
  for (int i = 0; i < w; i++){
	for (int j = 0; j < h; j++){
		originalColor = source.getRGB(i, j);
		
		newColor = originalColor > 0 ? Color.BLACK : Color.WHITE;
		
		result.setRGB(i, j, newColor.getRed(), newColor.getGreen(), newColor.getBlue());
	}
  }
return result;
}

Abraço.

Obrigado @TerraSkilll fiz o teste aqui e encontrei um erro na linha abaixo:

result.setRGB(i, j, newColor.getRed(), newColor.getGreen(), newColor.getBlue());

devido a quantidade ou tipo de parametros passados ao metodo setRGB();

thanks very

Aqui tem uma série de exemplos de exercícios que faço para as minhas aulas:

Dê uma olhada nas funções:

  1. grayscale: para conversão da imagem para tons de cinza
  2. threshold: para fazer uma imagem com cores só pretas ou brancas.

Para inverter as cores de uma imagem, use a formula:
255 - r
255 - g
255 - b

Em cada pixel.

1 curtida

Ah sim, aqui também tem a solução dos mesmos exercícios usando recursos do Java 8, como closures: https://github.com/progjogos3d/imagem01-ex02

1 curtida

PS: Obviamente, estou partindo do pressuposto que se te pediram isso, querem que você faça no braço. E nesse caso, não faz tempo usar o getGraphics().

1 curtida

@ViniGodoy muito obrigado pela força!

só alterei a função threshold, mas ainda estou com dúvida em informar o paramentro (value) correto da função threshold .

a alteração foi em:

if (p.getRed() <= value) {
out.setRGB(x, y, Color.WHITE.getRGB());
} else {
out.setRGB(x, y, Color.BLACK.getRGB());
}

Essa é a parte configurável da função. Quanto menor o threshold, mais clara ficará a imagem final.

Se a sua imagem de entrada é colorida, o ideal não seria usar só o getRed(), mas mudar para:

    int avg = (p.getRed() + p.getGreen() + p.getBlue()) / 3;
    if (avg <= value) {
        out.setRGB(x, y, Color.WHITE.getRGB());
    } else {
        out.setRGB(x, y, Color.BLACK.getRGB());
    }

Se vc quiser uma forma de estimar um bom valor de threshold para a imagem automaticamente, você poderá implementar o algoritmo de otsu, explicado aqui: http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html

1 curtida