Перейти к основному содержимому

Работа с изображениями в Java

· 6 мин. чтения

1. Обзор

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

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

2. АВТ

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 расширил ширину формы, чтобы сделать ее четко видимой. Мы достигаем этого, увеличивая свойство s troke . Затем мы задаем цвет и рисуем прямоугольник таким образом, чтобы фигура находилась в десяти пикселях от границ изображения:

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 , который мы можем рассматривать как <div></div> графического интерфейса на основе 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. ИзображениеJ

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

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

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

<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 :

DisplayUtilities.display(image);

5. Двенадцать обезьян 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 .

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

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

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

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

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

6. Резюме

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

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

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