Werken met afbeeldingen in Java

1. Overzicht

In deze zelfstudie gaan we een paar beschikbare beeldverwerkingsbibliotheken bekijken en een eenvoudige beeldverwerkingsbewerking uitvoeren - een afbeelding laden en er een vorm op tekenen.

We zullen de AWT-bibliotheek (en een beetje Swing), ImageJ, OpenIMAJ en TwelveMonkeys uitproberen.

2. AWT

AWT is een ingebouwde Java-bibliotheek waarmee een gebruiker eenvoudige bewerkingen met betrekking tot weergave kan uitvoeren, zoals het maken van een venster, het definiëren van knoppen en luisteraars, enzovoort. Het bevat ook methoden waarmee een gebruiker afbeeldingen kan bewerken. Het vereist geen installatie omdat het wordt geleverd met Java.

2.1. Een afbeelding laden

Het eerste is om een BufferedImage object van een afbeelding die is opgeslagen op onze schijf:

String imagePath = "pad / naar / uw / afbeelding.jpg"; BufferedImage myPicture = ImageIO.read (nieuw bestand (imagePath)); 

2.2. Bewerken van een afbeelding

Om een ​​vorm op een afbeelding te tekenen, zullen we moeten gebruiken Grafische afbeeldingen object gerelateerd aan geladen afbeelding. Grafische afbeeldingen object omvat eigenschappen die nodig zijn voor het uitvoeren van elementaire renderingbewerkingen. Grafische 2D is een klasse die zich uitbreidt Grafische afbeeldingen. Het biedt meer controle over tweedimensionale vormen.

In dit specifieke geval hebben we nodig Graphic2D om de vormbreedte uit te breiden om deze duidelijk zichtbaar te maken. We bereiken het door zijn s te vergrotentroke eigendom. Vervolgens stellen we een kleur in en tekenen we een rechthoek op zo'n manier dat de vorm tien px verwijderd is van de afbeeldingsranden:

Graphics2D g = (Graphics2D) myPicture.getGraphics (); g.setStroke (nieuwe BasicStroke (3)); g.setColor (Color.BLUE); g.drawRect (10, 10, myPicture.getWidth () - 20, myPicture.getHeight () - 20); 

2.3. Een afbeelding weergeven

Nu we iets op onze afbeelding hebben getekend, willen we het graag laten zien. We kunnen het doen met behulp van Swing-bibliotheekobjecten. Eerst creëren we JLabel object dat een weergavegebied voor tekst en / en afbeelding vertegenwoordigt:

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

Voeg dan onze JLabel naar JPanel, die we kunnen behandelen als van op Java gebaseerde GUI:

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

Uiteindelijk voegen we alles toe aan JFrame dat is een venster dat op een scherm wordt weergegeven. We moeten de grootte instellen zodat we dit venster niet elke keer dat we ons programma uitvoeren, hoeven uit te vouwen:

JFrame f = nieuw JFrame (); f.setSize (nieuwe dimensie (myPicture.getWidth (), myPicture.getHeight ())); f.add (jPanel); f.setVisible (true);

3. ImageJ

ImageJ is een op Java gebaseerde software die is gemaakt om met afbeeldingen te werken. Het heeft nogal wat plug-ins, die hier beschikbaar zijn. We zullen alleen de API gebruiken, omdat we de verwerking zelf willen uitvoeren.

Het is een behoorlijk krachtige bibliotheek, beter dan Swing en AWT, omdat het doel was om afbeeldingen te verwerken en niet om GUI-bewerkingen. Plug-ins bevatten veel gratis te gebruiken algoritmen, wat een goede zaak is als we beeldverwerking willen leren en snel de resultaten willen zien, in plaats van wiskundige en optimalisatieproblemen op te lossen die onder IP-algoritmen liggen.

3.1. Afhankelijkheid van Maven

Om met ImageJ te gaan werken, voegt u eenvoudig een afhankelijkheid toe aan uw project pom.xml het dossier:

 net.imagej ij 1.51h 

Je vindt de nieuwste versie in de Maven-repository.

3.2. Een afbeelding laden

Om de afbeelding te laden, moet u de openImage () statische methode, van IJ klasse:

ImagePlus imp = IJ.openImage ("pad / naar / uw / afbeelding.jpg");

3.3. Bewerken van een afbeelding

Om een ​​afbeelding te bewerken, zullen we methoden moeten gebruiken van ImageProcessor object gehecht aan onze ImagePlus voorwerp. Beschouw het als ongeveer Grafische afbeeldingen object 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. Een afbeelding weergeven

U hoeft alleen maar te bellen tonen() methode van ImagePlus voorwerp:

imp.show ();

4. OpenIMAJ

OpenIMAJ is een set Java-bibliotheken die niet alleen gericht zijn op computervisie en videoverwerking, maar ook op machine learning, audioverwerking, werken met Hadoop en nog veel meer. Alle onderdelen van het OpenIMAJ-project zijn hier te vinden, onder 'Modules'. We hebben alleen het beeldverwerkingsgedeelte nodig.

4.1. Afhankelijkheid van Maven

Om met OpenIMAJ te gaan werken, voegt u eenvoudig een afhankelijkheid toe aan uw project pom.xml het dossier:

 org.openimaj core-image 1.3.5 

De laatste release vind je hier.

4.1. Een afbeelding laden

Gebruik om een ​​afbeelding te laden ImageUtilities.readMBF () methode:

MBFImage afbeelding = ImageUtilities.readMBF (nieuw bestand ("pad / naar / uw / afbeelding.jpg")); 

MBF staat voor de multiband-afbeelding met drijvende komma (RGB in dit voorbeeld, maar het is niet de enige manier om kleuren weer te geven).

4.2. Bewerken van een afbeelding

Om de rechthoek te tekenen, moeten we de vorm ervan definiëren, een polygoon bestaande uit 4 punten (linksboven, linksonder, rechtsonder, rechtsboven):

Point2d tl = nieuwe Point2dImpl (10, 10); Point2d bl = nieuwe Point2dImpl (10, image.getHeight () - 10); Point2d br = nieuwe Point2dImpl (image.getWidth () - 10, image.getHeight () - 10); Point2d tr = nieuwe Point2dImpl (image.getWidth () - 10, 10); Veelhoek veelhoek = nieuwe veelhoek (Arrays.asList (tl, bl, br, tr));

Zoals je misschien hebt opgemerkt, is bij beeldverwerking de Y-as omgekeerd. Nadat we de vorm hebben gedefinieerd, moeten we deze tekenen:

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

Tekenmethode heeft 3 argumenten: vorm, lijndikte en RGB-kanaalwaarden vertegenwoordigd door Vlotter array.

4.3. Een afbeelding weergeven

We moeten gebruiken DisplayUtilities:

DisplayUtilities.display (afbeelding);

5. TwelveMonkeysImageIO

De TwelveMonkeysImageIO bibliotheek is bedoeld als een uitbreiding op de Java ImageIO API, met ondersteuning voor een groter aantal formaten.

Meestal ziet de code er hetzelfde uit als de ingebouwde Java-code, maar werkt deze met aanvullende afbeeldingsindelingen, na het toevoegen van de nodige afhankelijkheden.

Standaard ondersteunt Java alleen deze vijf indelingen voor afbeeldingen: Jpeg, PNG, BMP, WEBMP, GIF.

Als we proberen te werken met een afbeeldingsbestand in een ander formaat, kan onze applicatie het niet lezen en wordt een NullPointerException bij het openen van het BufferedImage variabele.

TwelveMonkeys voegt ondersteuning toe voor de volgende formaten: PNM, PSD, TIFF, HDR, IFF, PCX, PICT, SGI, TGA, ICNS, ICO, CUR, Thumbs.db, SVG, WMF.

Om met afbeeldingen in een specifiek formaat te werken, moeten we de bijbehorende afhankelijkheid toevoegen, zoals imageio-jpeg of imageio-tiff.

U kunt de volledige lijst met afhankelijkheden vinden in de TwelveMonkeys-documentatie.

Laten we een voorbeeld maken dat een .ico beeld. De code ziet er hetzelfde uit als de AWT sectie, behalve dat we een andere afbeelding openen:

String imagePath = "pad / naar / uw / image.ico"; BufferedImage myPicture = ImageIO.read (nieuw bestand (imagePath));

Om dit voorbeeld te laten werken, moeten we de extensie TwelveMonkeys afhankelijkheid die ondersteuning biedt voor .ico images, wat de imageio-bmp-afhankelijkheid is, samen met de imageio-core-afhankelijkheid:

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

En dit is alles! De ingebouwde ImageIO Java API laadt de plug-ins automatisch tijdens runtime. Nu zal ons project werken .ico afbeeldingen ook.

6. Samenvatting

U heeft kennis gemaakt met 4 bibliotheken die u kunnen helpen bij het werken met afbeeldingen. Als u verder gaat, wilt u misschien op zoek gaan naar een aantal algoritmen voor beeldverwerking, zoals het extraheren van randen, het verbeteren van het contrast, het gebruik van filters of gezichtsherkenning.

Voor die doeleinden is het misschien beter om ImageJ of OpenIMAJ te leren. Beide zijn gemakkelijk in een project op te nemen en zijn veel krachtiger dan AWT wat betreft beeldverwerking.

Deze voorbeelden van beeldverwerking zijn te vinden in het GitHub-project.