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

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

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, связанный с загруженным изображением. ОбъектGraphics инкапсулирует свойства, необходимые для выполнения основных операций визуализации. Graphics2D - это класс, расширяющийGraphics. Это обеспечивает больший контроль над двумерными формами.

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

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

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

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

3.1. Maven Dependency

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


    net.imagej
    ij
    1.51h

Вы найдете самую новую версию вMaven repository.

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 можно найтиhere в разделе «Модули». Нам нужна только часть обработки изображений.

4.1. Maven Dependency

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


    org.openimaj
    core-image
    1.3.5

Вы найдете последний выпускhere.

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, представленные массивомFloat.

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

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

DisplayUtilities.display(image);

5. TwelveMonkeysImageIO

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

В большинстве случаев код будет выглядеть так же, как встроенный код 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с.

To work with images in a specific format, we need to add the corresponding dependency, например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:


    com.twelvemonkeys.imageio
    imageio-bmp
    3.3.2


    com.twelvemonkeys.imageio
    imageio-core
    3.3.2

И это все! The built-in ImageIO Java API loads the plugins automatically at runtime. Теперь наш проект будет работать и с изображениями.ico.

6. Резюме

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

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

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