«1. Обзор

В этом уроке мы рассмотрим несколько доступных библиотек обработки изображений и выполним простую операцию обработки изображений — загрузим изображение и нарисуем на нем фигуру.

Мы попробуем библиотеку AWT (и немного Swing), ImageJ, OpenIMAJ и TwelveMonkeys.

2. AWT

AWT — это встроенная библиотека Java, которая позволяет пользователю выполнять простые операции, связанные с отображением, такие как создание окна, определение кнопок и слушателей и т.д. Он также включает методы, позволяющие пользователю редактировать изображения. Он не требует установки, так как поставляется с Java.

2.1. Загрузка изображения

Первым делом необходимо создать объект BufferedImage из изображения, сохраненного на нашем диске:

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

2.2. Редактирование изображения

Чтобы нарисовать фигуру на изображении, нам придется использовать объект Graphics, связанный с загруженным изображением. Графический объект инкапсулирует свойства, необходимые для выполнения основных операций рендеринга. Graphics2D — это класс, расширяющий Graphics. Это обеспечивает больший контроль над двумерными формами.

В этом конкретном случае нам нужно, чтобы Graphic2D расширил ширину фигуры, чтобы сделать ее четко видимой. Мы достигаем этого, увеличивая свойство штриха. Затем задаем цвет и рисуем прямоугольник так, чтобы фигура находилась в десяти пикселях от границ изображения:

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. Отображение изображения

Теперь, когда мы что-то нарисовали на нашем изображении, мы хотели бы отобразить это. Мы можем сделать это, используя объекты библиотеки Swing. Во-первых, мы создаем объект JLabel, который представляет область отображения для текста и/или изображения:

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

Затем добавляем наш JLabel в JPanel, который мы можем рассматривать как \u003cdiv\u003e\u003c/div\u003e графического интерфейса на основе Java:

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

В конце мы добавляем в JFrame все, что представляет собой окно, отображаемое на экране. Мы должны установить размер, чтобы нам не приходилось расширять это окно каждый раз, когда мы запускаем нашу программу:

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

3. ImageJ

ImageJ — это программа на основе Java, созданная для работы с изображениями. Он имеет довольно много плагинов, доступных здесь. Мы будем использовать только API, так как хотим выполнять обработку самостоятельно.

Это довольно мощная библиотека, лучше, чем Swing и AWT, так как целью ее создания была обработка изображений, а не операции с графическим интерфейсом. Плагины содержат множество бесплатных алгоритмов, что хорошо, когда мы хотим научиться обрабатывать изображения и быстро увидеть результаты, а не решать математические и оптимизационные задачи, лежащие в основе алгоритмов IP.

3.1. Зависимость Maven

Чтобы начать работу с ImageJ, просто добавьте зависимость в файл pom.xml вашего проекта:

<dependency>
    <groupId>net.imagej</groupId>
    <artifactId>ij</artifactId>
    <version>1.51h</version>
</dependency>

Самая новая версия находится в репозитории Maven.

3.2. Загрузка изображения

Чтобы загрузить изображение, вам нужно использовать статический метод openImage() из класса IJ:

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

3.3. Редактирование изображения

Чтобы отредактировать изображение, нам придется использовать методы объекта ImageProcessor, прикрепленного к нашему объекту ImagePlus. Думайте об этом как об объекте Graphics в AWT:

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

3.4. Отображение изображения

Вам нужно только вызвать метод show() объекта ImagePlus:

imp.show();

4. OpenIMAJ

OpenIMAJ — это набор библиотек Java, ориентированных не только на компьютерное зрение и обработку видео, но и на машинное обучение. , обработка звука, работа с Hadoop и многое другое. Все части проекта OpenIMAJ можно найти здесь, в разделе «Модули». Нам нужна только часть обработки изображений.

4.1. Зависимость Maven

Чтобы начать работу с OpenIMAJ, просто добавьте зависимость в файл \u003cem\u003epom.xml\u003c/em\u003e вашего проекта:

<dependency>
    <groupId>org.openimaj</groupId>
    <artifactId>core-image</artifactId>
    <version>1.3.5</version>
</dependency>

Здесь вы найдете последнюю версию.

4.1. Загрузка изображения

Чтобы загрузить изображение, используйте метод ImageUtilities.readMBF():

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

MBF означает многоканальное изображение с плавающей запятой (в данном примере это RGB, но это не единственный способ представления цветов) .

4.2. Редактирование изображения

Чтобы нарисовать прямоугольник, нам нужно определить его форму, которая представляет собой многоугольник, состоящий из 4 точек (вверху слева, внизу слева, внизу справа, вверху справа):

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

Как вы могли заметить, при обработке изображений ось Y переворачивается. После определения формы нам нужно ее нарисовать:

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

«

«Метод рисования принимает 3 аргумента: форму, толщину линии и значения канала RGB, представленные массивом с плавающей запятой.

4.3. Отображение изображения

DisplayUtilities.display(image);

Нам нужно использовать DisplayUtilities:

5. TwelveMonkeys ImageIO

Библиотека TwelveMonkeys ImageIO задумана как расширение Java ImageIO API с поддержкой большего количества форматов.

Большую часть времени код будет выглядеть так же, как встроенный код Java, но он будет работать с дополнительными форматами изображений после добавления необходимых зависимостей.

По умолчанию Java поддерживает только эти пять форматов изображений: JPEG, PNG, BMP, WEBMP, GIF.

Если мы попытаемся работать с файлом изображения в другом формате, наше приложение не сможет его прочитать и выдаст исключение NullPointerException при доступе к переменной BufferedImage.

TwelveMonkeys поддерживает следующие форматы: PNM, PSD, TIFF, HDR, IFF, PCX, PICT, SGI, TGA, ICNS, ICO, CUR, Thumbs.db, SVG, WMF.

Для работы с изображениями в определенном формате нам нужно добавить соответствующую зависимость, например, imageio-jpeg или imageio-tiff.

Полный список зависимостей можно найти в документации TwelveMonkeys.

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

Давайте создадим пример, который читает изображение .ico. Код будет выглядеть так же, как и в разделе AWT, за исключением того, что мы откроем другое изображение:

<dependency>
    <groupId>com.twelvemonkeys.imageio</groupId>
    <artifactId>imageio-bmp</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>com.twelvemonkeys.imageio</groupId>
    <artifactId>imageio-core</artifactId>
    <version>3.3.2</version>
</dependency>

Чтобы этот пример работал, нам нужно добавить зависимость TwelveMonkeys, которая содержит поддержку изображений .ico, то есть imageio зависимость -bmp вместе с зависимостью imageio-core:

И это все! Встроенный Java-API ImageIO автоматически загружает плагины во время выполнения. Теперь наш проект будет работать и с изображениями .ico.

6. Резюме

Вы познакомились с 4 библиотеками, которые помогут вам работать с изображениями. Идя дальше, вы можете поискать некоторые алгоритмы обработки изображений, такие как извлечение краев, усиление контраста, использование фильтров или распознавание лиц.

Для этих целей лучше начать изучать ImageJ или OpenIMAJ. Обе программы легко включить в проект, и они намного мощнее AWT в отношении обработки изображений.

Эти примеры обработки изображений можно найти в проекте GitHub.