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. Редактиране на изображение
За да нарисуваме фигура върху изображение, ще трябва да използваме графичен обект, свързан с заредено изображение. Графичният обект капсулира свойства, необходими за извършване на основни операции по изобразяване. Graphics2D е клас, разширяващ Graphics . Той осигурява по-голям контрол върху двуизмерните форми.
В този конкретен случай се нуждаем от Graphic2D, за да разширим ширината на формата, за да стане ясно видима. Постигаме го чрез увеличаване на свойството му s troke . След това задаваме цвят и изчертаваме правоъгълник по такъв начин, че формата да бъде на десет px от границите на изображението:
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-базиран GUI:
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, тъй като целта й за създаване е обработката на изображения, а не GUI операциите. Приставките съдържат много безплатни за използване алгоритми, което е хубаво, когато искаме да научим обработката на изображения и бързо да видим резултатите, вместо да решаваме математически и оптимизационни проблеми, полагани под IP алгоритми.
3.1. Зависимост на Maven
За да започнете да работите с ImageJ, просто добавете зависимост към файла pom.xml на вашия проект :
net.imagej ij 1.51h
Ще намерите най-новата версия в хранилището на Maven.
3.2. Зареждане на изображение
За да заредите изображението, трябва да използвате статичния метод openImage () от клас IJ :
ImagePlus imp = IJ.openImage("path/to/your/image.jpg");
3.3. Редактиране на изображение
За да редактираме изображение, ще трябва да използваме методи от обекта ImageProcessor, прикрепен към нашия обект 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 () на обекта ImagePlus :
imp.show();
4. OpenIMAJ
OpenIMAJ е набор от Java библиотеки, фокусирани не само върху компютърно зрение и обработка на видео, но също така и върху машинно обучение, обработка на аудио, работа с Hadoop и много други. Всички части на проекта OpenIMAJ можете да намерите тук, под „Модули“. Нуждаем се само от частта за обработка на изображения.
4.1. Зависимост на Maven
За да започнете да работите с OpenIMAJ, просто добавете зависимост към файла pom.xml на вашия проект :
org.openimaj core-image 1.3.5
Тук ще намерите най-новата версия.
4.1. Зареждане на изображение
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
Запознахте се с 4 библиотеки, които могат да ви помогнат да работите с изображения. Продължавайки напред, може да потърсите някои алгоритми за обработка на изображения, като извличане на ръбове, подобряване на контраста, използване на филтри или разпознаване на лица.
За тези цели може би е по-добре да започнете да изучавате ImageJ или OpenIMAJ. И двете са лесни за включване в проект и са много по-мощни от AWT по отношение на обработката на изображения.
Тези примери за обработка на изображения могат да бъдат намерени в проекта GitHub.