Travailler avec des images en Java

1. Vue d'ensemble

Dans ce didacticiel, nous allons examiner quelques bibliothèques de traitement d'image disponibles et effectuer une opération de traitement d'image simple - charger une image et dessiner une forme dessus.

Nous allons essayer la bibliothèque AWT (et un peu de Swing), ImageJ, OpenIMAJ et TwelveMonkeys.

2. AWT

AWT est une bibliothèque Java intégrée qui permet à un utilisateur d'effectuer des opérations simples liées à l'affichage, comme la création d'une fenêtre, la définition de boutons et d'écouteurs, etc. Il comprend également des méthodes qui permettent à un utilisateur de modifier des images. Il ne nécessite pas d'installation car il est livré avec Java.

2.1. Chargement d'une image

La première chose à faire est de créer un objet BufferedImage à partir d'une image enregistrée sur notre lecteur de disque:

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

2.2. Édition d'une image

Pour dessiner une forme sur une image, nous devrons utiliser l' objet Graphics lié à l'image chargée. L' objet graphique encapsule les propriétés nécessaires pour effectuer les opérations de rendu de base. Graphics2D est une classe étendant Graphics . Il offre plus de contrôle sur les formes bidimensionnelles.

Dans ce cas particulier, nous avons besoin de Graphic2D pour étendre la largeur de la forme pour la rendre clairement visible. Nous y parvenons en augmentant sa propriété troke . Ensuite, nous définissons une couleur et dessinons un rectangle de telle sorte que la forme soit à dix px des bordures de l'image:

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. Affichage d'une image

Maintenant que nous avons dessiné quelque chose sur notre image, nous aimerions l'afficher. Nous pouvons le faire en utilisant les objets de la bibliothèque Swing. Tout d'abord, nous créons un objet JLabel qui représente une zone d'affichage pour le texte ou / et l'image:

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

Ajoutez ensuite notre JLabel à JPanel , que nous pouvons traiter comme de l'interface graphique basée sur Java:

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

En fin de compte, nous ajoutons tout à JFrame qui est une fenêtre affichée sur un écran. Nous devons définir la taille pour ne pas avoir à agrandir cette fenêtre à chaque fois que nous exécutons notre programme:

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

3. ImageJ

ImageJ est un logiciel basé sur Java créé pour travailler avec des images. Il a pas mal de plugins, disponibles ici. Nous n'utiliserons que l'API, car nous souhaitons effectuer nous-mêmes le traitement.

C'est une bibliothèque assez puissante, meilleure que Swing et AWT, car son but de création était le traitement d'image et non les opérations GUI. Les plugins contiennent de nombreux algorithmes gratuits, ce qui est une bonne chose lorsque nous voulons apprendre le traitement d'image et voir rapidement les résultats, plutôt que de résoudre des problèmes de mathématiques et d'optimisation sous des algorithmes IP.

3.1. Dépendance de Maven

Pour commencer à travailler avec ImageJ, ajoutez simplement une dépendance au fichier pom.xml de votre projet :

 net.imagej ij 1.51h 

Vous trouverez la dernière version dans le référentiel Maven.

3.2. Chargement d'une image

Pour charger l'image, vous devez utiliser la méthode statique openImage () , de la classe IJ :

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

3.3. Édition d'une image

Pour éditer une image, nous devrons utiliser les méthodes de l' objet ImageProcessor attaché à notre objet ImagePlus . Pensez-y comme à un objet graphique dans AWT:

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

3.4. Affichage d'une image

Il vous suffit d'appeler la méthode show () de l' objet ImagePlus :

imp.show();

4. OpenIMAJ

OpenIMAJ est un ensemble de bibliothèques Java axées non seulement sur la vision par ordinateur et le traitement vidéo, mais également sur l'apprentissage automatique, le traitement audio, l'utilisation de Hadoop et bien plus encore. Toutes les parties du projet OpenIMAJ se trouvent ici, sous «Modules». Nous n'avons besoin que de la partie traitement d'image.

4.1. Dépendance de Maven

Pour commencer à travailler avec OpenIMAJ, ajoutez simplement une dépendance au fichier pom.xml de votre projet :

 org.openimaj core-image 1.3.5 

Vous trouverez la dernière version ici.

4.1. Chargement d'une image

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

Vous avez été présenté à 4 bibliothèques qui peuvent vous aider à travailler avec des images. Pour aller plus loin, vous voudrez peut-être rechercher des algorithmes de traitement d'image, tels que l'extraction des bords, l'amélioration du contraste, l'utilisation de filtres ou la détection de visage.

À ces fins, il serait peut-être préférable de commencer à apprendre ImageJ ou OpenIMAJ. Les deux sont faciles à inclure dans un projet et sont beaucoup plus puissants que AWT en matière de traitement d'image.

Ces exemples de traitement d'image se trouvent dans le projet GitHub.