Rad sa slikama na Javi

1. Pregled

U ovom uputstvu ćemo pogledati nekoliko dostupnih knjižnica za obradu slika i izvršiti jednostavnu operaciju obrade slika - učitavanje slike i crtanje oblika na njoj.

Isprobat ćemo knjižnicu AWT (i malo Swinga), ImageJ, OpenIMAJ i TwelveMonkeys.

2. AWT

AWT je ugrađena Java knjižnica koja korisniku omogućuje izvođenje jednostavnih operacija povezanih s prikazom, poput stvaranja prozora, definiranja gumba i slušatelja i tako dalje. Također uključuje metode koje omogućuju korisniku uređivanje slika. Ne zahtijeva instalaciju jer se isporučuje s Javom.

2.1. Učitavanje slike

Prva stvar je stvoriti Slika u baferu objekt sa slike spremljene na našem diskovnom pogonu:

String imagePath = "put / do / vašeg / image.jpg"; BufferedImage myPicture = ImageIO.read (nova datoteka (imagePath)); 

2.2. Uređivanje slike

Da bismo nacrtali oblik na slici, morat ćemo upotrijebiti Grafika objekt povezan s učitanom slikom. Grafika objekt enkapsulira svojstva potrebna za izvođenje osnovnih operacija prikazivanja. Grafika2D je nastava koja se produžuje Grafika. Pruža veću kontrolu nad dvodimenzionalnim oblicima.

U ovom konkretnom slučaju trebamo Graphic2D proširiti širinu oblika kako bi bio jasno vidljiv. Postižemo ga povećavanjem njegovog stroke imovine. Zatim postavimo boju i nacrtamo pravokutnik na takav način da će oblik biti deset px od granica slike:

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

2.3. Prikazivanje slike

Sad kad smo nešto nacrtali na svojoj slici, željeli bismo to prikazati. To možemo pomoću objekata Swing knjižnice. Prvo, mi stvaramo JLabel objekt koji predstavlja područje prikaza za tekst ili / i sliku:

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

Zatim dodajte naše JLabel do JPanel, što možemo tretirati kao GUI-a temeljenog na Javi:

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

Na kraju sve dodamo JFrame koji je prozor prikazan na ekranu. Moramo postaviti veličinu kako ne bismo morali proširiti ovaj prozor svaki put kad pokrenemo naš program:

JFrame f = novi JFrame (); f.setSize (nova dimenzija (myPicture.getWidth (), myPicture.getHeight ())); f.add (jPanel); f.setVisible (true);

3. ImageJ

ImageJ je softver zasnovan na Javi stvoren za rad sa slikama. Ovdje ima dosta dodataka. Koristit ćemo samo API, jer obradu želimo izvršiti sami.

Prilično je moćna knjižnica, bolja od Swinga i AWT-a, jer je svrha stvaranja bila obrada slika, a ne GUI rad. Dodaci sadrže mnogo algoritama slobodnih za upotrebu, što je dobra stvar kada želimo naučiti obradu slika i brzo vidjeti rezultate, umjesto da rješavamo probleme matematike i optimizacije koji se postavljaju pod IP algoritme.

3.1. Ovisnost Mavena

Da biste započeli rad s ImageJ-om, jednostavno dodajte ovisnost u svoj projekt pom.xml datoteka:

 net.imagej ij 1,51h 

Najnoviju verziju pronaći ćete u spremištu Maven.

3.2. Učitavanje slike

Da biste učitali sliku, morate upotrijebiti openImage () statička metoda, od I J razred:

ImagePlus imp = IJ.openImage ("put / do / vašeg / image.jpg");

3.3. Uređivanje slike

Da bismo uredili sliku, morat ćemo se poslužiti metodama iz Procesor slike objekt vezan za naš ImagePlus objekt. Mislite o tome kao o Grafika objekt u AWT:

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

3.4. Prikazivanje slike

Trebate samo nazvati pokazati() metoda ImagePlus objekt:

imp.show ();

4. OtvoriteIMAJ

OpenIMAJ je skup Java knjižnica usmjerenih ne samo na računalni vid i obradu video zapisa, već i na strojno učenje, obradu zvuka, rad s Hadoopom i još mnogo toga. Svi dijelovi projekta OpenIMAJ mogu se naći ovdje, pod „Moduli“. Trebamo samo dio za obradu slike.

4.1. Ovisnost Mavena

Da biste započeli rad s OpenIMAJ-om, jednostavno dodajte ovisnost u svoj projekt pom.xml datoteka:

 org.openimaj core-image 1.3.5 

Najnovije izdanje pronaći ćete ovdje.

4.1. Učitavanje slike

Da biste učitali sliku, upotrijebite ImageUtilities.readMBF () metoda:

MBFImage image = ImageUtilities.readMBF (nova datoteka ("put / do / vašeg / image.jpg")); 

MBF je skraćenica za multiband sliku s pokretnom zarezom (RGB u ovom primjeru, ali to nije jedini način predstavljanja boja).

4.2. Uređivanje slike

Da bismo nacrtali pravokutnik, moramo definirati njegov oblik koji je poligon koji se sastoji od 4 točke (gore lijevo, dolje lijevo, dolje desno, gore desno):

Point2d tl = nova Point2dImpl (10, 10); Point2d bl = novi Point2dImpl (10, image.getHeight () - 10); Point2d br = novi Point2dImpl (image.getWidth () - 10, image.getHeight () - 10); Point2d tr = novi Point2dImpl (image.getWidth () - 10, 10); Poligon poligon = novi Poligon (Arrays.asList (tl, bl, br, tr));

Kao što ste mogli primijetiti, u obradi slika Y-os je obrnuta. Nakon definiranja oblika, trebamo ga nacrtati:

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

Način crtanja uzima 3 argumenta: oblik, debljinu linije i vrijednosti RGB kanala predstavljene s Plutati niz.

4.3. Prikazivanje slike

Moramo koristiti DisplayUtilities:

DisplayUtilities.display (slika);

5. Dvanaest majmunaImageIO

The Dvanaest majmunaImageIO Biblioteka je zamišljena kao proširenje Jave ImageIO API, s podrškom za veći broj formata.

Kôd će većinu vremena izgledati isto kao i ugrađeni Java kôd, ali funkcionirat će s dodatnim formatima slika, nakon dodavanja potrebnih ovisnosti.

Prema zadanim postavkama Java podržava samo ovih pet formata za slike: JPEG, PNG, BMP, WEBMP, GIF.

Ako pokušamo raditi sa slikovnom datotekom u drugom formatu, naša aplikacija neće je moći pročitati i bacit će datoteku NullPointerException pri pristupu Slika u baferu varijabilna.

Dvanaest majmuna dodaje podršku za sljedeće formate: PNM, PSD, TIFF, HDR, IFF, PCX, SLIKA, SGI, TGA, ICNS, ICO, CUR, Palac.db, SVG, WMF.

Da bismo radili sa slikama u određenom formatu, moramo dodati odgovarajuću ovisnost, kao što su imageio-jpeg ili imageio-tiff.

Cjelovit popis ovisnosti možete pronaći u dokumentaciji TwelveMonkeys.

Stvorimo primjer koji glasi a .ico slika. Kôd će izgledati isto kao i AWT odjeljak, osim što ćemo otvoriti drugu sliku:

String imagePath = "put / do / vašeg / image.ico"; BufferedImage myPicture = ImageIO.read (nova datoteka (imagePath));

Da bi ovaj primjer radio, moramo dodati Dvanaest majmuna ovisnost koja sadrži podršku za .ico images, što je ovisnost o imageio-bmp-u, zajedno s ovisnošću o imageio-core-u:

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

I ovo je sve! Ugrađeni ImageIO Java API učitava dodatke automatski tijekom izvođenja. Sada će naš projekt surađivati .ico slike također.

6. Sažetak

Upoznali ste se s 4 knjižnice koje vam mogu pomoći u radu sa slikama. Ako idete dalje, možda ćete htjeti potražiti neke algoritme za obradu slike, poput izdvajanja rubova, pojačavanja kontrasta, korištenjem filtara ili prepoznavanja lica.

U te svrhe, možda bi bilo bolje započeti s učenjem ImageJ ili OpenIMAJ. Oboje je lako uključiti u projekt, a mnogo su snažniji od AWT-a u pogledu obrade slike.

Ovi primjeri obrade slika mogu se naći u projektu GitHub.