Arbeiten mit Images in Java

Arbeiten mit Bildern in Java

1. Überblick

In diesem Tutorial werfen wir einen Blick auf einige verfügbare Bildbibliotheken und führen einfache Bildverarbeitungsoperationen durch: 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 Anzeigevorgänge 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

Das erste ist, einBufferedImage-Objekt aus einem Bild zu erstellen, 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 ein Bild zu zeichnen, müssen wir das ObjektGraphicsverwenden, das sich auf das geladene Bild bezieht. Das Objekt vonGraphicskapselt Eigenschaften, die zum Ausführen grundlegender Rendervorgänge erforderlich sind. Graphics2D ist eine Klasse, dieGraphics erweitert. Es bietet mehr Kontrolle über zweidimensionale Formen.

In diesem speziellen Fall benötigen wirGraphic2D, um die Formbreite zu erweitern und sie deutlich sichtbar zu machen. Wir erreichen es, indem wir die Eigenschaft strokeerhöhen. 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 dies mit Swing-Bibliotheksobjekten tun. Zuerst erstellen wir das ObjektJLabel, das einen Anzeigebereich für Text oder / und Bild darstellt:

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

Fügen Sie dann unsereJLabel zuJPanel hinzu, die wir als<div></div> der Java-basierten GUI behandeln können:

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

Am Ende fügen wir alles zuJFrame 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 hat ziemlich viele Plugins,here verfügbar. 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 frei zu verwendende Algorithmen. Dies ist eine gute Sache, wenn wir die Bildverarbeitung erlernen und die Ergebnisse schnell sehen möchten, anstatt mathematische und Optimierungsprobleme zu lösen, die unter IP-Algorithmen liegen.

3.1. Maven-Abhängigkeit

Fügen Sie einfach eine Abhängigkeit zurpom.xml-Datei Ihres Projekts hinzu, um mit ImageJ zu arbeiten:


    net.imagej
    ij
    1.51h

Die neueste Version finden Sie inMaven repository.

3.2. Laden eines Bildes

Um das Bild zu laden, müssen Sie die statische MethodeopenImage()aus der KlasseIJverwenden:

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 ObjektImageProcessorverwenden, das an das ObjektImagePlusangehängt ist. Stellen Sie sich das alsGraphics Objekt 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 Methode vonshow()für das Objekt vonImagePlusaufrufen:

imp.show();

4. OpenIMAJ

OpenIMAJ besteht aus 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 unterhere unter „Module“. Wir brauchen nur den Bildverarbeitungsteil.

4.1. Maven-Abhängigkeit

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


    org.openimaj
    core-image
    1.3.5

Sie finden die neueste Versionhere.

4.1. Laden eines Bildes

Verwenden Sie zum Laden eines Bildes die MethodeImageUtilities.readMBF():

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

MBF steht für das Multiband-Gleitkommabild (in diesem Beispiel RGB, aber es ist nicht die einzige Möglichkeit, Farben darzustellen).

4.2. Bearbeiten eines Bildes

Um das Rechteck zu zeichnen, müssen wir seine Form definieren, die aus 4 Punkten besteht (oben links, unten links, unten rechts, oben rechts):

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

Wie Sie vielleicht bemerkt haben, ist die Y-Achse in der Bildverarbeitung umgekehrt. Nachdem wir die Form definiert haben, müssen wir sie zeichnen:

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

Die Zeichenmethode verwendet drei Argumente: Form, Liniendicke und RGB-Kanalwerte, dargestellt durch das Array vonFloat.

4.3. Ein Bild anzeigen

Wir müssenDisplayUtilities verwenden:

DisplayUtilities.display(image);

5. TwelveMonkeysImageIO

DieTwelveMonkeysImageIO-Bibliothek ist als Erweiterung der JavaImageIO-API gedacht und unterstützt eine größere Anzahl von Formaten.

In den meisten Fällen sieht der Code genauso aus wie der integrierte Java-Code, funktioniert jedoch mit zusätzlichen Bildformaten, nachdem die erforderlichen Abhängigkeiten hinzugefügt wurden.

Standardmäßig unterstützt Java nur diese fünf Formate für Bilder:JPEG,PNG,BMP,WEBMP,GIF.

Wenn wir versuchen, mit einer Bilddatei in einem anderen Format zu arbeiten, kann unsere Anwendung diese nicht lesen und gibt beim Zugriff auf die VariableBufferedImageNullPointerException aus.

TwelveMonkeys fügt Unterstützungen für die folgenden Formate hinzu: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, wieimageio-jpeg oderimageio-tiff.

Die vollständige Liste der Abhängigkeiten finden Sie in der Dokumentation zuTwelveMonkeys.

Erstellen wir ein Beispiel, das das Bild eines.icoliest. Der Code sieht genauso aus wie der AbschnittAWT, außer dass wir ein anderes Bild öffnen:

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

Damit dieses Beispiel funktioniert, müssen wir die Abhängigkeit vonTwelveMonkeyshinzufügen, die Unterstützung für.ico Bilder enthält. Dies ist die Abhängigkeit vonimageio-bmp, zusammen mit der Abhängigkeit vonimageio-core:


    com.twelvemonkeys.imageio
    imageio-bmp
    3.3.2


    com.twelvemonkeys.imageio
    imageio-core
    3.3.2

Und das ist alles! The built-in ImageIO Java API loads the plugins automatically at runtime. Jetzt funktioniert unser Projekt auch mit.ico Bildern.

6. Zusammenfassung

Sie haben 4 Bibliotheken kennengelernt, die Ihnen beim Arbeiten mit Bildern helfen können. Wenn Sie weiter gehen, möchten Sie möglicherweise nach einigen Bildverarbeitungsalgorithmen suchen, z. B. Kanten extrahieren, den Kontrast verbessern, Filter oder Gesichtserkennung verwenden.

Für diese Zwecke ist es möglicherweise besser, mit dem Erlernen von ImageJ oder OpenIMAJ zu beginnen. Beide lassen sich leicht in ein Projekt einbinden und sind in Bezug auf die Bildverarbeitung viel leistungsfähiger als AWT.

Diese Bildverarbeitungsbeispiele finden Sie inthe GitHub project.