Melhorando imagens com java

Posted on jun 11, 2008 under Processamento de Imagem | 5 Comentários

Geralmente as imagens podem ter ser contraste melhorado realçando partes da imagem que antes não muito destacadas uma forma de melhorar é através da equalização do histograma.

O histograma de uma imagem é demonstrado através de um gráfico de barras, onde é feito um somatório da ocorrência de cada pixel. Neste exemplo será utilizada uma imagem na escala de cinza com um resolução de 16bits (0 a 65536).

Desenvolvi um algoritmo que cria e equaliza o histograma.

O algoritmo mostrado aqui foi desenvolvido em Java usando a API ImageJ. E tem o seguinte príncipio de funcionamento:

  1. Lê a imagem;
  2. Cria o histograma;
  3. Cria a tabela LUT (Look Up Table);
  4. Encontra a escala que será o total do somátorio dividido pelos níveis de cinza;
  5. Atribui valores a tabela que será lut(n) = H[n] * escala;
  6. Aplica a tabela na imagem.

O código mostrado é um plugin do imageJ

import ij.ImagePlus;
import ij.plugin.filter.PlugInFilter;
import ij.process.ImageConverter;
import ij.process.ImageProcessor;

public class HistogramEqualization_ implements PlugInFilter{
	int hist[];
	private ImagePlus imp;

	public int setup(String arg0, ImagePlus imp)
	{
		this.imp = imp;
		return DOES_16;
	}

	public void run(ImageProcessor ip)
	{
		hist = ip.getHistogram();
		equalizeHistogram(ip);
		imp.setProcessor("Equalized", ip);
		imp.updateAndDraw();
	}

	public void equalizeHistogram(ImageProcessor ip)
	{
		int max = 65535+1;
		float sumH[] = new float[max];
		float sum = 0;

		for(int i=0;i< max;i++)
		{
			sum = sum + hist[i];
			sumH[i] = sum;
		}

		int lut[] = new int[max];
		double scale = max/sum;

		for(int i = 1;i< max;i++)
			lut[i] = (int)Math.round(sumH[i] * scale);

		lut[max-1] = max;
		ip.applyTable(lut);
	}
}

Utilizando a famosa imagem do cameramam

Cameram Original

Histograma Original

Histograma Original Cameramam

Após a execução do algoritmo temos a nova imagem do cameramam com o histograma equalizado

Cameramam equalizado

Histograma equalizado

histograma equalizado cameraman

Este algoritmo equalizou o histograma melhorando o contraste mostrando os prédios no fundo da imagem que não apareciam muito bem. Existem outras formas de equalizar o histograma e melhorar a imagem que podem serem pesquisadas no Livro Digital Image Processing

Assine o feed e receba as matérias do blog por email.

5 Responses to “Melhorando imagens com java”

  1. Marcelo disse:

    olá,cara estou querendo usar o imageJ mas nao sei como instala a API pra usar no java,eu sou iniciante em java e uso o netBeans

  2. admin disse:

    Olá Marcelo

    Segue um link para instalação do ImageJ no Netbeans
    http://www.mbl.edu/research/labs/adlc/CamAcqJ/NetBeansforIJDevelopment.html

    Sucesso.

  3. Marcelo disse:

    olá, mais algumas duvidas
    Tu não teria esse codigo ai comentado, por exemplo nao sei em que parte do codigo você passou a imagem para o progama fazer o ajuste.

  4. Marcelo disse:

    olá,dando uma pesquizada melhor entendi um pouco, vc cria esse plugin e utiliza no progama imageJ, é isso né.

Leave a Reply