Travailler avec des images en Java

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 y dessiner une forme.

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, telles que la création d'une fenêtre, la définition de boutons et d'écouteurs, etc. Il inclut également des méthodes permettant à un utilisateur de modifier des images. Il ne nécessite aucune installation car il est livré avec Java.

2.1. Chargement d'une image

La première chose est de créer un objetBufferedImage à 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'objetGraphics lié à l'image chargée. L'objetGraphics encapsule les propriétés nécessaires pour effectuer les opérations de rendu de base. Graphics2D est une classe étendantGraphics. Il offre plus de contrôle sur les formes en deux dimensions.

Dans ce cas particulier, nous avons besoin deGraphic2D pour étendre la largeur de la forme pour la rendre clairement visible. Nous y parvenons en augmentant sa propriété stroke. Ensuite, nous définissons une couleur et dessinons un rectangle de telle sorte que la forme soit à dix pixels 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 des objets de la bibliothèque Swing. Tout d'abord, nous créons l'objetJLabel qui représente une zone d'affichage pour le texte ou / et l'image:

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

Ajoutez ensuite nosJLabel àJPanel, que nous pouvons traiter comme des<div></div> de l'interface graphique Java:

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

À la fin, 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, disponibleshere. Nous n'utiliserons que l'API, car nous souhaitons effectuer le traitement nous-mêmes.

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 libres d’utilisation, 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 mathématiques et d’optimisation posés sous des algorithmes IP.

3.1. Dépendance Maven

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


    net.imagej
    ij
    1.51h

Vous trouverez la dernière version dans lesMaven repository.

3.2. Chargement d'une image

Pour charger l'image, vous devez utiliser la méthode statiqueopenImage(), de la classeIJ:

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'objetImageProcessor attaché à notre objetImagePlus. Considérez-le comme un objetGraphics 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éthodeshow() de l'objetImagePlus:

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 trouventhere, sous «Modules». Nous n'avons besoin que de la partie traitement d'image.

4.1. Dépendance 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 versionhere.

4.1. Chargement d'une image

Pour charger une image, utilisez la méthodeImageUtilities.readMBF():

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

MBF signifie l'image à virgule flottante multibande (RVB dans cet exemple, mais ce n'est pas le seul moyen de représenter les couleurs).

4.2. Édition d'une image

Pour dessiner le rectangle, nous devons définir sa forme qui est un polygone composé de 4 points (en haut à gauche, en bas à gauche, en bas à droite, en haut à droite):

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

Comme vous l'avez peut-être remarqué, l'axe Y est inversé dans le traitement des images. Après avoir défini la forme, nous devons la dessiner:

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

La méthode de dessin prend 3 arguments: la forme, l'épaisseur de la ligne et les valeurs de canal RVB représentées par le tableauFloat.

4.3. Affichage d'une image

Nous devons utiliserDisplayUtilities:

DisplayUtilities.display(image);

5. TwelveMonkeysImageIO

La bibliothèqueTwelveMonkeysImageIO est conçue comme une extension de l'API JavaImageIO, avec prise en charge d'un plus grand nombre de formats.

La plupart du temps, le code aura le même aspect que le code Java intégré, mais il fonctionnera avec des formats d'image supplémentaires, après avoir ajouté les dépendances nécessaires.

Par défaut, Java ne prend en charge que ces cinq formats d'images:JPEG,PNG,BMP,WEBMP,GIF.

Si nous essayons de travailler avec un fichier image dans un format différent, notre application ne pourra pas le lire et lancera unNullPointerException lors de l'accès à la variableBufferedImage.

TwelveMonkeys ajoute la prise en charge des formats suivants: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, commeimageio-jpeg ouimageio-tiff.

Vous pouvez trouver la liste complète des dépendances dans la documentation deTwelveMonkeys.

Créons un exemple qui lit une image.ico. Le code aura le même aspect que la sectionAWT, sauf que nous ouvrirons une image différente:

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

Pour que cet exemple fonctionne, nous devons ajouter la dépendanceTwelveMonkeys qui contient la prise en charge des images.ico, qui est la dépendanceimageio-bmp, ainsi que la dépendanceimageio-core:


    com.twelvemonkeys.imageio
    imageio-bmp
    3.3.2


    com.twelvemonkeys.imageio
    imageio-core
    3.3.2

Et c'est tout! The built-in ImageIO Java API loads the plugins automatically at runtime. Maintenant, notre projet fonctionnera également avec les images.ico.

6. Sommaire

Vous avez découvert 4 bibliothèques qui peuvent vous aider à travailler avec des images. Pour aller plus loin, vous pouvez rechercher des algorithmes de traitement d'images, tels que l'extraction des contours, 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 ce qui concerne le traitement des images.

Ces exemples de traitement d'image se trouvent dansthe GitHub project.