Arbejde med billeder i Java

1. Oversigt

I denne vejledning skal vi se på et par tilgængelige billedbehandlingsbiblioteker og udføre enkel billedbehandlingsoperation - indlæse et billede og tegne en form på det.

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

2. AWT

AWT er et indbygget Java-bibliotek, der giver brugeren mulighed for at udføre enkle handlinger relateret til visning, som at oprette et vindue, definere knapper og lyttere og så videre. Det inkluderer også metoder, der giver brugeren mulighed for at redigere billeder. Det kræver ikke installation, da det leveres med Java.

2.1. Indlæser et billede

Den første ting er at oprette en BufferedImage objekt fra et billede gemt på vores diskdrev:

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

2.2. Redigering af et billede

For at tegne en form på et billede bliver vi nødt til at bruge Grafik objekt relateret til indlæst billede. Grafik objekt indkapsler egenskaber, der er nødvendige for at udføre grundlæggende gengivelsesoperationer. Grafik2D er en klasse, der udvides Grafik. Det giver mere kontrol over to-dimensionelle former.

I dette særlige tilfælde har vi brug for det Grafisk2D at udvide formbredden for at gøre det tydeligt synligt. Vi opnår det ved at øge dets stroke ejendom. Derefter indstiller vi en farve og tegner et rektangel på en sådan måde, at formen er ti px fra billedkanterne:

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. Visning af et billede

Nu hvor vi har tegnet noget på vores billede, vil vi gerne vise det. Vi kan gøre det ved hjælp af Swing-biblioteksobjekter. Først opretter vi JLabel objekt, der repræsenterer et visningsområde for tekst eller billed:

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

Tilføj derefter vores JLabel til JPanel, som vi kan behandle som af Java-baseret GUI:

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

I sidste ende tilføjer vi alt til JFrame hvilket vindue vises på en skærm. Vi skal indstille størrelse, så vi ikke behøver at udvide dette vindue hver gang vi kører vores program:

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

3. ImageJ

ImageJ er en Java-baseret software oprettet til at arbejde med billeder. Det har en hel del plugins, der er tilgængelige her. Vi bruger kun API, da vi selv ønsker at udføre behandling.

Det er et meget kraftfuldt bibliotek, bedre end Swing og AWT, da dets oprettelsesformål var billedbehandling og ikke GUI-operationer. Plugins indeholder mange gratis algoritmer, der er gratis, hvilket er en god ting, når vi vil lære billedbehandling og hurtigt se resultaterne i stedet for at løse matematiske og optimeringsproblemer, der ligger under IP-algoritmer.

3.1. Maven afhængighed

For at begynde at arbejde med ImageJ skal du blot tilføje en afhængighed af dit projekts pom.xml fil:

 net.imagej ij 1.51h 

Du finder den nyeste version i Maven-arkivet.

3.2. Indlæser et billede

For at indlæse billedet skal du bruge openImage () statisk metode, fra IJ klasse:

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

3.3. Redigering af et billede

For at redigere et billede skal vi bruge metoder fra ImageProcessor objekt knyttet til vores ImagePlus objekt. Tænk på det som om Grafik 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. Visning af et billede

Du skal kun ringe at vise() metode til ImagePlus objekt:

imp.show ();

4. Åbn IMAJ

OpenIMAJ er et sæt Java-biblioteker, der ikke kun fokuserer på computersyn og videobehandling, men også maskinindlæring, lydbehandling, arbejde med Hadoop og meget mere. Alle dele af OpenIMAJ-projektet kan findes her under "Moduler". Vi har kun brug for billedbehandlingsdelen.

4.1. Maven afhængighed

For at begynde at arbejde med OpenIMAJ skal du blot tilføje en afhængighed af dit projekts pom.xml fil:

 org.openimaj kernebillede 1.3.5 

Du finder den seneste udgivelse her.

4.1. Indlæser et billede

Brug for at indlæse et billede ImageUtilities.readMBF () metode:

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

MBF står for multiband floating-point-billedet (RGB i dette eksempel, men det er ikke den eneste måde at repræsentere farver på).

4.2. Redigering af et billede

For at tegne rektanglet skal vi definere dens form, som er polygon bestående af 4 punkter (øverst til venstre, nederst til venstre, nederst til højre, øverst til højre):

Punkt2d tl = ny Punkt2dImpl (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 måske har bemærket, vendes Y-aksen i billedbehandling. Efter at have defineret formen skal vi tegne den:

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

Tegningsmetode tager 3 argumenter: form, linjetykkelse og RGB-kanalværdier repræsenteret af Flyde array.

4.3. Visning af et billede

Vi er nødt til at bruge DisplayUtilities:

DisplayUtilities.display (billede);

5. TwelveMonkeysImageIO

Det TwelveMonkeysImageIO biblioteket er beregnet som en udvidelse til Java ImageIO API med understøttelse af et større antal formater.

Koden vil for det meste se ud som den indbyggede Java-kode, men den fungerer med yderligere billedformater efter tilføjelse af de nødvendige afhængigheder.

Som standard understøtter Java kun disse fem formater til billeder: JPEG, PNG, BMP, WEBMP, GIF.

Hvis vi forsøger at arbejde med en billedfil i et andet format, kan vores applikation ikke læse den og kaste et NullPointerException når du får adgang til BufferedImage variabel.

TwelveMonkeys tilføjer understøttelser til følgende formater: PNM, PSD, TIFF, HDR, IFF, PCX, PICT, SGI, TGA, ICNS, ICO, CUR, Tommelfinger.db, SVG, WMF.

For at arbejde med billeder i et specifikt format skal vi tilføje den tilsvarende afhængighed, såsom imageio-jpeg eller imageio-tiff.

Du kan finde den fulde liste over afhængigheder i TwelveMonkeys-dokumentationen.

Lad os oprette et eksempel, der læser en .ico billede. Koden ser ud som den AWT sektion, bortset fra at vi åbner et andet billede:

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

For at dette eksempel skal fungere, skal vi tilføje TwelveMonkeys afhængighed, der indeholder støtte til .ico billeder, som er imageio-bmp afhængighed sammen med imageio-core afhængighed:

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

Og det er alt! Den indbyggede ImageIO Java API indlæser plugins automatisk ved kørsel. Nu vil vores projekt arbejde med .ico billeder også.

6. Resume

Du er blevet introduceret til 4 biblioteker, der kan hjælpe dig med at arbejde med billeder. Hvis du går videre, vil du måske søge efter nogle billedbehandlingsalgoritmer, som at udtrække kanter, forbedre kontrast ved hjælp af filtre eller ansigtsgenkendelse.

Til disse formål kan det være bedre at begynde at lære ImageJ eller OpenIMAJ. Begge er lette at medtage i et projekt og er meget mere effektive end AWT med hensyn til billedbehandling.

Disse billedbehandlingseksempler kan findes i GitHub-projektet.