Bekerja dengan Imej di Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat beberapa perpustakaan pemprosesan gambar yang tersedia, dan melakukan operasi pemprosesan gambar yang mudah - memuatkan gambar dan melukis bentuk di atasnya.

Kami akan mencuba perpustakaan AWT (dan sedikit Swing), ImageJ, OpenIMAJ, dan TwelveMonkeys.

2. AWT

AWT adalah perpustakaan Java bawaan yang membolehkan pengguna melakukan operasi mudah yang berkaitan dengan paparan, seperti membuat tetingkap, menentukan butang dan pendengar dan sebagainya. Ini juga merangkumi kaedah yang membolehkan pengguna mengedit gambar. Ia tidak memerlukan pemasangan kerana dihantar dengan Java.

2.1. Memuatkan Imej

Perkara pertama adalah membuat objek BufferedImage dari gambar yang disimpan di pemacu cakera kami:

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

2.2. Menyunting Imej

Untuk melukis bentuk pada gambar, kita harus menggunakan objek Grafik yang berkaitan dengan gambar yang dimuat. Objek grafik merangkumi sifat yang diperlukan untuk melakukan operasi rendering asas. Graphics2D adalah kelas memperluas Grafik . Ia memberikan lebih banyak kawalan terhadap bentuk dua dimensi.

Dalam kes ini, kita memerlukan Graphic2D untuk memanjangkan lebar bentuk agar dapat dilihat dengan jelas. Kami mencapainya dengan menambah harta troke . Kemudian kami menetapkan warna, dan melukis sebuah segi empat tepat sehingga bentuknya akan sepuluh px dari sempadan gambar:

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. Memaparkan Gambar

Sekarang setelah kami melukis sesuatu pada gambar kami, kami ingin memaparkannya. Kita boleh melakukannya dengan menggunakan objek perpustakaan Swing. Pertama, kami membuat objek JLabel yang mewakili kawasan paparan untuk teks atau / dan gambar:

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

Kemudian tambahkan JLabel kami ke JPanel , yang boleh kami anggap sebagai GUI berasaskan Java:

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

Pada akhirnya, kami menambahkan segalanya ke JFrame yang merupakan tetingkap yang dipaparkan di skrin. Kita harus menetapkan ukuran supaya kita tidak perlu memperluas tetingkap ini setiap kali kita menjalankan program kita:

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

3. GambarJ

ImageJ adalah perisian berasaskan Java yang dibuat untuk bekerja dengan gambar. Ia mempunyai banyak plugin yang terdapat di sini. Kami akan menggunakan API sahaja, kerana kami ingin melakukan pemprosesan oleh kami sendiri.

Perpustakaan ini cukup hebat, lebih baik daripada Swing dan AWT, kerana tujuan penciptaannya adalah pemprosesan gambar dan bukan operasi GUI. Plugin mengandungi banyak algoritma bebas untuk digunakan, yang merupakan kebaikan apabila kita ingin belajar memproses gambar dan melihat hasilnya dengan cepat, daripada menyelesaikan masalah matematik dan pengoptimuman yang terdapat di bawah algoritma IP.

3.1. Ketergantungan Maven

Untuk mula bekerja dengan ImageJ, cukup tambahkan kebergantungan pada fail pom.xml projek anda :

 net.imagej ij 1.51h 

Anda akan menemui versi terbaru di repositori Maven.

3.2. Memuatkan Imej

Untuk memuatkan gambar, anda perlu menggunakan kaedah statik openImage () , dari kelas IJ :

ImagePlus imp = IJ.openImage("path/to/your/image.jpg");

3.3. Menyunting Imej

Untuk mengedit imej, kita perlu menggunakan kaedah dari ImageProcessor objek dilampirkan kepada kami ImagePlus objek. Fikirkan tentang objek Grafik di AWT:

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

3.4. Memaparkan Gambar

Anda hanya perlu memanggil kaedah menunjukkan () objek ImagePlus :

imp.show();

4. OpenIMAJ

OpenIMAJ adalah sekumpulan perpustakaan Java yang tidak hanya tertumpu pada penglihatan komputer dan pemprosesan video tetapi juga pembelajaran mesin, pemprosesan audio, bekerja dengan Hadoop dan banyak lagi. Semua bahagian projek OpenIMAJ boleh didapati di sini, di bawah "Modul." Kami hanya memerlukan bahagian pemprosesan gambar.

4.1. Ketergantungan Maven

Untuk mula bekerja dengan OpenIMAJ, cukup tambahkan kebergantungan pada fail pom.xml projek anda :

 org.openimaj core-image 1.3.5 

Anda akan mendapat siaran terbaru di sini.

4.1. Memuatkan Imej

To load an image, use ImageUtilities.readMBF() method:

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

MBF stands for the multiband floating-point image (RGB in this example, but it's not the only way to represent colors).

4.2. Editing an Image

To draw the rectangle, we need to define its shape which is polygon consisting of 4 points (top left, bottom left, bottom right, top right):

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

As you might have noticed, in image processing Y-axis is reversed. After defining the shape, we need to draw it:

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

Drawing method takes 3 arguments: shape, line thickness and RGB channel values represented by Float array.

4.3. Displaying an Image

We need to use DisplayUtilities:

DisplayUtilities.display(image);

5. TwelveMonkeysImageIO

The TwelveMonkeysImageIO library is intended as an extension to the Java ImageIO API, with support for a larger number of formats.

Most of the time, the code will look the same as the built-in Java code, but it will function with additional image formats, after adding the necessary dependencies.

By default, Java supports only these five formats for images: JPEG, PNG, BMP, WEBMP, GIF.

If we attempt to work with an image file in a different format, our application will not be able to read it and will throw a NullPointerException when accessing the BufferedImage variable.

TwelveMonkeys adds supports for the following formats: 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, such as imageio-jpeg or imageio-tiff.

You can find the full list of dependencies in the TwelveMonkeys documentation.

Let's create an example that reads a .ico image. The code will look the same as the AWT section, except we will open a different image:

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

For this example to work, we need to add the TwelveMonkeys dependency that contains support for .ico images, which is the imageio-bmp dependency, along with the imageio-core dependency:

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

And this is all! The built-in ImageIO Java API loads the plugins automatically at runtime. Now our project will work with .ico images as well.

6. Summary

Anda telah diperkenalkan dengan 4 perpustakaan yang dapat membantu anda bekerja dengan gambar. Melangkah lebih jauh, anda mungkin ingin mencari beberapa algoritma pemprosesan gambar, seperti mengekstrak tepi, meningkatkan kontras, menggunakan penapis atau pengesanan wajah.

Untuk tujuan tersebut, mungkin lebih baik memulakan pembelajaran ImageJ atau OpenIMAJ. Kedua-duanya mudah disertakan dalam projek dan jauh lebih hebat daripada AWT mengenai pemprosesan gambar.

Contoh pemprosesan gambar ini boleh didapati dalam projek GitHub.