Lavorare con le immagini in Java

1. Panoramica

In questo tutorial, daremo un'occhiata ad alcune librerie di elaborazione delle immagini disponibili ed eseguiremo una semplice operazione di elaborazione delle immagini, caricando un'immagine e disegnandovi una forma.

Proveremo la libreria AWT (e un po 'di Swing), ImageJ, OpenIMAJ e TwelveMonkeys.

2. AWT

AWT è una libreria Java incorporata che consente a un utente di eseguire semplici operazioni relative alla visualizzazione, come la creazione di una finestra, la definizione di pulsanti e listener e così via. Include anche metodi che consentono a un utente di modificare le immagini. Non richiede installazione poiché viene fornito con Java.

2.1. Caricamento di un'immagine

La prima cosa è creare un oggetto BufferedImage da un'immagine salvata sul nostro disco rigido:

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

2.2. Modifica di un'immagine

Per disegnare una forma su un'immagine, dovremo utilizzare l' oggetto Graphics relativo all'immagine caricata. L' oggetto Graphics incapsula le proprietà necessarie per eseguire operazioni di rendering di base. Graphics2D è una classe che estende Graphics . Fornisce un maggiore controllo sulle forme bidimensionali.

In questo caso particolare, abbiamo bisogno di Graphic2D per estendere la larghezza della forma per renderla chiaramente visibile. Lo otteniamo aumentando la sua proprietà di trota . Quindi impostiamo un colore e disegniamo un rettangolo in modo tale che la forma sarà a dieci px dai bordi dell'immagine:

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. Visualizzazione di un'immagine

Ora che abbiamo disegnato qualcosa sulla nostra immagine, vorremmo visualizzarlo. Possiamo farlo usando gli oggetti della libreria Swing. Per prima cosa, creiamo un oggetto JLabel che rappresenta un'area di visualizzazione per testo o / e immagine:

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

Quindi aggiungi la nostra JLabel a JPanel , che possiamo trattare come della GUI basata su Java:

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

Alla fine, aggiungiamo tutto a JFrame che è la finestra visualizzata su uno schermo. Dobbiamo impostare la dimensione in modo da non dover espandere questa finestra ogni volta che eseguiamo il nostro programma:

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

3. ImmagineJ

ImageJ è un software basato su Java creato per lavorare con le immagini. Ha un bel po 'di plugin, disponibili qui. Utilizzeremo solo API, poiché vogliamo eseguire l'elaborazione da soli.

È una libreria abbastanza potente, migliore di Swing e AWT, poiché lo scopo della creazione era l'elaborazione delle immagini e non le operazioni con la GUI. I plugin contengono molti algoritmi gratuiti, che è una buona cosa quando vogliamo imparare l'elaborazione delle immagini e vedere rapidamente i risultati, piuttosto che risolvere i problemi di matematica e ottimizzazione che si trovano sotto algoritmi IP.

3.1. Dipendenza da Maven

Per iniziare a lavorare con ImageJ, aggiungi semplicemente una dipendenza al file pom.xml del tuo progetto :

 net.imagej ij 1.51h 

Troverai la versione più recente nel repository Maven.

3.2. Caricamento di un'immagine

Per caricare l'immagine, è necessario utilizzare il metodo statico openImage () , dalla classe IJ :

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

3.3. Modifica di un'immagine

Per modificare un'immagine, dovremo utilizzare metodi dall'oggetto ImageProcessor allegato al nostro oggetto ImagePlus . Consideralo come un oggetto grafico in AWT:

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

3.4. Visualizzazione di un'immagine

Devi solo chiamare il metodo show () dell'oggetto ImagePlus :

imp.show();

4. OpenIMAJ

OpenIMAJ è un insieme di librerie Java incentrate non solo sulla visione artificiale e l'elaborazione video, ma anche sull'apprendimento automatico, l'elaborazione audio, il lavoro con Hadoop e molto altro. Tutte le parti del progetto OpenIMAJ possono essere trovate qui, sotto "Moduli". Abbiamo bisogno solo della parte di elaborazione delle immagini.

4.1. Dipendenza da Maven

Per iniziare a lavorare con OpenIMAJ, aggiungi semplicemente una dipendenza al file pom.xml del tuo progetto :

 org.openimaj core-image 1.3.5 

Qui troverai l'ultima versione.

4.1. Caricamento di un'immagine

To load an image, use ImageUtilities.readMBF() method:

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

MBF stands for the multiband floating-point image (RGB in this example, but it's not the only way to represent colors).

4.2. Editing an Image

To draw the rectangle, we need to define its shape which is polygon consisting of 4 points (top left, bottom left, bottom right, top right):

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));

As you might have noticed, in image processing Y-axis is reversed. After defining the shape, we need to draw it:

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

Drawing method takes 3 arguments: shape, line thickness and RGB channel values represented by Float array.

4.3. Displaying an Image

We need to use DisplayUtilities:

DisplayUtilities.display(image);

5. TwelveMonkeysImageIO

The TwelveMonkeysImageIO library is intended as an extension to the Java ImageIO API, with support for a larger number of formats.

Most of the time, the code will look the same as the built-in Java code, but it will function with additional image formats, after adding the necessary dependencies.

By default, Java supports only these five formats for images: JPEG, PNG, BMP, WEBMP, GIF.

If we attempt to work with an image file in a different format, our application will not be able to read it and will throw a NullPointerException when accessing the BufferedImage variable.

TwelveMonkeys adds supports for the following formats: 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, such as imageio-jpeg or imageio-tiff.

You can find the full list of dependencies in the TwelveMonkeys documentation.

Let's create an example that reads a .ico image. The code will look the same as the AWT section, except we will open a different image:

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

For this example to work, we need to add the TwelveMonkeys dependency that contains support for .ico images, which is the imageio-bmp dependency, along with the imageio-core dependency:

 com.twelvemonkeys.imageio imageio-bmp 3.3.2   com.twelvemonkeys.imageio imageio-core 3.3.2 

And this is all! The built-in ImageIO Java API loads the plugins automatically at runtime. Now our project will work with .ico images as well.

6. Summary

Sei stato introdotto a 4 librerie che possono aiutarti a lavorare con le immagini. Andando oltre, potresti voler cercare alcuni algoritmi di elaborazione delle immagini, come l'estrazione dei bordi, il miglioramento del contrasto, l'uso di filtri o il rilevamento dei volti.

A tal fine, potrebbe essere meglio iniziare a imparare ImageJ o OpenIMAJ. Entrambi sono facili da includere in un progetto e sono molto più potenti di AWT per quanto riguarda l'elaborazione delle immagini.

Questi esempi di elaborazione delle immagini possono essere trovati nel progetto GitHub.