Trabalhando com imagens em Java

Trabalhando com imagens em Java

1. Visão geral

Neste tutorial, examinaremos algumas bibliotecas de processamento de imagem disponíveis e executaremos uma operação simples de processamento de imagem - carregando uma imagem e desenhando uma forma nela.

Vamos experimentar a biblioteca AWT (e um pouco de Swing), ImageJ, OpenIMAJ e TwelveMonkeys.

2. AWT

O AWT é uma biblioteca Java integrada que permite ao usuário executar operações simples relacionadas à exibição, como criar uma janela, definir botões e ouvintes e assim por diante. Ele também inclui métodos que permitem ao usuário editar imagens. Não requer instalação, pois é enviado com Java.

2.1. Carregando uma imagem

A primeira coisa é criar um objetoBufferedImage a partir de uma imagem salva em nosso drive de disco:

String imagePath = "path/to/your/image.jpg";
BufferedImage myPicture = ImageIO.read(new File(imagePath));

2.2. Editando uma imagem

Para desenhar uma forma em uma imagem, teremos que usar o objetoGraphics relacionado à imagem carregada. O objetoGraphics encapsula as propriedades necessárias para realizar operações básicas de renderização. Graphics2D é uma classe que estendeGraphics. Ele fornece mais controle sobre formas bidimensionais.

Neste caso particular, precisamos deGraphic2D para estender a largura da forma e torná-la claramente visível. Conseguimos isso aumentando sua propriedade stroke. Em seguida, definimos uma cor e desenhamos um retângulo para que a forma fique a 10 px das bordas da imagem:

Graphics2D g = (Graphics2D) myPicture.getGraphics();
g.setStroke(new BasicStroke(3));
g.setColor(Color.BLUE);
g.drawRect(10, 10, myPicture.getWidth() - 20, myPicture.getHeight() - 20);

2.3. Exibindo uma imagem

Agora que desenhamos algo em nossa imagem, gostaríamos de exibi-lo. Podemos fazer isso usando objetos da biblioteca Swing. Primeiro, criamos o objetoJLabel que está representando uma área de exibição para texto e / ou imagem:

JLabel picLabel = new JLabel(new ImageIcon(myPicture));

Em seguida, adicione nossoJLabel aJPanel, que podemos tratar como<div></div> da GUI baseada em Java:

JPanel jPanel = new JPanel();
jPanel.add(picLabel);

No final, adicionamos tudo aJFrame, que é a janela exibida em uma tela. Temos que definir o tamanho para que não tenhamos que expandir essa janela sempre que executarmos nosso programa:

JFrame f = new JFrame();
f.setSize(new Dimension(myPicture.getWidth(), myPicture.getHeight()));
f.add(jPanel);
f.setVisible(true);

3. ImageJ

ImageJ é um software baseado em Java criado para trabalhar com imagens. Tem muitos plugins, disponíveishere. Usaremos apenas a API, pois queremos executar o processamento sozinhos.

É uma biblioteca bastante poderosa, melhor do que Swing e AWT, pois seu propósito de criação era o processamento de imagens e não as operações de GUI. Os plug-ins contêm muitos algoritmos de uso livre, o que é bom quando queremos aprender o processamento de imagens e ver rapidamente os resultados, em vez de resolver problemas de matemática e otimização sob algoritmos IP.

3.1. Dependência do Maven

Para começar a trabalhar com ImageJ, basta adicionar uma dependência ao arquivopom.xml do seu projeto:


    net.imagej
    ij
    1.51h

Você encontrará a versão mais recente emMaven repository.

3.2. Carregando uma imagem

Para carregar a imagem, você precisa usar o método estáticoopenImage(), da classeIJ:

ImagePlus imp = IJ.openImage("path/to/your/image.jpg");

3.3. Editando uma imagem

Para editar uma imagem, teremos que usar métodos do objetoImageProcessor anexado ao nosso objetoImagePlus. Pense nisso como o objetoGraphics em AWT:

ImageProcessor ip = imp.getProcessor();
ip.setColor(Color.BLUE);
ip.setLineWidth(4);
ip.drawRect(10, 10, imp.getWidth() - 20, imp.getHeight() - 20);

3.4. Exibindo uma imagem

Você só precisa chamar o métodoshow() do objetoImagePlus:

imp.show();

4. OpenIMAJ

O OpenIMAJ é um conjunto de bibliotecas Java focadas não apenas em visão computacional e processamento de vídeo, mas também em aprendizado de máquina, processamento de áudio, trabalhando com o Hadoop e muito mais. Todas as partes do projeto OpenIMAJ podem ser encontradashere, em “Módulos”. Precisamos apenas da parte de processamento de imagem.

4.1. Dependência do Maven

Para começar a trabalhar com o OpenIMAJ, basta adicionar uma dependência ao arquivo pom.xml de seu projeto:


    org.openimaj
    core-image
    1.3.5

Você encontrará a versão mais recentehere.

4.1. Carregando uma imagem

Para carregar uma imagem, use o métodoImageUtilities.readMBF():

MBFImage image = ImageUtilities.readMBF(new File("path/to/your/image.jpg"));

MBF significa imagem de ponto flutuante multibanda (RGB neste exemplo, mas não é a única maneira de representar cores).

4.2. Editando uma imagem

Para desenhar o retângulo, precisamos definir sua forma, que é um polígono composto por 4 pontos (superior esquerdo, inferior esquerdo, inferior direito, superior direito):

Point2d tl = new Point2dImpl(10, 10);
Point2d bl = new Point2dImpl(10, image.getHeight() - 10);
Point2d br = new Point2dImpl(image.getWidth() - 10, image.getHeight() - 10);
Point2d tr = new Point2dImpl(image.getWidth() - 10, 10);
Polygon polygon = new Polygon(Arrays.asList(tl, bl, br, tr));

Como você deve ter notado, no processamento da imagem o eixo Y é invertido. Depois de definir a forma, precisamos desenhá-la:

image.drawPolygon(polygon, 4, new Float[] { 0f, 0f, 255.0f });

O método de desenho leva 3 argumentos: forma, espessura da linha e valores do canal RGB representados pela matrizFloat.

4.3. Exibindo uma imagem

Precisamos usarDisplayUtilities:

DisplayUtilities.display(image);

5. TwelveMonkeysImageIO

A bibliotecaTwelveMonkeysImageIO pretende ser uma extensão da API JavaImageIO, com suporte para um número maior de formatos.

Na maioria das vezes, o código terá a mesma aparência do código Java interno, mas funcionará com formatos de imagem adicionais, após adicionar as dependências necessárias.

Por padrão, Java suporta apenas estes cinco formatos de imagens:JPEG,PNG,BMP,WEBMP,GIF.

Se tentarmos trabalhar com um arquivo de imagem em um formato diferente, nosso aplicativo não será capaz de lê-lo e irá lançar umNullPointerException ao acessar a variávelBufferedImage.

TwelveMonkeys adiciona suporte para os seguintes formatos:PNM,PSD,TIFF,HDR,IFF,PCX,PICT,SGI,TGA,ICNS,ICO,CUR,Thumbs.db,SVG,WMF.

To work with images in a specific format, we need to add the corresponding dependency, comoimageio-jpeg ouimageio-tiff.

Você pode encontrar a lista completa de dependências na documentaçãoTwelveMonkeys.

Vamos criar um exemplo que leia uma imagem.ico. O código terá a mesma aparência da seçãoAWT, exceto que abriremos uma imagem diferente:

String imagePath = "path/to/your/image.ico";
BufferedImage myPicture = ImageIO.read(new File(imagePath));

Para que este exemplo funcione, precisamos adicionar a dependênciaTwelveMonkeys que contém suporte para imagens.ico, que é a dependênciaimageio-bmp, junto com a dependênciaimageio-core:


    com.twelvemonkeys.imageio
    imageio-bmp
    3.3.2


    com.twelvemonkeys.imageio
    imageio-core
    3.3.2

E isso é tudo! The built-in ImageIO Java API loads the plugins automatically at runtime. Agora nosso projeto funcionará com imagens.ico também.

6. Sumário

Você foi apresentado a 4 bibliotecas que podem ajudá-lo a trabalhar com imagens. Indo além, convém procurar alguns algoritmos de processamento de imagem, como extrair bordas, aprimorar contraste, usar filtros ou detecção de rosto.

Para esses fins, pode ser melhor começar a aprender o ImageJ ou o OpenIMAJ. Ambos são fáceis de incluir em um projeto e são muito mais poderosos que o AWT em relação ao processamento de imagens.

Esses exemplos de processamento de imagem podem ser encontrados emthe GitHub project.