Arbeide med bilder i Java

1. Oversikt

I denne opplæringen skal vi ta en titt på noen tilgjengelige bildebehandlingsbiblioteker, og utføre enkel bildebehandlingsoperasjon - laste et bilde og tegne en form på det.

Vi prøver AWT (og litt Swing) bibliotek, ImageJ, OpenIMAJ og TwelveMonkeys.

2. AWT

AWT er et innebygd Java-bibliotek som lar brukeren utføre enkle operasjoner relatert til visning, som å lage et vindu, definere knapper og lyttere og så videre. Det inkluderer også metoder som lar brukeren redigere bilder. Det krever ikke installasjon siden det leveres med Java.

2.1. Laster inn et bilde

Det første er å lage en BufferedImage objekt fra et bilde lagret på diskstasjonen vår:

String imagePath = "sti / til / din / image.jpg"; BufferedImage myPicture = ImageIO.read (ny fil (imagePath)); 

2.2. Redigere et bilde

For å tegne en form på et bilde, må vi bruke Grafikk objekt relatert til lastet bilde. Grafikk objektet innkapsler egenskapene som trengs for å utføre grunnleggende gjengivelsesoperasjoner. Grafikk2D er en klasse som utvider seg Grafikk. Det gir mer kontroll over todimensjonale former.

I dette spesielle tilfellet trenger vi Grafisk2D å utvide formbredden slik at den blir godt synlig. Vi oppnår det ved å øke dets stroke eiendom. Deretter setter vi en farge og tegner et rektangel på en slik måte at formen vil være ti px fra bildekanter:

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

2.3. Vise et bilde

Nå som vi har tegnet noe på bildet vårt, vil vi gjerne vise det. Vi kan gjøre det ved hjelp av Swing-bibliotekobjekter. Først skaper vi JLabel objekt som representerer et visningsområde for tekst eller / og bilde:

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

Legg deretter til vår JLabel til JPanel, som vi kan behandle som av Java-basert GUI:

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

Til slutt legger vi alt til JFrame som vises på et skjermbilde. Vi må stille inn størrelse slik at vi ikke trenger å utvide dette vinduet hver gang vi kjører programmet vårt:

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

3. ImageJ

ImageJ er en Java-basert programvare laget for å jobbe med bilder. Den har ganske mange plugins, tilgjengelig her. Vi bruker bare API, ettersom vi ønsker å utføre behandling selv.

Det er et ganske kraftig bibliotek, bedre enn Swing og AWT, da formålet med opprettelsen var bildebehandling og ikke GUI-operasjoner. Plugins inneholder mange gratis algoritmer, noe som er bra når vi ønsker å lære bildebehandling og raskt se resultatene, i stedet for å løse matte- og optimaliseringsproblemer under IP-algoritmer.

3.1. Maven avhengighet

For å begynne å jobbe med ImageJ, kan du bare legge til en avhengighet i prosjektets pom.xml fil:

 net.imagej ij 1.51h 

Du finner den nyeste versjonen i Maven-arkivet.

3.2. Laster inn et bilde

For å laste inn bildet, må du bruke openImage () statisk metode, fra IJ klasse:

ImagePlus imp = IJ.openImage ("sti / til / din / image.jpg");

3.3. Redigere et bilde

For å redigere et bilde, må vi bruke metoder fra ImageProcessor objekt festet til vårt ImagePlus gjenstand. Tenk på det som om Grafikk objekt i AWT:

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

3.4. Vise et bilde

Du trenger bare å ringe vise fram() Metode av ImagePlus gjenstand:

imp.show ();

4. Åpne IMAJ

OpenIMAJ er sett med Java-biblioteker som ikke bare fokuserer på datasyn og videobehandling, men også maskinlæring, lydbehandling, samarbeid med Hadoop og mye mer. Alle delene av OpenIMAJ-prosjektet finner du her, under "Moduler." Vi trenger bare bildebehandlingsdelen.

4.1. Maven avhengighet

For å begynne å jobbe med OpenIMAJ, bare legg til en avhengighet til prosjektets pom.xml fil:

 org.openimaj kjernebilde 1.3.5 

Du finner den siste utgivelsen her.

4.1. Laster inn et bilde

Bruk for å laste inn et bilde ImageUtilities.readMBF () metode:

MBFImage image = ImageUtilities.readMBF (ny fil ("sti / til / din / image.jpg")); 

MBF står for multiband floating-point image (RGB i dette eksemplet, men det er ikke den eneste måten å representere farger på).

4.2. Redigere et bilde

For å tegne rektangelet, må vi definere formen som er polygon bestående av 4 punkter (øverst til venstre, nederst til venstre, nederst til høyre, øverst til høyre):

Point2d tl = ny Point2dImpl (10, 10); Point2d bl = ny Point2dImpl (10, image.getHeight () - 10); Point2d br = ny Point2dImpl (image.getWidth () - 10, image.getHeight () - 10); Point2d tr = ny Point2dImpl (image.getWidth () - 10, 10); Polygon polygon = ny polygon (Arrays.asList (tl, bl, br, tr));

Som du kanskje har lagt merke til, blir Y-aksen reversert i bildebehandlingen. Etter å ha definert formen, må vi tegne den:

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

Tegningsmetoden tar 3 argumenter: form, linjetykkelse og RGB-kanalverdier representert av Flyte array.

4.3. Vise et bilde

Vi må bruke DisplayUtilities:

DisplayUtilities.display (bilde);

5. TwelveMonkeysImageIO

De TwelveMonkeysImageIO biblioteket er ment som en utvidelse av Java ImageIO API, med støtte for et større antall formater.

Mesteparten av tiden vil koden se ut som den innebygde Java-koden, men den vil fungere med flere bildeformater etter å ha lagt til de nødvendige avhengighetene.

Som standard støtter Java bare disse fem formatene for bilder: JPEG, PNG, BMP, WEBMP, GIF.

Hvis vi prøver å jobbe med en bildefil i et annet format, vil ikke søknaden vår kunne lese den og kaste et NullPointerException når du får tilgang til BufferedImage variabel.

TwelveMonkeys legger til støtte for følgende formater: PNM, PSD, TIFF, HDR, IFF, PCX, PICT, SGI, TGA, ICNS, ICO, CUR, Tommelen.db, SVG, WMF.

For å jobbe med bilder i et bestemt format, må vi legge til den tilsvarende avhengigheten, for eksempel imageio-jpeg eller imageio-tiff.

Du finner den komplette listen over avhengigheter i TwelveMonkeys-dokumentasjonen.

La oss lage et eksempel som leser a .ico bilde. Koden vil se ut som AWT delen, bortsett fra at vi åpner et annet bilde:

String imagePath = "sti / til / din / image.ico"; BufferedImage myPicture = ImageIO.read (ny fil (imagePath));

For at dette eksemplet skal fungere, må vi legge til TwelveMonkeys avhengighet som inneholder støtte for .ico bilder, som er imageio-bmp avhengighet, sammen med imageio-core avhengighet:

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

Og dette er alt! Den innebygde ImageIO Java API laster pluginene automatisk ved kjøretid. Nå skal prosjektet vårt jobbe med .ico bilder også.

6. Sammendrag

Du har blitt introdusert for fire biblioteker som kan hjelpe deg med å jobbe med bilder. Hvis du går lenger, vil du kanskje se etter noen bildebehandlingsalgoritmer, som å trekke ut kanter, forbedre kontrasten, bruke filtre eller ansiktsgjenkjenning.

For disse formålene kan det være bedre å begynne å lære ImageJ eller OpenIMAJ. Begge er enkle å ta med i et prosjekt og er mye kraftigere enn AWT når det gjelder bildebehandling.

Disse eksemplene på bildebehandling finner du i GitHub-prosjektet.