Arbeiten mit Bildern in Java

1. Übersicht

In diesem Tutorial werden wir uns einige verfügbare Bildverarbeitungsbibliotheken ansehen und eine einfache Bildverarbeitungsoperation ausführen - Laden eines Bildes und Zeichnen einer Form darauf.

Wir werden die AWT-Bibliothek (und ein bisschen Swing), ImageJ, OpenIMAJ und TwelveMonkeys ausprobieren.

2. AWT

AWT ist eine integrierte Java-Bibliothek, mit der ein Benutzer einfache Vorgänge im Zusammenhang mit der Anzeige ausführen kann, z. B. das Erstellen eines Fensters, das Definieren von Schaltflächen und Listenern usw. Es enthält auch Methoden, mit denen ein Benutzer Bilder bearbeiten kann. Es ist keine Installation erforderlich, da es mit Java geliefert wird.

2.1. Laden eines Bildes

Als erstes erstellen Sie ein BufferedImage- Objekt aus einem Bild, das auf unserem Laufwerk gespeichert ist:

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

2.2. Bearbeiten eines Bildes

Um eine Form auf einem Bild zu zeichnen, müssen wir verwenden Graphics Objekt geladenes Bild zusammen. Das Grafikobjekt kapselt Eigenschaften, die zum Ausführen grundlegender Rendervorgänge erforderlich sind. Graphics2D ist eine Klasse, die Graphics erweitert . Es bietet mehr Kontrolle über zweidimensionale Formen.

In diesem speziellen Fall benötigen wir Graphic2D , um die Formbreite zu erweitern und sie deutlich sichtbar zu machen. Wir erreichen dies durch die Erhöhung des Troke- Eigentums. Dann setzen wir eine Farbe und zeichnen ein Rechteck so, dass die Form zehn Pixel von den Bildrändern entfernt ist:

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. Ein Bild anzeigen

Nachdem wir etwas auf unser Bild gezeichnet haben, möchten wir es anzeigen. Wir können es mit Swing-Bibliotheksobjekten tun. Zuerst erstellen wir ein JLabel- Objekt, das einen Anzeigebereich für Text oder / und Bild darstellt:

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

Fügen Sie dann unser JLabel zu JPanel hinzu , das wir als behandeln können der Java-basierten GUI:

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

Am Ende fügen wir alles zu JFrame hinzu, das auf einem Bildschirm angezeigt wird. Wir müssen die Größe festlegen, damit wir dieses Fenster nicht jedes Mal erweitern müssen, wenn wir unser Programm ausführen:

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

3. ImageJ

ImageJ ist eine Java-basierte Software, die für die Arbeit mit Bildern entwickelt wurde. Es gibt ziemlich viele Plugins, die hier verfügbar sind. Wir werden nur API verwenden, da wir die Verarbeitung selbst durchführen möchten.

Es ist eine ziemlich leistungsfähige Bibliothek, besser als Swing und AWT, da der Erstellungszweck die Bildverarbeitung und nicht die GUI-Operationen war. Plugins enthalten viele kostenlos zu verwendende Algorithmen. Dies ist eine gute Sache, wenn wir die Bildverarbeitung lernen und die Ergebnisse schnell sehen möchten, anstatt mathematische und Optimierungsprobleme zu lösen, die unter IP-Algorithmen liegen.

3.1. Maven-Abhängigkeit

Um mit ImageJ zu arbeiten, fügen Sie einfach eine Abhängigkeit zur pom.xml- Datei Ihres Projekts hinzu :

 net.imagej ij 1.51h 

Sie finden die neueste Version im Maven-Repository.

3.2. Laden eines Bildes

Um das Bild zu laden, müssen Sie die statische Methode openImage () aus der IJ- Klasse verwenden:

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

3.3. Bearbeiten eines Bildes

Um ein Bild zu bearbeiten, müssen wir Methoden aus dem ImageProcessor- Objekt verwenden, die an unser ImagePlus- Objekt angehängt sind . Stellen Sie sich das als Grafikobjekt in AWT vor:

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

3.4. Ein Bild anzeigen

Sie müssen nur die show () -Methode des ImagePlus- Objekts aufrufen :

imp.show();

4. OpenIMAJ

OpenIMAJ besteht aus einer Reihe von Java-Bibliotheken, die sich nicht nur auf Computer Vision und Videoverarbeitung konzentrieren, sondern auch auf maschinelles Lernen, Audioverarbeitung, die Arbeit mit Hadoop und vieles mehr. Alle Teile des OpenIMAJ-Projekts finden Sie hier unter "Module". Wir brauchen nur den Bildverarbeitungsteil.

4.1. Maven-Abhängigkeit

Um mit OpenIMAJ zu arbeiten, fügen Sie einfach eine Abhängigkeit zur pom.xml- Datei Ihres Projekts hinzu :

 org.openimaj core-image 1.3.5 

Die neueste Version finden Sie hier.

4.1. Laden eines Bildes

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

Sie haben 4 Bibliotheken kennengelernt, mit denen Sie mit Bildern arbeiten können. Wenn Sie noch weiter gehen, möchten Sie möglicherweise nach Bildverarbeitungsalgorithmen suchen, z. B. Kanten extrahieren, Kontrast verbessern, Filter verwenden oder Gesichtserkennung.

Für diese Zwecke ist es möglicherweise besser, ImageJ oder OpenIMAJ zu lernen. Beide sind einfach in ein Projekt aufzunehmen und in Bezug auf die Bildverarbeitung viel leistungsfähiger als AWT.

Diese Bildverarbeitungsbeispiele finden Sie im GitHub-Projekt.