Bekerja dengan Gambar di Java

1. Ikhtisar

Dalam tutorial ini, kita akan melihat beberapa perpustakaan pemrosesan gambar yang tersedia, dan melakukan operasi pemrosesan gambar sederhana - memuat gambar dan menggambar bentuk di atasnya.

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

2. AWT

AWT adalah pustaka Java bawaan yang memungkinkan pengguna melakukan operasi sederhana yang terkait dengan tampilan, seperti membuat jendela, menentukan tombol dan pendengar, dan sebagainya. Ini juga mencakup metode yang memungkinkan pengguna untuk mengedit gambar. Itu tidak memerlukan instalasi karena dikirimkan dengan Java.

2.1. Memuat Gambar

Hal pertama adalah membuat objek BufferedImage dari gambar yang disimpan di drive disk kita:

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

2.2. Mengedit Gambar

Untuk menggambar bentuk pada gambar, kita harus menggunakan objek Grafik yang terkait dengan gambar yang dimuat. Objek grafik merangkum properti yang diperlukan untuk melakukan operasi rendering dasar. Graphics2D adalah kelas yang memperluas Grafik . Ini memberikan kontrol lebih besar atas bentuk dua dimensi.

Dalam kasus khusus ini, kita membutuhkan Graphic2D untuk memperluas lebar bentuk agar terlihat jelas. Kami mencapainya dengan meningkatkan properti s troke nya . Kemudian kami menetapkan warna, dan menggambar persegi panjang sedemikian rupa sehingga bentuknya akan menjadi sepuluh px dari batas 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. Menampilkan Gambar

Sekarang setelah kami menggambar sesuatu pada gambar kami, kami ingin menampilkannya. Kita bisa melakukannya dengan menggunakan objek library Swing. Pertama kita buat objek JLabel yang merepresentasikan area tampilan untuk teks atau / dan gambar:

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

Kemudian tambahkan JLabel kita ke JPanel , yang bisa kita perlakukan sebagai GUI berbasis Java:

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

Pada akhirnya, kami menambahkan semuanya ke JFrame yang merupakan jendela yang ditampilkan di layar. Kami harus mengatur ukuran sehingga kami tidak perlu memperluas jendela ini setiap kali kami menjalankan program kami:

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

3. ImageJ

ImageJ adalah perangkat lunak berbasis Java yang dibuat untuk bekerja dengan gambar. Plugin ini cukup banyak, tersedia disini. Kami hanya akan menggunakan API, karena kami ingin melakukan pemrosesan sendiri.

Ini adalah pustaka yang cukup kuat, lebih baik daripada Swing dan AWT, karena tujuan pembuatannya adalah pemrosesan gambar dan bukan operasi GUI. Plugin berisi banyak algoritma gratis untuk digunakan, yang merupakan hal yang baik ketika kita ingin mempelajari pemrosesan gambar dan dengan cepat melihat hasilnya, daripada menyelesaikan masalah matematika dan pengoptimalan yang diletakkan di bawah algoritma IP.

3.1. Ketergantungan Maven

Untuk mulai bekerja dengan ImageJ, cukup tambahkan dependensi ke file pom.xml proyek Anda :

 net.imagej ij 1.51h 

Anda akan menemukan versi terbaru di repositori Maven.

3.2. Memuat Gambar

Untuk memuat gambar, Anda perlu menggunakan metode statis openImage () , dari kelas IJ :

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

3.3. Mengedit Gambar

Untuk mengedit gambar, kita harus menggunakan metode dari objek ImageProcessor yang dilampirkan ke objek ImagePlus kami . Anggap saja seperti 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. Menampilkan Gambar

Anda hanya perlu memanggil metode show () dari objek ImagePlus :

imp.show();

4. OpenIMAJ

OpenIMAJ merupakan kumpulan pustaka Java yang difokuskan tidak hanya pada visi komputer dan pemrosesan video tetapi juga pembelajaran mesin, pemrosesan audio, bekerja dengan Hadoop dan banyak lagi. Semua bagian dari proyek OpenIMAJ dapat ditemukan di sini, di bawah "Modul". Kami hanya membutuhkan bagian pemrosesan gambar.

4.1. Ketergantungan Maven

Untuk mulai bekerja dengan OpenIMAJ, cukup tambahkan dependensi ke file pom.xml proyek Anda :

 org.openimaj core-image 1.3.5 

Anda akan menemukan rilis terbaru di sini.

4.1. Memuat Gambar

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 pustaka yang dapat membantu Anda bekerja dengan gambar. Lebih jauh lagi, Anda mungkin ingin mencari beberapa algoritma pemrosesan gambar, seperti mengekstrak tepi, meningkatkan kontras, menggunakan filter atau deteksi wajah.

Untuk tujuan tersebut, mungkin lebih baik untuk mulai mempelajari ImageJ atau OpenIMAJ. Keduanya mudah disertakan dalam proyek dan jauh lebih andal daripada AWT terkait pemrosesan gambar.

Contoh pemrosesan gambar ini dapat ditemukan di proyek GitHub.