1. Обзор
В этом уроке мы рассмотрим несколько доступных библиотек обработки изображений и выполним простую операцию обработки изображений – загрузим изображение и нарисуем на нем фигуру.
Мы попробуем МОКРУЮ (и немного качающуюся) библиотеку, ImageJ, OpenIMAJ и двенадцать обезьян.
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 . Он обеспечивает больший контроль над двумерными фигурами.
В данном конкретном случае нам нужно Graphic 2D расширить ширину фигуры, чтобы сделать ее четко видимой. Мы достигаем этого, увеличивая его свойство 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 , который мы можем рассматривать как графического интерфейса на основе 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 файл:
net.imagej ij 1.51h
Вы найдете самую новую версию в репозитории Maven .
3.2. Загрузка изображения
Чтобы загрузить изображение, вам нужно использовать метод open Image() static, из I J класс:
ImagePlus imp = IJ.openImage("path/to/your/image.jpg");
3.3. Редактирование изображения
Для редактирования изображения нам придется использовать методы из Image Processor object, прикрепленные к нашему ImagePlus объекту. Думайте об этом как о Графике объекте в 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() метод Image Plus object:
imp.show();
4. OpenIMAJ
OpenIMAJ – это набор библиотек Java, ориентированных не только на компьютерное зрение и обработку видео, но и на машинное обучение, обработку аудио, работу с Hadoop и многое другое. Все части проекта OpenIMAJ можно найти здесь в разделе “Модули.” Нам нужна только часть обработки изображений.
4.1. Зависимость Maven
Чтобы начать работу с OpenIMAJ, просто добавьте зависимость в вашего проекта pom.xml файл:
org.openimaj core-image 1.3.5
Вы найдете последнюю версию здесь .
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.display(image);
5. Изображение TwelveMonkeys
Библиотека TwelveMonkeys |/ImageIO предназначена для расширения Java ImageIO API, с поддержкой большего количества форматов.
В большинстве случаев код будет выглядеть так же, как и встроенный код Java, но он будет работать с дополнительными форматами изображений после добавления необходимых зависимостей.
По умолчанию Java поддерживает только эти пять форматов изображений: JPEG , PNG , BMP , WBMP , GIF .
Если мы попытаемся работать с файлом изображения в другом формате, наше приложение не сможет его прочитать и выдаст исключение NullPointerException при доступе к переменной BufferedImage .
Двенадцать обезьян добавляет поддержку следующих форматов: PNG , |/PSD , TIFF , HDR , TIFF , PCX , PICT , SGI , TGA , ICNS , ICO , CUR , Thumbs.db , SVG , WMF .
Для работы с изображениями в определенном формате нам необходимо добавить соответствующую зависимость , например imageio-jpeg или imageio-tiff .
Полный список зависимостей можно найти в документации Двенадцать обезьян .
Давайте создадим пример, который читает изображение .ico . Код будет выглядеть так же, как в разделе AWT , за исключением того, что мы откроем другое изображение:
String imagePath = "path/to/your/image.ico"; BufferedImage myPicture = ImageIO.read(new File(imagePath));
Чтобы этот пример работал, нам нужно добавить зависимость Двенадцать обезьян , которая содержит поддержку .icon images, которая является зависимостью imageio-bmp , вместе с зависимостью imageio-core :
com.twelvemonkeys.imageio imageio-bmp 3.3.2 com.twelvemonkeys.imageio imageio-core 3.3.2
И это все! Встроенный ImageIO Java API автоматически загружает плагины во время выполнения. Теперь наш проект будет работать и с изображениями .ico .
6. Резюме
Вы познакомились с 4 библиотеками, которые могут помочь вам работать с изображениями. Идя дальше, вы, возможно, захотите поискать некоторые алгоритмы обработки изображений, такие как извлечение краев, повышение контрастности, использование фильтров или распознавание лиц.
Для этих целей, возможно, было бы лучше начать изучать ImageJ или OpenIMAJ. Оба они легко включаются в проект и гораздо более мощны, чем AWT, в отношении обработки изображений.
Эти примеры обработки изображений можно найти в проекте GitHub .