JAI - Algorítmo para Autocrop (retirar bordas brancas de imagens scaneadas - documentos)

5 respostas
D

Pessoal, fiz o seguinte código para tirar bordas brancas de imagens JPG.

/**
	 * Método responsável por retirar as bordas brancas da imagem.
	 * @param bi
	 * @return cropped buffered image.
	 */
	public static BufferedImage autoRecortarImagem(BufferedImage bi){
        
		int w = bi.getWidth();
		int h = bi.getHeight();
		int RGB = 0;
		int upperLeftX = 0;
		int upperLeftY = 0;
		int bottonX = 0;
		int bottonY = 0;
		for(int posY = 0;posY<h;posY++){
			for(int posX = 0;posX<w;posX++){
				RGB = bi.getRGB(posX,posY);
				Color color = new Color(RGB);
				
				int red = color.getRed();
				int green = color.getGreen();
				int blue = color.getBlue();
				//if(red != 0 && green != 0 && blue != 0){
					if(red<240 && green < 240 && blue < 240){
						if(upperLeftX == 0 || upperLeftX > posX){
							upperLeftX = posX;
						}
						if(upperLeftY == 0 ||upperLeftY > posY){
							upperLeftY = posY;
						}
						if(bottonX <= w && bottonX < posX){
							bottonX = posX;
						}
						if(bottonY <=h && bottonY < posY){
							bottonY = posY;
						}
					}						
				//}

			}
		}

		int newX = upperLeftX;
		int newY = upperLeftY;
		int newWidth = bottonX - upperLeftX;
		int newHeight = bottonY - upperLeftY;
		
		BufferedImage cropedBi = bi.getSubimage(newX, newY, newWidth, newHeight);

        return cropedBi;
	}

Gostaria de saber se alguém aqui já precisou fazer isto ou se alguém pode me ajudar a aumentar o desempenho. Atualmente ele só corta quando o background é branco, mas gostaria de colocar ele para qualquer tipo de background.

Abraços.

5 Respostas

D

Alguém?

J

Precisou fazer o que?
Uma função de limiar resolve o problema de maneira simples. Só precisa contar pixels e usar uma constante como limite. O que você fez mesmo.
Só acho o seu código um pouco lento, porque BufferedImage.getRGB é bem mais lerdo que os métodos de WritableRaster.
Dá uma pesquisada nele.

Para o background, uma subtração ou divisão resolvem perfeitamente seu problema.

D

juliocbq:
Precisou fazer o que?
Uma função de limiar resolve o problema de maneira simples. Só precisa contar pixels e usar uma constante como limite. O que você fez mesmo.
Só acho o seu código um pouco lento, porque BufferedImage.getRGB é bem mais lerdo que os métodos de WritableRaster.
Dá uma pesquisada nele.

Estou já estudando o Raster e já vou adaptar o algorítmo. Obrigado pela dica!!!

Desculpe, mas não entendí muito. Eu tento saber qual a cor do background contando quantidade de pixels?

Obrigado denovo pela ajuda.

J

Não, a subtração é uma operação simples. Imagem1 possui a imagem escaneada com fundo e a imagem dois possui apenas o fundo.

O resultado da subtração das duas vai te dar a imagem escaneada sem o fundo.

Leia aqui com atenção:

http://homepages.inf.ed.ac.uk/rbf/HIPR2/pixsub.htm

D

juliocbq:
Não, a subtração é uma operação simples. Imagem1 possui a imagem escaneada com fundo e a imagem dois possui apenas o fundo.

O resultado da subtração das duas vai te dar a imagem escaneada sem o fundo.

Leia aqui com atenção:

http://homepages.inf.ed.ac.uk/rbf/HIPR2/pixsub.htm

Muito informativo a URL. Muito obrigado. Vou estudar!

Criado 9 de julho de 2010
Ultima resposta 13 de jul. de 2010
Respostas 5
Participantes 2